Don't mount GIO devices automatically, instead put them in a "not mounted" state in the GUI and mount them when double-clicked on. Fixes issue #719. Probably fixes issue #723.

This commit is contained in:
David Sansome 2010-09-11 12:29:44 +00:00
parent 089159f009
commit c2ac3f8f32
42 changed files with 718 additions and 357 deletions

69
src/core/scopedgobject.h Normal file
View File

@ -0,0 +1,69 @@
/* This file is part of Clementine.
Clementine 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.
Clementine 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 Clementine. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef SCOPEDGOBJECT_H
#define SCOPEDGOBJECT_H
#include <glib-object.h>
#include <QtDebug>
template <typename T>
class ScopedGObject {
public:
ScopedGObject() : object_(NULL) {}
explicit ScopedGObject(const ScopedGObject& other) : object_(NULL) {
reset(other.object_);
}
~ScopedGObject() {
reset();
}
ScopedGObject& operator =(const ScopedGObject& other) {
reset(other.object_);
return *this;
}
void reset(T* new_object = NULL) {
if (new_object)
g_object_ref(new_object);
reset_without_add(new_object);
}
void reset_without_add(T* new_object = NULL) {
if (object_)
g_object_unref(object_);
object_ = new_object;
}
T* get() const { return object_; }
operator T*() const { return get(); }
T* operator *() const { return get(); }
operator bool() const { return get(); }
bool operator ==(const ScopedGObject& other) const {
return object_ == other.object_;
}
private:
T* object_;
};
#endif // SCOPEDGOBJECT_H

View File

@ -207,10 +207,15 @@ QStringList DeviceLister::GuessIconForPath(const QString& path) {
}
QStringList DeviceLister::GuessIconForModel(const QString& vendor, const QString& model) {
qDebug() << vendor << ":" << model;
QStringList ret;
if (vendor.startsWith("Google") && model.contains("Nexus")) {
ret << "phone-google-nexus-one";
}
return ret;
}
int DeviceLister::MountDevice(const QString& id) {
const int ret = next_mount_request_id_ ++;
emit DeviceMounted(id, ret, true);
return ret;
}

View File

@ -48,10 +48,15 @@ public:
virtual quint64 DeviceCapacity(const QString& id) = 0;
virtual quint64 DeviceFreeSpace(const QString& id) = 0;
virtual QVariantMap DeviceHardwareInfo(const QString& id) = 0;
virtual bool DeviceNeedsMount(const QString& id) { return false; }
virtual QString MakeFriendlyName(const QString& id) = 0;
virtual QList<QUrl> MakeDeviceUrls(const QString& id) = 0;
// Ensure the device is mounted. This should run asynchronously and emit
// DeviceMounted when it's done.
virtual int MountDevice(const QString& id);
// Do whatever needs to be done to safely remove the device.
virtual void UnmountDevice(const QString& id) = 0;
@ -63,6 +68,7 @@ signals:
void DeviceAdded(const QString& id);
void DeviceRemoved(const QString& id);
void DeviceChanged(const QString& id);
void DeviceMounted(const QString& id, int request_id, bool success);
protected:
virtual void Init() = 0;
@ -73,6 +79,7 @@ protected:
protected:
QThread* thread_;
int next_mount_request_id_;
private slots:
void ThreadStarted();

View File

@ -278,8 +278,11 @@ QVariant DeviceManager::data(const QModelIndex& index, int role) const {
case Role_State:
if (info.device_)
return State_Connected;
if (info.BestBackend()->lister_)
if (info.BestBackend()->lister_) {
if (info.BestBackend()->lister_->DeviceNeedsMount(info.BestBackend()->unique_id_))
return State_NotMounted;
return State_NotConnected;
}
return State_Remembered;
case Role_UpdatingPercentage:
@ -296,7 +299,8 @@ QVariant DeviceManager::data(const QModelIndex& index, int role) const {
case MusicStorage::Role_StorageForceConnect:
if (!info.device_) {
if (info.database_id_ == -1) {
if (info.database_id_ == -1 &&
!info.BestBackend()->lister_->DeviceNeedsMount(info.BestBackend()->unique_id_)) {
boost::scoped_ptr<QMessageBox> dialog(new QMessageBox(
QMessageBox::Information, tr("Connect device"),
tr("This is the first time you have connected this device. Clementine will now scan the device to find music files - this may take some time."),
@ -507,6 +511,12 @@ boost::shared_ptr<ConnectedDevice> DeviceManager::Connect(int row) {
if (!info.BestBackend()->lister_) // Not physically connected
return ret;
if (info.BestBackend()->lister_->DeviceNeedsMount(info.BestBackend()->unique_id_)) {
// Mount the device
info.BestBackend()->lister_->MountDevice(info.BestBackend()->unique_id_);
return ret;
}
bool first_time = (info.database_id_ == -1);
if (first_time) {
// We haven't stored this device in the database before

View File

@ -58,6 +58,7 @@ public:
enum State {
State_Remembered,
State_NotMounted,
State_NotConnected,
State_Connected,
};

View File

@ -102,6 +102,10 @@ void DeviceItemDelegate::paint(QPainter* p, const QStyleOptionViewItem& opt, con
status_text = tr("Not connected");
break;
case DeviceManager::State_NotMounted:
status_text = tr("Not mounted - double click to mount");
break;
case DeviceManager::State_NotConnected:
status_text = tr("Double click to open");
break;

View File

@ -23,23 +23,29 @@
#include <boost/bind.hpp>
QString GioLister::MountInfo::unique_id() const {
return QString("Gio/%1/%2/%3").arg(uuid, filesystem_type).arg(filesystem_size);
QString GioLister::DeviceInfo::unique_id() const {
if (mount)
return QString("Gio/%1/%2/%3").arg(mount_uuid, filesystem_type).arg(filesystem_size);
return QString("Gio/unmounted/%1").arg((qulonglong)volume.get());
}
bool GioLister::MountInfo::is_suitable() const {
return !filesystem_type.isEmpty() &&
filesystem_type != "udf" &&
bool GioLister::DeviceInfo::is_suitable() const {
if (!volume)
return false; // This excludes smb or ssh mounts
if (drive && !drive_removable)
return false; // This excludes internal drives
if (filesystem_type.isEmpty())
return true;
return filesystem_type != "udf" &&
filesystem_type != "smb" &&
filesystem_type != "cifs" &&
filesystem_type != "ssh";
}
GioLister::GioLister()
: monitor_(NULL)
{
}
template <typename T, typename F>
void OperationFinished(F f, GObject *object, GAsyncResult *result) {
T* obj = reinterpret_cast<T*>(object);
@ -48,7 +54,7 @@ void OperationFinished(F f, GObject *object, GAsyncResult *result) {
f(obj, result, &error);
if (error) {
qDebug() << "Unmount error:" << error->message;
qDebug() << "Mount/unmount error:" << error->message;
g_error_free(error);
}
}
@ -59,20 +65,19 @@ void GioLister::VolumeMountFinished(GObject* object, GAsyncResult* result, gpoin
}
void GioLister::Init() {
monitor_ = g_volume_monitor_get();
monitor_.reset_without_add(g_volume_monitor_get());
// Mount any volumes that aren't already mounted
// Get existing volumes
GList* const volumes = g_volume_monitor_get_volumes(monitor_);
for (GList* p=volumes; p; p=p->next) {
GVolume* volume = static_cast<GVolume*>(p->data);
if (g_volume_can_mount(volume) && !g_volume_get_mount(volume)) {
g_volume_mount(volume, G_MOUNT_MOUNT_NONE, NULL, NULL,
(GAsyncReadyCallback) VolumeMountFinished, NULL);
}
VolumeAdded(volume);
g_object_unref(volume);
}
g_list_free(volumes);
// Get things that are already mounted
// Get existing mounts
GList* const mounts = g_volume_monitor_get_mounts(monitor_);
for (GList* p=mounts; p; p=p->next) {
GMount* mount = static_cast<GMount*>(p->data);
@ -84,27 +89,32 @@ void GioLister::Init() {
// Connect signals from the monitor
g_signal_connect(monitor_, "volume-added", G_CALLBACK(VolumeAddedCallback), this);
g_signal_connect(monitor_, "volume-removed", G_CALLBACK(VolumeRemovedCallback), this);
g_signal_connect(monitor_, "mount-added", G_CALLBACK(MountAddedCallback), this);
g_signal_connect(monitor_, "mount-changed", G_CALLBACK(MountChangedCallback), this);
g_signal_connect(monitor_, "mount-removed", G_CALLBACK(MountRemovedCallback), this);
}
GioLister::~GioLister() {
if (monitor_)
g_object_unref(monitor_);
}
QStringList GioLister::DeviceUniqueIDs() {
QMutexLocker l(&mutex_);
return mounts_.keys();
return devices_.keys();
}
QVariantList GioLister::DeviceIcons(const QString &id) {
QVariantList ret;
QString path = LockAndGetMountInfo(id, &MountInfo::mount_path);
ret << DeviceLister::GuessIconForPath(path)
<< DeviceLister::GuessIconForModel(DeviceManufacturer(id), DeviceModel(id))
<< LockAndGetMountInfo(id, &MountInfo::icon_names);
QMutexLocker l(&mutex_);
if (!devices_.contains(id))
return ret;
const DeviceInfo& info = devices_[id];
if (info.mount) {
ret << DeviceLister::GuessIconForPath(info.mount_path);
ret << info.mount_icon_names;
}
ret << DeviceLister::GuessIconForModel(QString(), info.mount_name);
return ret;
}
@ -113,15 +123,20 @@ QString GioLister::DeviceManufacturer(const QString &id) {
}
QString GioLister::DeviceModel(const QString &id) {
return LockAndGetMountInfo(id, &MountInfo::name);
QMutexLocker l(&mutex_);
if (!devices_.contains(id))
return QString();
const DeviceInfo& info = devices_[id];
return info.drive_name.isEmpty() ? info.volume_name : info.drive_name;
}
quint64 GioLister::DeviceCapacity(const QString &id) {
return LockAndGetMountInfo(id, &MountInfo::filesystem_size);
return LockAndGetDeviceInfo(id, &DeviceInfo::filesystem_size);
}
quint64 GioLister::DeviceFreeSpace(const QString &id) {
return LockAndGetMountInfo(id, &MountInfo::filesystem_free);
return LockAndGetDeviceInfo(id, &DeviceInfo::filesystem_free);
}
QString GioLister::MakeFriendlyName(const QString &id) {
@ -132,23 +147,23 @@ QVariantMap GioLister::DeviceHardwareInfo(const QString &id) {
QVariantMap ret;
QMutexLocker l(&mutex_);
if (!mounts_.contains(id))
if (!devices_.contains(id))
return ret;
const MountInfo& info = mounts_[id];
const DeviceInfo& info = devices_[id];
ret[QT_TR_NOOP("Mount point")] = info.mount_path;
ret[QT_TR_NOOP("Device")] = info.unix_device;
ret[QT_TR_NOOP("URI")] = info.uri;
ret[QT_TR_NOOP("Device")] = info.volume_unix_device;
ret[QT_TR_NOOP("URI")] = info.mount_uri;
return ret;
}
QList<QUrl> GioLister::MakeDeviceUrls(const QString &id) {
QList<QUrl> GioLister::MakeDeviceUrls(const QString& id) {
QString mount_point;
QString uri;
{
QMutexLocker l(&mutex_);
mount_point = mounts_[id].mount_path;
uri = mounts_[id].uri;
mount_point = devices_[id].mount_path;
uri = devices_[id].mount_uri;
}
// gphoto2 gives invalid hostnames with []:, characters in
@ -164,6 +179,10 @@ void GioLister::VolumeAddedCallback(GVolumeMonitor*, GVolume* v, gpointer d) {
static_cast<GioLister*>(d)->VolumeAdded(v);
}
void GioLister::VolumeRemovedCallback(GVolumeMonitor*, GVolume* v, gpointer d) {
static_cast<GioLister*>(d)->VolumeRemoved(v);
}
void GioLister::MountAddedCallback(GVolumeMonitor*, GMount* m, gpointer d) {
static_cast<GioLister*>(d)->MountAdded(m);
}
@ -177,27 +196,81 @@ void GioLister::MountRemovedCallback(GVolumeMonitor*, GMount* m, gpointer d) {
}
void GioLister::VolumeAdded(GVolume* volume) {
if (g_volume_can_mount(volume) && !g_volume_get_mount(volume)) {
g_volume_mount(volume, G_MOUNT_MOUNT_NONE, NULL, NULL,
(GAsyncReadyCallback) VolumeMountFinished, NULL);
}
g_object_unref(volume);
}
g_object_ref(volume);
void GioLister::MountAdded(GMount *mount) {
MountInfo info = ReadMountInfo(mount);
DeviceInfo info;
info.ReadVolumeInfo(volume);
info.ReadDriveInfo(g_volume_get_drive(volume));
info.ReadMountInfo(g_volume_get_mount(volume));
if (!info.is_suitable())
return;
{
QMutexLocker l(&mutex_);
mounts_[info.unique_id()] = info;
devices_[info.unique_id()] = info;
}
emit DeviceAdded(info.unique_id());
}
void GioLister::MountChanged(GMount *mount) {
void GioLister::VolumeRemoved(GVolume* volume) {
QString id;
{
QMutexLocker l(&mutex_);
id = FindUniqueIdByVolume(volume);
if (id.isNull())
return;
devices_.remove(id);
}
emit DeviceRemoved(id);
}
void GioLister::MountAdded(GMount* mount) {
g_object_ref(mount);
DeviceInfo info;
info.ReadMountInfo(mount);
info.ReadVolumeInfo(g_mount_get_volume(mount));
info.ReadDriveInfo(g_mount_get_drive(mount));
if (!info.is_suitable())
return;
QString old_id;
{
QMutexLocker l(&mutex_);
const DeviceInfo* old_info = NULL;
// The volume might already exist - either mounted or unmounted.
foreach (const QString& id, devices_.keys()) {
if (devices_[id].volume == info.volume) {
old_id = id;
old_info = &devices_[id];
break;
}
}
if (!old_id.isEmpty() && old_id != info.unique_id()) {
// If the ID has changed (for example, after it's been mounted), we need
// to remove the old device.
devices_.remove(old_id);
emit DeviceRemoved(old_id);
old_info = NULL;
old_id = QString();
}
devices_[info.unique_id()] = info;
}
if (!old_id.isEmpty())
emit DeviceChanged(old_id);
else
emit DeviceAdded(info.unique_id());
}
void GioLister::MountChanged(GMount* mount) {
QString id;
{
QMutexLocker l(&mutex_);
@ -205,14 +278,19 @@ void GioLister::MountChanged(GMount *mount) {
if (id.isNull())
return;
MountInfo new_info = ReadMountInfo(mount);
g_object_ref(mount);
DeviceInfo new_info;
new_info.ReadMountInfo(mount);
new_info.ReadVolumeInfo(g_mount_get_volume(mount));
new_info.ReadDriveInfo(g_mount_get_drive(mount));
// Ignore the change if the new info is useless
if ((mounts_[id].filesystem_size != 0 && new_info.filesystem_size == 0) ||
(!mounts_[id].filesystem_type.isEmpty() && new_info.filesystem_type.isEmpty())) {
if ((devices_[id].filesystem_size != 0 && new_info.filesystem_size == 0) ||
(!devices_[id].filesystem_type.isEmpty() && new_info.filesystem_type.isEmpty()))
return;
}
mounts_[id] = new_info;
devices_[id] = new_info;
}
emit DeviceChanged(id);
@ -226,31 +304,33 @@ void GioLister::MountRemoved(GMount *mount) {
if (id.isNull())
return;
mounts_.remove(id);
devices_.remove(id);
}
emit DeviceRemoved(id);
}
QString GioLister::ConvertAndFree(char *str) {
QString GioLister::DeviceInfo::ConvertAndFree(char *str) {
QString ret = QString::fromUtf8(str);
g_free(str);
return ret;
}
GioLister::MountInfo GioLister::ReadMountInfo(GMount* mount) {
MountInfo ret;
void GioLister::DeviceInfo::ReadMountInfo(GMount* mount) {
// Get basic information
ret.mount = mount;
ret.name = ConvertAndFree(g_mount_get_name(mount));
this->mount.reset_without_add(mount);
if (!mount)
return;
mount_name = ConvertAndFree(g_mount_get_name(mount));
// Get the icon name(s)
mount_icon_names.clear();
GIcon* icon = g_mount_get_icon(mount);
if (G_IS_THEMED_ICON(icon)) {
const char* const * icons = g_themed_icon_get_names(G_THEMED_ICON(icon));
for (const char* const * p = icons ; *p ; ++p) {
ret.icon_names << QString::fromUtf8(*p);
mount_icon_names << QString::fromUtf8(*p);
}
}
g_object_unref(icon);
@ -258,8 +338,8 @@ GioLister::MountInfo GioLister::ReadMountInfo(GMount* mount) {
GFile* root = g_mount_get_root(mount);
// Get the mount path
ret.mount_path = ConvertAndFree(g_file_get_path(root));
ret.uri = ConvertAndFree(g_file_get_uri(root));
mount_path = ConvertAndFree(g_file_get_path(root));
mount_uri = ConvertAndFree(g_file_get_uri(root));
// Query the filesystem info for size, free space, and type
GError* error = NULL;
@ -270,18 +350,18 @@ GioLister::MountInfo GioLister::ReadMountInfo(GMount* mount) {
qWarning() << error->message;
g_error_free(error);
} else {
ret.filesystem_size = g_file_info_get_attribute_uint64(
filesystem_size = g_file_info_get_attribute_uint64(
info, G_FILE_ATTRIBUTE_FILESYSTEM_SIZE);
ret.filesystem_free = g_file_info_get_attribute_uint64(
filesystem_free = g_file_info_get_attribute_uint64(
info, G_FILE_ATTRIBUTE_FILESYSTEM_FREE);
ret.filesystem_type = QString::fromUtf8(g_file_info_get_attribute_string(
filesystem_type = QString::fromUtf8(g_file_info_get_attribute_string(
info, G_FILE_ATTRIBUTE_FILESYSTEM_TYPE));
g_object_unref(info);
}
// Query the file's info for a filesystem ID
// Only afc devices (that I know of) give reliably unique IDs
if (ret.filesystem_type == "afc") {
if (filesystem_type == "afc") {
error = NULL;
info = g_file_query_info(root, G_FILE_ATTRIBUTE_ID_FILESYSTEM,
G_FILE_QUERY_INFO_NONE, NULL, &error);
@ -289,33 +369,57 @@ GioLister::MountInfo GioLister::ReadMountInfo(GMount* mount) {
qWarning() << error->message;
g_error_free(error);
} else {
ret.uuid = QString::fromUtf8(g_file_info_get_attribute_string(
mount_uuid = QString::fromUtf8(g_file_info_get_attribute_string(
info, G_FILE_ATTRIBUTE_ID_FILESYSTEM));
g_object_unref(info);
}
}
g_object_unref(root);
}
// Get information about the volume
GVolume* volume = g_mount_get_volume(mount);
if (volume) {
ret.unix_device = ConvertAndFree(g_volume_get_identifier(
volume, G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE));
g_object_unref(volume);
void GioLister::DeviceInfo::ReadVolumeInfo(GVolume* volume) {
this->volume.reset_without_add(volume);
if (!volume)
return;
volume_name = ConvertAndFree(g_volume_get_name(volume));
volume_uuid = ConvertAndFree(g_volume_get_uuid(volume));
volume_unix_device = ConvertAndFree(g_volume_get_identifier(
volume, G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE));
GFile* root = g_volume_get_activation_root(volume);
if (root) {
volume_root_uri = g_file_get_uri(root);
g_object_unref(root);
}
}
return ret;
void GioLister::DeviceInfo::ReadDriveInfo(GDrive* drive) {
this->drive.reset_without_add(drive);
if (!drive)
return;
drive_name = ConvertAndFree(g_drive_get_name(drive));
drive_removable = g_drive_is_media_removable(drive);
}
QString GioLister::FindUniqueIdByMount(GMount *mount) const {
foreach (const MountInfo& info, mounts_) {
foreach (const DeviceInfo& info, devices_) {
if (info.mount == mount)
return info.unique_id();
}
return QString();
}
QString GioLister::FindUniqueIdByVolume(GVolume* volume) const {
foreach (const DeviceInfo& info, devices_) {
if (info.volume == volume)
return info.unique_id();
}
return QString();
}
void GioLister::VolumeEjectFinished(GObject *object, GAsyncResult *result, gpointer) {
OperationFinished<GVolume>(boost::bind(
g_volume_eject_with_operation_finish, _1, _2, _3), object, result);
@ -332,26 +436,29 @@ void GioLister::MountUnmountFinished(GObject *object, GAsyncResult *result, gpoi
}
void GioLister::UnmountDevice(const QString &id) {
GMount* mount = LockAndGetMountInfo(id, &MountInfo::mount);
if (!mount)
QMutexLocker l(&mutex_);
if (!devices_.contains(id))
return;
GVolume* volume = g_mount_get_volume(mount);
if (volume) {
if (g_volume_can_eject(volume)) {
g_volume_eject(volume, G_MOUNT_UNMOUNT_NONE, NULL,
const DeviceInfo& info = devices_[id];
if (!info.mount)
return;
if (info.volume) {
if (g_volume_can_eject(info.volume)) {
g_volume_eject(info.volume, G_MOUNT_UNMOUNT_NONE, NULL,
(GAsyncReadyCallback) VolumeEjectFinished, NULL);
g_object_unref(volume);
g_object_unref(info.volume);
return;
}
g_object_unref(volume);
}
if (g_mount_can_eject(mount)) {
g_mount_eject(mount, G_MOUNT_UNMOUNT_NONE, NULL,
if (g_mount_can_eject(info.mount)) {
g_mount_eject(info.mount, G_MOUNT_UNMOUNT_NONE, NULL,
(GAsyncReadyCallback) MountEjectFinished, NULL);
} else if (g_mount_can_unmount(mount)) {
g_mount_unmount(mount, G_MOUNT_UNMOUNT_NONE, NULL,
} else if (g_mount_can_unmount(info.mount)) {
g_mount_unmount(info.mount, G_MOUNT_UNMOUNT_NONE, NULL,
(GAsyncReadyCallback) MountUnmountFinished, NULL);
}
}
@ -359,12 +466,12 @@ void GioLister::UnmountDevice(const QString &id) {
void GioLister::UpdateDeviceFreeSpace(const QString& id) {
{
QMutexLocker l(&mutex_);
if (!mounts_.contains(id))
if (!devices_.contains(id))
return;
MountInfo& mount_info = mounts_[id];
DeviceInfo& device_info = devices_[id];
GFile* root = g_mount_get_root(mount_info.mount);
GFile* root = g_mount_get_root(device_info.mount);
GError* error = NULL;
GFileInfo* info = g_file_query_filesystem_info(
@ -373,7 +480,7 @@ void GioLister::UpdateDeviceFreeSpace(const QString& id) {
qWarning() << error->message;
g_error_free(error);
} else {
mount_info.filesystem_free = g_file_info_get_attribute_uint64(
device_info.filesystem_free = g_file_info_get_attribute_uint64(
info, G_FILE_ATTRIBUTE_FILESYSTEM_FREE);
g_object_unref(info);
}
@ -383,3 +490,36 @@ void GioLister::UpdateDeviceFreeSpace(const QString& id) {
emit DeviceChanged(id);
}
bool GioLister::DeviceNeedsMount(const QString& id) {
QMutexLocker l(&mutex_);
return devices_.contains(id) && !devices_[id].mount;
}
int GioLister::MountDevice(const QString& id) {
const int request_id = next_mount_request_id_ ++;
metaObject()->invokeMethod(this, "DoMountDevice", Qt::QueuedConnection,
Q_ARG(QString, id), Q_ARG(int, request_id));
return request_id;
}
void GioLister::DoMountDevice(const QString& id, int request_id) {
QMutexLocker l(&mutex_);
if (!devices_.contains(id)) {
emit DeviceMounted(id, request_id, false);
return;
}
const DeviceInfo& info = devices_[id];
if (info.mount) {
// Already mounted
emit DeviceMounted(id, request_id, true);
return;
}
g_volume_mount(info.volume, G_MOUNT_MOUNT_NONE, NULL, NULL,
VolumeMountFinished, NULL);
emit DeviceMounted(id, request_id, true);
}

View File

@ -18,6 +18,7 @@
#define GIOLISTER_H
#include "devicelister.h"
#include "core/scopedgobject.h"
// Work around compile issue with glib >= 2.25
#ifdef signals
@ -33,8 +34,7 @@ class GioLister : public DeviceLister {
Q_OBJECT
public:
GioLister();
~GioLister();
GioLister() {}
int priority() const { return 50; }
@ -45,10 +45,12 @@ public:
quint64 DeviceCapacity(const QString& id);
quint64 DeviceFreeSpace(const QString& id);
QVariantMap DeviceHardwareInfo(const QString& id);
bool DeviceNeedsMount(const QString& id);
QString MakeFriendlyName(const QString &id);
QList<QUrl> MakeDeviceUrls(const QString &id);
int MountDevice(const QString& id);
void UnmountDevice(const QString &id);
public slots:
@ -58,30 +60,51 @@ protected:
void Init();
private:
struct MountInfo {
MountInfo() : filesystem_size(0), filesystem_free(0) {}
struct DeviceInfo {
DeviceInfo() : drive_removable(false), filesystem_size(0), filesystem_free(0) {}
QString unique_id() const;
bool is_suitable() const;
GMount* mount;
QString unix_device;
static QString ConvertAndFree(char* str);
void ReadDriveInfo(GDrive* drive);
void ReadVolumeInfo(GVolume* volume);
void ReadMountInfo(GMount* mount);
// Only available if it's a physical drive
ScopedGObject<GVolume> volume;
QString volume_name;
QString volume_unix_device;
QString volume_root_uri;
QString volume_uuid;
// Only available if it's a physical drive
ScopedGObject<GDrive> drive;
QString drive_name;
bool drive_removable;
// Only available if it's mounted
ScopedGObject<GMount> mount;
QString mount_path;
QString uri;
QString name;
QStringList icon_names;
QString uuid;
QString mount_uri;
QString mount_name;
QStringList mount_icon_names;
QString mount_uuid;
quint64 filesystem_size;
quint64 filesystem_free;
QString filesystem_type;
};
void VolumeAdded(GVolume* volume);
void VolumeRemoved(GVolume* volume);
void MountAdded(GMount* mount);
void MountChanged(GMount* mount);
void MountRemoved(GMount* mount);
static void VolumeAddedCallback(GVolumeMonitor*, GVolume*, gpointer);
static void VolumeRemovedCallback(GVolumeMonitor*, GVolume*, gpointer);
static void MountAddedCallback(GVolumeMonitor*, GMount*, gpointer);
static void MountChangedCallback(GVolumeMonitor*, GMount*, gpointer);
static void MountRemovedCallback(GVolumeMonitor*, GMount*, gpointer);
@ -91,29 +114,30 @@ private:
static void MountEjectFinished(GObject* object, GAsyncResult* result, gpointer);
static void MountUnmountFinished(GObject* object, GAsyncResult* result, gpointer);
static QString ConvertAndFree(char* str);
static MountInfo ReadMountInfo(GMount* mount);
// You MUST hold the mutex while calling this function
QString FindUniqueIdByMount(GMount* mount) const;
QString FindUniqueIdByVolume(GVolume* volume) const;
template <typename T>
T LockAndGetMountInfo(const QString& id, T MountInfo::*field);
T LockAndGetDeviceInfo(const QString& id, T DeviceInfo::*field);
private slots:
void DoMountDevice(const QString& id, int request_id);
private:
GVolumeMonitor* monitor_;
ScopedGObject<GVolumeMonitor> monitor_;
QMutex mutex_;
QMap<QString, MountInfo> mounts_;
QMap<QString, DeviceInfo> devices_;
};
template <typename T>
T GioLister::LockAndGetMountInfo(const QString& id, T MountInfo::*field) {
T GioLister::LockAndGetDeviceInfo(const QString& id, T DeviceInfo::*field) {
QMutexLocker l(&mutex_);
if (!mounts_.contains(id))
if (!devices_.contains(id))
return T();
return mounts_[id].*field;
return devices_[id].*field;
}
#endif // GIOLISTER_H

View File

@ -11,10 +11,10 @@ msgstr ""
"PO-Revision-Date: 2010-05-21 01:02+0000\n"
"Last-Translator: EL7R <the-ghost@live.com>\n"
"Language-Team: Arabic <ar@li.org>\n"
"Language: ar\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ar\n"
"X-Launchpad-Export-Date: 2010-05-22 04:09+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
@ -56,15 +56,15 @@ msgstr ""
msgid "%1: Wiimotedev module"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n failed"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n finished"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n remaining"
msgstr ""
@ -665,7 +665,7 @@ msgstr ""
msgid "Edit..."
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "Editing %n tracks"
msgstr ""
@ -1202,6 +1202,9 @@ msgstr ""
msgid "Not enough neighbors"
msgstr ""
msgid "Not mounted - double click to mount"
msgstr ""
msgid "Notification type"
msgstr ""
@ -2000,7 +2003,7 @@ msgstr ""
msgid "[click to edit]"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "add %n songs"
msgstr "أضِف %n أغاني\\أغنية"
@ -2020,7 +2023,7 @@ msgstr "انقل الأغاني"
msgid "options"
msgstr "الخيارات"
#, c-format, qt-plural-format
#, c-format
msgid "remove %n songs"
msgstr "أزِل %n أغاني\\أغنية"

View File

@ -11,10 +11,10 @@ msgstr ""
"PO-Revision-Date: 2010-07-24 15:58+0000\n"
"Last-Translator: David Sansome <me@davidsansome.com>\n"
"Language-Team: Bulgarian <bg@li.org>\n"
"Language: bg\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: bg\n"
"X-Launchpad-Export-Date: 2010-07-25 04:25+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
@ -56,15 +56,15 @@ msgstr ""
msgid "%1: Wiimotedev module"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n failed"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n finished"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n remaining"
msgstr ""
@ -665,7 +665,7 @@ msgstr ""
msgid "Edit..."
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "Editing %n tracks"
msgstr ""
@ -1202,6 +1202,9 @@ msgstr ""
msgid "Not enough neighbors"
msgstr ""
msgid "Not mounted - double click to mount"
msgstr ""
msgid "Notification type"
msgstr ""
@ -2000,7 +2003,7 @@ msgstr ""
msgid "[click to edit]"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "add %n songs"
msgstr ""
@ -2020,7 +2023,7 @@ msgstr ""
msgid "options"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "remove %n songs"
msgstr ""

View File

@ -11,10 +11,10 @@ msgstr ""
"PO-Revision-Date: 2010-09-04 20:21+0000\n"
"Last-Translator: David Sansome <me@davidsansome.com>\n"
"Language-Team: Catalan <ca@li.org>\n"
"Language: ca\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ca\n"
msgid " ms"
msgstr " ms"
@ -54,15 +54,15 @@ msgstr "%1 temes"
msgid "%1: Wiimotedev module"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n failed"
msgstr "%n han fallat"
#, c-format, qt-plural-format
#, c-format
msgid "%n finished"
msgstr "%n han acabat"
#, c-format, qt-plural-format
#, c-format
msgid "%n remaining"
msgstr "%n restants"
@ -99,8 +99,8 @@ msgid ""
"<p>If you surround sections of text that contain a token with curly-braces, "
"that section will be hidden if the token is empty.</p>"
msgstr ""
"<p>Les fitxes de reemplaçament comencen amb %, per exemple: %artist %album "
"%title </p>\n"
"<p>Les fitxes de reemplaçament comencen amb %, per exemple: %artist %album %"
"title </p>\n"
"\n"
"<p>Si demarques entre claus una secció de text que contingui una fitxa de "
"remplaçament, aquesta secció no es mostrarà si la fitxa de remplaçament es "
@ -677,7 +677,7 @@ msgstr "Editar la informació de la pista..."
msgid "Edit..."
msgstr "Edita..."
#, c-format, qt-plural-format
#, c-format
msgid "Editing %n tracks"
msgstr "Editant %n pistes"
@ -1225,6 +1225,9 @@ msgstr "No hi ha prous membres"
msgid "Not enough neighbors"
msgstr "No hi ha prous veïns"
msgid "Not mounted - double click to mount"
msgstr ""
msgid "Notification type"
msgstr "Tipus de notificació"
@ -2034,7 +2037,7 @@ msgstr "Zero"
msgid "[click to edit]"
msgstr "[clickar per editar]"
#, c-format, qt-plural-format
#, c-format
msgid "add %n songs"
msgstr "afegeix %n cançons"
@ -2054,7 +2057,7 @@ msgstr "moure cançons"
msgid "options"
msgstr "opcions"
#, c-format, qt-plural-format
#, c-format
msgid "remove %n songs"
msgstr "elimina %n cançons"

View File

@ -11,10 +11,10 @@ msgstr ""
"PO-Revision-Date: 2010-09-04 20:15+0000\n"
"Last-Translator: David Sansome <me@davidsansome.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: \n"
"X-Language: cs_CZ\n"
msgid " ms"
@ -55,15 +55,15 @@ msgstr ""
msgid "%1: Wiimotedev module"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n failed"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n finished"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n remaining"
msgstr ""
@ -664,7 +664,7 @@ msgstr "Upravit informaci o skladbách..."
msgid "Edit..."
msgstr "Upravit..."
#, c-format, qt-plural-format
#, c-format
msgid "Editing %n tracks"
msgstr "Úprava %n stop"
@ -1204,6 +1204,9 @@ msgstr "Nedostatek členů"
msgid "Not enough neighbors"
msgstr ""
msgid "Not mounted - double click to mount"
msgstr ""
msgid "Notification type"
msgstr "Typ poznámy"
@ -2002,7 +2005,7 @@ msgstr "Vynulovat"
msgid "[click to edit]"
msgstr "[pro úpravy klikněte]"
#, c-format, qt-plural-format
#, c-format
msgid "add %n songs"
msgstr "Přidej %n skladby"
@ -2022,7 +2025,7 @@ msgstr "Přesuň skladby"
msgid "options"
msgstr "Možnosti"
#, c-format, qt-plural-format
#, c-format
msgid "remove %n songs"
msgstr "Odeber %n skladeb"

View File

@ -12,10 +12,10 @@ msgstr ""
"PO-Revision-Date: 2010-07-24 15:57+0000\n"
"Last-Translator: Kabel <CaptainKabel@gmail.com>\n"
"Language-Team: Danish <kde-i18n-doc@kde.org>\n"
"Language: da\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: da\n"
"X-Launchpad-Export-Date: 2010-07-25 04:25+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
@ -57,15 +57,15 @@ msgstr ""
msgid "%1: Wiimotedev module"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n failed"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n finished"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n remaining"
msgstr ""
@ -666,7 +666,7 @@ msgstr "Redigér sporinformation..."
msgid "Edit..."
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "Editing %n tracks"
msgstr "Redigerer %n spor"
@ -1207,6 +1207,9 @@ msgstr "Ikke nok medlemmer"
msgid "Not enough neighbors"
msgstr "Ikke nok naboer"
msgid "Not mounted - double click to mount"
msgstr ""
msgid "Notification type"
msgstr "Bekendtgørelsestype"
@ -2007,7 +2010,7 @@ msgstr "Nul"
msgid "[click to edit]"
msgstr "[Klik for at redigere]"
#, c-format, qt-plural-format
#, c-format
msgid "add %n songs"
msgstr "tilføj %n sange"
@ -2027,7 +2030,7 @@ msgstr "flyt sange"
msgid "options"
msgstr "indstillinger"
#, c-format, qt-plural-format
#, c-format
msgid "remove %n songs"
msgstr "fjern %n sange"

View File

@ -12,10 +12,10 @@ msgstr ""
"PO-Revision-Date: 2010-09-02 19:33+0000\n"
"Last-Translator: Markus Fuchs <Unknown>\n"
"Language-Team: German <de@li.org>\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: de\n"
msgid " ms"
msgstr " ms"
@ -55,15 +55,15 @@ msgstr "%1 Stücke"
msgid "%1: Wiimotedev module"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n failed"
msgstr "%n fehlgeschlagen"
#, c-format, qt-plural-format
#, c-format
msgid "%n finished"
msgstr "%n konvertiert"
#, c-format, qt-plural-format
#, c-format
msgid "%n remaining"
msgstr "%n verbleibend"
@ -680,7 +680,7 @@ msgstr "Metadaten bearbeiten..."
msgid "Edit..."
msgstr "Bearbeiten..."
#, c-format, qt-plural-format
#, c-format
msgid "Editing %n tracks"
msgstr "%n Stücke bearbeiten"
@ -1227,6 +1227,9 @@ msgstr "Nicht genügend Mitglieder"
msgid "Not enough neighbors"
msgstr "Nicht genug Nachbarn"
msgid "Not mounted - double click to mount"
msgstr ""
msgid "Notification type"
msgstr "Art der Benachrichtigung"
@ -2045,7 +2048,7 @@ msgstr "Null"
msgid "[click to edit]"
msgstr "[zum Bearbeiten klicken]"
#, c-format, qt-plural-format
#, c-format
msgid "add %n songs"
msgstr "%n Stücke hinzufügen"
@ -2065,7 +2068,7 @@ msgstr "Stücke verschieben"
msgid "options"
msgstr "Einstellungen"
#, c-format, qt-plural-format
#, c-format
msgid "remove %n songs"
msgstr "%n Stücke entfernen"

View File

@ -11,10 +11,10 @@ msgstr ""
"PO-Revision-Date: 2010-09-04 12:27+0000\n"
"Last-Translator: firewalker <Unknown>\n"
"Language-Team: <en@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: \n"
"X-Language: el_GR\n"
"X-Source-Language: en\n"
@ -56,15 +56,15 @@ msgstr "%1 κομμάτια"
msgid "%1: Wiimotedev module"
msgstr "%1: Άρθρωμα Wiimotedev"
#, c-format, qt-plural-format
#, c-format
msgid "%n failed"
msgstr "%n απέτυχε"
#, c-format, qt-plural-format
#, c-format
msgid "%n finished"
msgstr "%n ολοκληρώθηκε"
#, c-format, qt-plural-format
#, c-format
msgid "%n remaining"
msgstr "%n απομένει"
@ -682,7 +682,7 @@ msgstr "Τροποποίηση πληροφοριών κομματιού..."
msgid "Edit..."
msgstr "Επεξεργασία..."
#, c-format, qt-plural-format
#, c-format
msgid "Editing %n tracks"
msgstr "Τροποποίηση %n κομματιών"
@ -1228,6 +1228,9 @@ msgstr "Δεν υπάρχουν αρκετά μέλη"
msgid "Not enough neighbors"
msgstr "Δεν υπάρχουν αρκετοί γείτονες"
msgid "Not mounted - double click to mount"
msgstr ""
msgid "Notification type"
msgstr "Τύπος ειδοποίησης"
@ -2050,7 +2053,7 @@ msgstr "Zero"
msgid "[click to edit]"
msgstr "[κλικ για τροποποίηση]"
#, c-format, qt-plural-format
#, c-format
msgid "add %n songs"
msgstr "προσθήκη %n τραγουδιών"
@ -2070,7 +2073,7 @@ msgstr "μετακίνηση τραγουδιών"
msgid "options"
msgstr "επιλογές"
#, c-format, qt-plural-format
#, c-format
msgid "remove %n songs"
msgstr "αφαίρεση %n τραγουδιών"

View File

@ -11,10 +11,10 @@ msgstr ""
"PO-Revision-Date: 2010-06-17 01:37+0000\n"
"Last-Translator: David Sansome <me@davidsansome.com>\n"
"Language-Team: English (Canada) <en_CA@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: \n"
"X-Launchpad-Export-Date: 2010-06-18 03:42+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
@ -56,15 +56,15 @@ msgstr ""
msgid "%1: Wiimotedev module"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n failed"
msgstr "%n failed"
#, c-format, qt-plural-format
#, c-format
msgid "%n finished"
msgstr "%n finished"
#, c-format, qt-plural-format
#, c-format
msgid "%n remaining"
msgstr "%n remaining"
@ -667,7 +667,7 @@ msgstr "Edit track information..."
msgid "Edit..."
msgstr "Edit..."
#, c-format, qt-plural-format
#, c-format
msgid "Editing %n tracks"
msgstr "Editing %n tracks"
@ -1207,6 +1207,9 @@ msgstr "Not enough members"
msgid "Not enough neighbors"
msgstr "Not enough neighbours"
msgid "Not mounted - double click to mount"
msgstr ""
msgid "Notification type"
msgstr "Notification type"
@ -2005,7 +2008,7 @@ msgstr "Zero"
msgid "[click to edit]"
msgstr "[click to edit]"
#, c-format, qt-plural-format
#, c-format
msgid "add %n songs"
msgstr "add %n songs"
@ -2025,7 +2028,7 @@ msgstr "move songs"
msgid "options"
msgstr "options"
#, c-format, qt-plural-format
#, c-format
msgid "remove %n songs"
msgstr "remove %n songs"

View File

@ -11,10 +11,10 @@ msgstr ""
"PO-Revision-Date: 2010-06-17 01:38+0000\n"
"Last-Translator: David Sansome <me@davidsansome.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: \n"
"X-Launchpad-Export-Date: 2010-06-18 03:42+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
@ -56,15 +56,15 @@ msgstr ""
msgid "%1: Wiimotedev module"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n failed"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n finished"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n remaining"
msgstr ""
@ -665,7 +665,7 @@ msgstr "Edit track information..."
msgid "Edit..."
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "Editing %n tracks"
msgstr "Editing %n tracks"
@ -1204,6 +1204,9 @@ msgstr "Not enough members"
msgid "Not enough neighbors"
msgstr "Not enough neighbours"
msgid "Not mounted - double click to mount"
msgstr ""
msgid "Notification type"
msgstr "Notification type"
@ -2002,7 +2005,7 @@ msgstr "Zero"
msgid "[click to edit]"
msgstr "[click to edit]"
#, c-format, qt-plural-format
#, c-format
msgid "add %n songs"
msgstr ""
@ -2022,7 +2025,7 @@ msgstr ""
msgid "options"
msgstr "options"
#, c-format, qt-plural-format
#, c-format
msgid "remove %n songs"
msgstr ""

View File

@ -11,10 +11,10 @@ msgstr ""
"PO-Revision-Date: 2010-09-04 20:23+0000\n"
"Last-Translator: David Sansome <me@davidsansome.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: \n"
"X-Language: es_ES\n"
msgid " ms"
@ -55,15 +55,15 @@ msgstr "%1 pistas"
msgid "%1: Wiimotedev module"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n failed"
msgstr "%n falló"
#, c-format, qt-plural-format
#, c-format
msgid "%n finished"
msgstr "%n completado(s)"
#, c-format, qt-plural-format
#, c-format
msgid "%n remaining"
msgstr "%n pendiente(s)"
@ -681,7 +681,7 @@ msgstr "Editar información de la pista..."
msgid "Edit..."
msgstr "Editar..."
#, c-format, qt-plural-format
#, c-format
msgid "Editing %n tracks"
msgstr "Editando %n pistas"
@ -1230,6 +1230,9 @@ msgstr "No hay suficientes miembros"
msgid "Not enough neighbors"
msgstr "No hay suficientes vecinos"
msgid "Not mounted - double click to mount"
msgstr ""
msgid "Notification type"
msgstr "Tipo de notificación"
@ -2048,7 +2051,7 @@ msgstr "Zero"
msgid "[click to edit]"
msgstr "[click para editar]"
#, c-format, qt-plural-format
#, c-format
msgid "add %n songs"
msgstr "agregar %n pistas"
@ -2068,7 +2071,7 @@ msgstr "mover pistas"
msgid "options"
msgstr "opciones"
#, c-format, qt-plural-format
#, c-format
msgid "remove %n songs"
msgstr "remover %n pistas"

View File

@ -11,10 +11,10 @@ msgstr ""
"PO-Revision-Date: 2010-08-11 22:43+0000\n"
"Last-Translator: David Sansome <me@davidsansome.com>\n"
"Language-Team: Finnish <fi@li.org>\n"
"Language: fi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: fi\n"
msgid " ms"
msgstr " ms"
@ -54,15 +54,15 @@ msgstr "%1 kappaletta"
msgid "%1: Wiimotedev module"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n failed"
msgstr "%n epäonnistui"
#, c-format, qt-plural-format
#, c-format
msgid "%n finished"
msgstr "%n valmistui"
#, c-format, qt-plural-format
#, c-format
msgid "%n remaining"
msgstr "%n jäljellä"
@ -663,7 +663,7 @@ msgstr "Muokkaa kappaleen tietoja..."
msgid "Edit..."
msgstr "Muokkaa..."
#, c-format, qt-plural-format
#, c-format
msgid "Editing %n tracks"
msgstr ""
@ -1202,6 +1202,9 @@ msgstr ""
msgid "Not enough neighbors"
msgstr ""
msgid "Not mounted - double click to mount"
msgstr ""
msgid "Notification type"
msgstr ""
@ -2000,7 +2003,7 @@ msgstr ""
msgid "[click to edit]"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "add %n songs"
msgstr ""
@ -2020,7 +2023,7 @@ msgstr ""
msgid "options"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "remove %n songs"
msgstr ""

View File

@ -11,10 +11,10 @@ msgstr ""
"PO-Revision-Date: 2010-09-04 22:38+0000\n"
"Last-Translator: Alexis B. <Unknown>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: \n"
"X-Language: fr_FR\n"
msgid " ms"
@ -55,15 +55,15 @@ msgstr "%1 pistes"
msgid "%1: Wiimotedev module"
msgstr "%1: Module wiimotedev"
#, c-format, qt-plural-format
#, c-format
msgid "%n failed"
msgstr "%n échoué"
#, c-format, qt-plural-format
#, c-format
msgid "%n finished"
msgstr "%n terminé"
#, c-format, qt-plural-format
#, c-format
msgid "%n remaining"
msgstr "%n manquant"
@ -678,7 +678,7 @@ msgstr "Modifier la description de la piste..."
msgid "Edit..."
msgstr "Éditer..."
#, c-format, qt-plural-format
#, c-format
msgid "Editing %n tracks"
msgstr "Éditer %n pistes"
@ -1229,6 +1229,9 @@ msgstr "Pas assez de membres"
msgid "Not enough neighbors"
msgstr ""
msgid "Not mounted - double click to mount"
msgstr ""
msgid "Notification type"
msgstr "Notifications"
@ -2043,7 +2046,7 @@ msgstr "Zéro"
msgid "[click to edit]"
msgstr "[cliquer pour modifier]"
#, c-format, qt-plural-format
#, c-format
msgid "add %n songs"
msgstr ""
@ -2063,7 +2066,7 @@ msgstr "déplacer les chansons"
msgid "options"
msgstr "options"
#, c-format, qt-plural-format
#, c-format
msgid "remove %n songs"
msgstr ""

View File

@ -11,10 +11,10 @@ msgstr ""
"PO-Revision-Date: 2010-04-27 16:34+0000\n"
"Last-Translator: andreout <andre@outeiro.com>\n"
"Language-Team: Galician <gl@li.org>\n"
"Language: gl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: gl\n"
"X-Launchpad-Export-Date: 2010-04-28 03:53+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
@ -56,15 +56,15 @@ msgstr ""
msgid "%1: Wiimotedev module"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n failed"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n finished"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n remaining"
msgstr ""
@ -665,7 +665,7 @@ msgstr ""
msgid "Edit..."
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "Editing %n tracks"
msgstr "Editando %n faixas"
@ -1204,6 +1204,9 @@ msgstr "Membros insuficientes"
msgid "Not enough neighbors"
msgstr "Viciños insuficientes"
msgid "Not mounted - double click to mount"
msgstr ""
msgid "Notification type"
msgstr ""
@ -2002,7 +2005,7 @@ msgstr ""
msgid "[click to edit]"
msgstr "[clique para editar]"
#, c-format, qt-plural-format
#, c-format
msgid "add %n songs"
msgstr ""
@ -2022,7 +2025,7 @@ msgstr ""
msgid "options"
msgstr "Opzóns"
#, c-format, qt-plural-format
#, c-format
msgid "remove %n songs"
msgstr ""

View File

@ -11,10 +11,10 @@ msgstr ""
"PO-Revision-Date: 2010-09-04 19:52+0000\n"
"Last-Translator: ntomka <Unknown>\n"
"Language-Team: Hungarian <hu@li.org>\n"
"Language: hu\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: hu\n"
msgid " ms"
msgstr " ms"
@ -54,15 +54,15 @@ msgstr "%1 szám"
msgid "%1: Wiimotedev module"
msgstr "%1: Wiimotedev modul"
#, c-format, qt-plural-format
#, c-format
msgid "%n failed"
msgstr "%n meghiúsult"
#, c-format, qt-plural-format
#, c-format
msgid "%n finished"
msgstr "%n befejezve"
#, c-format, qt-plural-format
#, c-format
msgid "%n remaining"
msgstr "%n hátralévő"
@ -678,7 +678,7 @@ msgstr "Száminformációk szerkesztése..."
msgid "Edit..."
msgstr "Szerkesztés..."
#, c-format, qt-plural-format
#, c-format
msgid "Editing %n tracks"
msgstr "%n szám szerkesztése"
@ -1225,6 +1225,9 @@ msgstr "Nincs elég tag"
msgid "Not enough neighbors"
msgstr "Nincs elég szomszédja"
msgid "Not mounted - double click to mount"
msgstr ""
msgid "Notification type"
msgstr "Értesítés módja"
@ -2045,7 +2048,7 @@ msgstr "Nulla"
msgid "[click to edit]"
msgstr "[kattintson a szerkesztéshez]"
#, c-format, qt-plural-format
#, c-format
msgid "add %n songs"
msgstr "%n szám felvétele"
@ -2065,7 +2068,7 @@ msgstr "számok mozgatása"
msgid "options"
msgstr "beállítások"
#, c-format, qt-plural-format
#, c-format
msgid "remove %n songs"
msgstr "%n szám eltávolítása"

View File

@ -12,10 +12,10 @@ msgstr ""
"PO-Revision-Date: 2010-09-03 15:02+0000\n"
"Last-Translator: Vincenzo Reale <smart2128@baslug.org>\n"
"Language-Team: Italian <kde-i18n-it@kde.org>\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: it\n"
msgid " ms"
msgstr " ms"
@ -55,15 +55,15 @@ msgstr "%1 tracce"
msgid "%1: Wiimotedev module"
msgstr "%1: modulo Wiimotedev"
#, c-format, qt-plural-format
#, c-format
msgid "%n failed"
msgstr "%n non riusciti"
#, c-format, qt-plural-format
#, c-format
msgid "%n finished"
msgstr "%n completati"
#, c-format, qt-plural-format
#, c-format
msgid "%n remaining"
msgstr "%n rimanenti"
@ -685,7 +685,7 @@ msgstr "Modifica informazioni traccia..."
msgid "Edit..."
msgstr "Modifica..."
#, c-format, qt-plural-format
#, c-format
msgid "Editing %n tracks"
msgstr "Modifica di %n tracce"
@ -1235,6 +1235,9 @@ msgstr "Membri non sufficienti"
msgid "Not enough neighbors"
msgstr "Vicini non sufficienti"
msgid "Not mounted - double click to mount"
msgstr ""
msgid "Notification type"
msgstr "Tipo di notifica"
@ -2058,7 +2061,7 @@ msgstr "Zero"
msgid "[click to edit]"
msgstr "[clic per modificare]"
#, c-format, qt-plural-format
#, c-format
msgid "add %n songs"
msgstr "aggiungi %n brani"
@ -2078,7 +2081,7 @@ msgstr "sposta brani"
msgid "options"
msgstr "opzioni"
#, c-format, qt-plural-format
#, c-format
msgid "remove %n songs"
msgstr "rimuovi %n brani"

View File

@ -11,10 +11,10 @@ msgstr ""
"PO-Revision-Date: 2010-04-27 16:33+0000\n"
"Last-Translator: David Sansome <me@davidsansome.com>\n"
"Language-Team: Kazakh <kk@li.org>\n"
"Language: kk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: kk\n"
"X-Launchpad-Export-Date: 2010-04-28 03:53+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
@ -56,15 +56,15 @@ msgstr ""
msgid "%1: Wiimotedev module"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n failed"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n finished"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n remaining"
msgstr ""
@ -665,7 +665,7 @@ msgstr ""
msgid "Edit..."
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "Editing %n tracks"
msgstr ""
@ -1204,6 +1204,9 @@ msgstr ""
msgid "Not enough neighbors"
msgstr ""
msgid "Not mounted - double click to mount"
msgstr ""
msgid "Notification type"
msgstr ""
@ -2002,7 +2005,7 @@ msgstr "Нөл"
msgid "[click to edit]"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "add %n songs"
msgstr ""
@ -2022,7 +2025,7 @@ msgstr ""
msgid "options"
msgstr "опциялар"
#, c-format, qt-plural-format
#, c-format
msgid "remove %n songs"
msgstr ""

View File

@ -11,10 +11,10 @@ msgstr ""
"PO-Revision-Date: 2010-07-24 16:03+0000\n"
"Last-Translator: David Sansome <me@davidsansome.com>\n"
"Language-Team: Lithuanian <lt@li.org>\n"
"Language: lt\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: lt\n"
"X-Launchpad-Export-Date: 2010-07-25 04:26+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
@ -56,15 +56,15 @@ msgstr "%1 takeliai"
msgid "%1: Wiimotedev module"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n failed"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n finished"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n remaining"
msgstr ""
@ -665,7 +665,7 @@ msgstr ""
msgid "Edit..."
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "Editing %n tracks"
msgstr ""
@ -1202,6 +1202,9 @@ msgstr ""
msgid "Not enough neighbors"
msgstr ""
msgid "Not mounted - double click to mount"
msgstr ""
msgid "Notification type"
msgstr ""
@ -2000,7 +2003,7 @@ msgstr ""
msgid "[click to edit]"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "add %n songs"
msgstr ""
@ -2020,7 +2023,7 @@ msgstr ""
msgid "options"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "remove %n songs"
msgstr ""

View File

@ -11,10 +11,10 @@ msgstr ""
"PO-Revision-Date: 2010-08-11 22:42+0000\n"
"Last-Translator: Simen Heggestøyl <simenheg@gmail.com>\n"
"Language-Team: Norwegian Bokmal <nb@li.org>\n"
"Language: nb\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: nb\n"
msgid " ms"
msgstr " ms"
@ -54,15 +54,15 @@ msgstr "%1 spor"
msgid "%1: Wiimotedev module"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n failed"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n finished"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n remaining"
msgstr "%n gjenstående"
@ -663,7 +663,7 @@ msgstr "Rediger informasjon om sporet..."
msgid "Edit..."
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "Editing %n tracks"
msgstr "Endrer %n spor"
@ -1203,6 +1203,9 @@ msgstr "Ikke nok medlemmer"
msgid "Not enough neighbors"
msgstr ""
msgid "Not mounted - double click to mount"
msgstr ""
msgid "Notification type"
msgstr "Meldingstype"
@ -2002,7 +2005,7 @@ msgstr "Null"
msgid "[click to edit]"
msgstr "[klikk for å endre]"
#, c-format, qt-plural-format
#, c-format
msgid "add %n songs"
msgstr ""
@ -2022,7 +2025,7 @@ msgstr ""
msgid "options"
msgstr "innstillinger"
#, c-format, qt-plural-format
#, c-format
msgid "remove %n songs"
msgstr ""

View File

@ -11,10 +11,10 @@ msgstr ""
"PO-Revision-Date: 2010-08-15 07:44+0000\n"
"Last-Translator: A.J. Baudrez <a.baudrez@gmail.com>\n"
"Language-Team: Dutch <nl@li.org>\n"
"Language: nl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: nl\n"
msgid " ms"
msgstr " ms"
@ -54,15 +54,15 @@ msgstr "%1 tracks"
msgid "%1: Wiimotedev module"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n failed"
msgstr "%n mislukt"
#, c-format, qt-plural-format
#, c-format
msgid "%n finished"
msgstr "%n voltooid"
#, c-format, qt-plural-format
#, c-format
msgid "%n remaining"
msgstr "%n te gaan"
@ -675,7 +675,7 @@ msgstr "Trackinformatie bewerken..."
msgid "Edit..."
msgstr "Bewerken..."
#, c-format, qt-plural-format
#, c-format
msgid "Editing %n tracks"
msgstr "%n tracks bewerken"
@ -1223,6 +1223,9 @@ msgstr "Onvoldoende leden"
msgid "Not enough neighbors"
msgstr "Onvoldoende buren"
msgid "Not mounted - double click to mount"
msgstr ""
msgid "Notification type"
msgstr "Notificatietype"
@ -2042,7 +2045,7 @@ msgstr "Nul"
msgid "[click to edit]"
msgstr "[klik om te bewerken:]"
#, c-format, qt-plural-format
#, c-format
msgid "add %n songs"
msgstr "%n nummers toevoegen"
@ -2062,7 +2065,7 @@ msgstr "nummers verplaatsen"
msgid "options"
msgstr "opties"
#, c-format, qt-plural-format
#, c-format
msgid "remove %n songs"
msgstr "%n nummers verwijderen"

View File

@ -11,10 +11,10 @@ msgstr ""
"PO-Revision-Date: 2010-05-21 01:01+0000\n"
"Last-Translator: Cédric VALMARY (Tot en òc) <cvalmary@yahoo.fr>\n"
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: \n"
"X-Launchpad-Export-Date: 2010-05-22 04:09+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
@ -56,15 +56,15 @@ msgstr ""
msgid "%1: Wiimotedev module"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n failed"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n finished"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n remaining"
msgstr ""
@ -665,7 +665,7 @@ msgstr ""
msgid "Edit..."
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "Editing %n tracks"
msgstr ""
@ -1202,6 +1202,9 @@ msgstr ""
msgid "Not enough neighbors"
msgstr ""
msgid "Not mounted - double click to mount"
msgstr ""
msgid "Notification type"
msgstr "Notificacions"
@ -2000,7 +2003,7 @@ msgstr "Zèro"
msgid "[click to edit]"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "add %n songs"
msgstr ""
@ -2020,7 +2023,7 @@ msgstr ""
msgid "options"
msgstr "opcions"
#, c-format, qt-plural-format
#, c-format
msgid "remove %n songs"
msgstr ""

View File

@ -11,10 +11,10 @@ msgstr ""
"PO-Revision-Date: 2010-09-04 20:14+0000\n"
"Last-Translator: David Sansome <me@davidsansome.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: \n"
"X-Language: pl_PL\n"
msgid " ms"
@ -55,15 +55,15 @@ msgstr "%1 ścieżek"
msgid "%1: Wiimotedev module"
msgstr "%1: moduł Wiimotedev"
#, c-format, qt-plural-format
#, c-format
msgid "%n failed"
msgstr "%n zawiodło"
#, c-format, qt-plural-format
#, c-format
msgid "%n finished"
msgstr "%n zakończone"
#, c-format, qt-plural-format
#, c-format
msgid "%n remaining"
msgstr "pozostało %n"
@ -675,7 +675,7 @@ msgstr "Edytuj informacje o utworze..."
msgid "Edit..."
msgstr "Edytuj..."
#, c-format, qt-plural-format
#, c-format
msgid "Editing %n tracks"
msgstr "Edytowanie %n ścieżek"
@ -1222,6 +1222,9 @@ msgstr "Za mało użytkowników"
msgid "Not enough neighbors"
msgstr "Za mało sąsiadów"
msgid "Not mounted - double click to mount"
msgstr ""
msgid "Notification type"
msgstr "Typ powiadomień"
@ -1764,8 +1767,7 @@ msgid ""
"These files will be deleted from the device, are you sure you want to "
"continue?"
msgstr ""
"Te pliki zostaną usunięte z dysku, czy jesteś pewnień że chcesz "
"kontynłować?"
"Te pliki zostaną usunięte z dysku, czy jesteś pewnień że chcesz kontynłować?"
msgid "These folders will be scanned for music to make up your library"
msgstr "Te katalogi będą skanowane w poszukiwaniu muzyki"
@ -2009,8 +2011,8 @@ msgid ""
"wiki</a> for more information.\n"
msgstr ""
"Możesz użyć kontrolerów Wii Remote jako zdalny pilot w Clementine. <a href="
"\"http://www.clementine-player.org/wiimote\"> Zobacz strone wiki dla Clementine"
"</a> w celu uzyskania wiekszej ilości informacji.\n"
"\"http://www.clementine-player.org/wiimote\"> Zobacz strone wiki dla "
"Clementine</a> w celu uzyskania wiekszej ilości informacji.\n"
msgid ""
"You need to launch System Preferences and turn on \"<span style=\" font-"
@ -2037,7 +2039,7 @@ msgstr "Zero"
msgid "[click to edit]"
msgstr "[kliknij aby edytować]"
#, c-format, qt-plural-format
#, c-format
msgid "add %n songs"
msgstr "dodaj %n utworów"
@ -2057,7 +2059,7 @@ msgstr "przenieś utwory"
msgid "options"
msgstr "opcje"
#, c-format, qt-plural-format
#, c-format
msgid "remove %n songs"
msgstr "usuń %n utworów"

View File

@ -11,10 +11,10 @@ msgstr ""
"PO-Revision-Date: 2010-09-01 23:28+0000\n"
"Last-Translator: Sérgio Marques <Unknown>\n"
"Language-Team: Portuguese <pt@li.org>\n"
"Language: pt\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pt\n"
msgid " ms"
msgstr " ms"
@ -54,15 +54,15 @@ msgstr "%1 faixas"
msgid "%1: Wiimotedev module"
msgstr "%1: Módulo Wiimotedev"
#, c-format, qt-plural-format
#, c-format
msgid "%n failed"
msgstr "%n falha(s)"
#, c-format, qt-plural-format
#, c-format
msgid "%n finished"
msgstr "%n concluída(s)"
#, c-format, qt-plural-format
#, c-format
msgid "%n remaining"
msgstr "%n restante(s)"
@ -679,7 +679,7 @@ msgstr "Editar a informação da faixa..."
msgid "Edit..."
msgstr "Editar..."
#, c-format, qt-plural-format
#, c-format
msgid "Editing %n tracks"
msgstr "Editando %n faixas"
@ -1223,6 +1223,9 @@ msgstr "Membros insuficientes"
msgid "Not enough neighbors"
msgstr "Vizinhos insuficientes"
msgid "Not mounted - double click to mount"
msgstr ""
msgid "Notification type"
msgstr "Tipo de notificação"
@ -2040,7 +2043,7 @@ msgstr "Zero"
msgid "[click to edit]"
msgstr "[clique para editar]"
#, c-format, qt-plural-format
#, c-format
msgid "add %n songs"
msgstr "adicionar %n músicas"
@ -2060,7 +2063,7 @@ msgstr "mover músicas"
msgid "options"
msgstr "opções"
#, c-format, qt-plural-format
#, c-format
msgid "remove %n songs"
msgstr "remover %n músicas"

View File

@ -11,10 +11,10 @@ msgstr ""
"PO-Revision-Date: 2010-09-02 14:57+0000\n"
"Last-Translator: jorgelar <Unknown>\n"
"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
"Language: pt_BR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pt_BR\n"
msgid " ms"
msgstr " ms"
@ -54,15 +54,15 @@ msgstr "%1 faixas"
msgid "%1: Wiimotedev module"
msgstr "%1: Módulo de dispositivo Wiimote"
#, c-format, qt-plural-format
#, c-format
msgid "%n failed"
msgstr "%n falhou"
#, c-format, qt-plural-format
#, c-format
msgid "%n finished"
msgstr "%n fizalizado"
#, c-format, qt-plural-format
#, c-format
msgid "%n remaining"
msgstr "%n faltando"
@ -674,7 +674,7 @@ msgstr "Editar informações da faixa..."
msgid "Edit..."
msgstr "Editar..."
#, c-format, qt-plural-format
#, c-format
msgid "Editing %n tracks"
msgstr "Editando %n faixas"
@ -1218,6 +1218,9 @@ msgstr "Sem membros o bastante"
msgid "Not enough neighbors"
msgstr "Sem vizinhos o bastante"
msgid "Not mounted - double click to mount"
msgstr ""
msgid "Notification type"
msgstr "Tipo de notificação"
@ -2024,7 +2027,7 @@ msgstr "Zero"
msgid "[click to edit]"
msgstr "[clique para editar]"
#, c-format, qt-plural-format
#, c-format
msgid "add %n songs"
msgstr "Adicionar %n músicas"
@ -2044,7 +2047,7 @@ msgstr "mover músicas"
msgid "options"
msgstr "opções"
#, c-format, qt-plural-format
#, c-format
msgid "remove %n songs"
msgstr "Remover %n músicas"

View File

@ -11,10 +11,10 @@ msgstr ""
"PO-Revision-Date: 2010-05-03 21:09+0000\n"
"Last-Translator: David Sansome <me@davidsansome.com>\n"
"Language-Team: Romanian <ro@li.org>\n"
"Language: ro\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ro\n"
"X-Launchpad-Export-Date: 2010-05-04 03:52+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
@ -56,15 +56,15 @@ msgstr ""
msgid "%1: Wiimotedev module"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n failed"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n finished"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n remaining"
msgstr ""
@ -665,7 +665,7 @@ msgstr ""
msgid "Edit..."
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "Editing %n tracks"
msgstr ""
@ -1203,6 +1203,9 @@ msgstr "Nu sunt destui membri"
msgid "Not enough neighbors"
msgstr "Nu sunt destui vecini"
msgid "Not mounted - double click to mount"
msgstr ""
msgid "Notification type"
msgstr ""
@ -2001,7 +2004,7 @@ msgstr "Zero"
msgid "[click to edit]"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "add %n songs"
msgstr ""
@ -2021,7 +2024,7 @@ msgstr ""
msgid "options"
msgstr "opțiuni"
#, c-format, qt-plural-format
#, c-format
msgid "remove %n songs"
msgstr ""

View File

@ -10,10 +10,10 @@ msgstr ""
"PO-Revision-Date: 2010-09-04 20:22+0000\n"
"Last-Translator: David Sansome <me@davidsansome.com>\n"
"Language-Team: Russian <kde-russian@lists.kde.ru>\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ru\n"
msgid " ms"
msgstr " мс"
@ -53,15 +53,15 @@ msgstr "%1 композиций"
msgid "%1: Wiimotedev module"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n failed"
msgstr "%n с ошибкой"
#, c-format, qt-plural-format
#, c-format
msgid "%n finished"
msgstr "%n завершено"
#, c-format, qt-plural-format
#, c-format
msgid "%n remaining"
msgstr "%n осталось"
@ -672,7 +672,7 @@ msgstr "Изменить информацию о композиции..."
msgid "Edit..."
msgstr "Изменить..."
#, c-format, qt-plural-format
#, c-format
msgid "Editing %n tracks"
msgstr "Редактирую %n треков"
@ -1216,6 +1216,9 @@ msgstr "Не достаточно участников"
msgid "Not enough neighbors"
msgstr "Недостаточно соседей"
msgid "Not mounted - double click to mount"
msgstr ""
msgid "Notification type"
msgstr "Тип уведомления"
@ -2032,7 +2035,7 @@ msgstr "По-умолчанию"
msgid "[click to edit]"
msgstr "[щелкните, чтобы изменить]"
#, c-format, qt-plural-format
#, c-format
msgid "add %n songs"
msgstr "добавить %n композиций"
@ -2052,7 +2055,7 @@ msgstr "переместить композиции"
msgid "options"
msgstr "настройки"
#, c-format, qt-plural-format
#, c-format
msgid "remove %n songs"
msgstr "удалить %n композиций"

View File

@ -11,10 +11,10 @@ msgstr ""
"PO-Revision-Date: 2010-08-31 08:55+0000\n"
"Last-Translator: DAG Software <Unknown>\n"
"Language-Team: \n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: \n"
"X-Language: sk_SK\n"
msgid " ms"
@ -55,15 +55,15 @@ msgstr "%1 skladieb"
msgid "%1: Wiimotedev module"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n failed"
msgstr "%n zlyhalo"
#, c-format, qt-plural-format
#, c-format
msgid "%n finished"
msgstr "%n dokončených"
#, c-format, qt-plural-format
#, c-format
msgid "%n remaining"
msgstr "%n zostávajúcich"
@ -678,7 +678,7 @@ msgstr "Upravť informácie o skladbe..."
msgid "Edit..."
msgstr "Upraviť..."
#, c-format, qt-plural-format
#, c-format
msgid "Editing %n tracks"
msgstr "Upravovanie %n skladieb"
@ -1221,6 +1221,9 @@ msgstr "Nedostatok členov"
msgid "Not enough neighbors"
msgstr "Nedostatok susedov"
msgid "Not mounted - double click to mount"
msgstr ""
msgid "Notification type"
msgstr "Typ notifikácií"
@ -2037,7 +2040,7 @@ msgstr "Vynulovať"
msgid "[click to edit]"
msgstr "[kliknite pre úpravu]"
#, c-format, qt-plural-format
#, c-format
msgid "add %n songs"
msgstr "pridať %n piesní"
@ -2057,7 +2060,7 @@ msgstr "presunúť piesne"
msgid "options"
msgstr "možnosti"
#, c-format, qt-plural-format
#, c-format
msgid "remove %n songs"
msgstr "odstrániť %n piesní"

View File

@ -11,10 +11,10 @@ msgstr ""
"PO-Revision-Date: 2010-09-04 12:07+0000\n"
"Last-Translator: R33D3M33R <Unknown>\n"
"Language-Team: Slovenian <sl@li.org>\n"
"Language: sl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: sl\n"
msgid " ms"
msgstr " ms"
@ -54,15 +54,15 @@ msgstr "%1 skladb"
msgid "%1: Wiimotedev module"
msgstr "%1: Wimotedev modul"
#, c-format, qt-plural-format
#, c-format
msgid "%n failed"
msgstr "%n spodletelih"
#, c-format, qt-plural-format
#, c-format
msgid "%n finished"
msgstr "%n končanih"
#, c-format, qt-plural-format
#, c-format
msgid "%n remaining"
msgstr "%n preostaja"
@ -677,7 +677,7 @@ msgstr "Uredi podatke o skladbi ..."
msgid "Edit..."
msgstr "Uredi ..."
#, c-format, qt-plural-format
#, c-format
msgid "Editing %n tracks"
msgstr "Urejanje %n skladb"
@ -1221,6 +1221,9 @@ msgstr "Ni dovolj članov"
msgid "Not enough neighbors"
msgstr "Ni dovolj sosedov"
msgid "Not mounted - double click to mount"
msgstr ""
msgid "Notification type"
msgstr "Vrsta obvestila"
@ -2039,7 +2042,7 @@ msgstr "Brez"
msgid "[click to edit]"
msgstr "[kliknite za urejanje]"
#, c-format, qt-plural-format
#, c-format
msgid "add %n songs"
msgstr "dodaj %n skladb"
@ -2059,7 +2062,7 @@ msgstr "premakni skladbe"
msgid "options"
msgstr "možnosti"
#, c-format, qt-plural-format
#, c-format
msgid "remove %n songs"
msgstr "odstrani %n skladb"

View File

@ -11,10 +11,10 @@ msgstr ""
"PO-Revision-Date: 2010-07-24 16:03+0000\n"
"Last-Translator: David Sansome <me@davidsansome.com>\n"
"Language-Team: Serbian <sr@li.org>\n"
"Language: sr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: sr\n"
"X-Launchpad-Export-Date: 2010-07-25 04:26+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
@ -56,15 +56,15 @@ msgstr "%1 нумера"
msgid "%1: Wiimotedev module"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n failed"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n finished"
msgstr "%n завршено"
#, c-format, qt-plural-format
#, c-format
msgid "%n remaining"
msgstr "%n преостало"
@ -667,7 +667,7 @@ msgstr "Уреди податке о нумери..."
msgid "Edit..."
msgstr "Уреди..."
#, c-format, qt-plural-format
#, c-format
msgid "Editing %n tracks"
msgstr "Уређивање %n нумера"
@ -1207,6 +1207,9 @@ msgstr ""
msgid "Not enough neighbors"
msgstr ""
msgid "Not mounted - double click to mount"
msgstr ""
msgid "Notification type"
msgstr "Врста обавештења"
@ -2007,7 +2010,7 @@ msgstr "Нулто"
msgid "[click to edit]"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "add %n songs"
msgstr "додај %n песама"
@ -2027,7 +2030,7 @@ msgstr ""
msgid "options"
msgstr "Опције"
#, c-format, qt-plural-format
#, c-format
msgid "remove %n songs"
msgstr "remove %n песама"

View File

@ -11,10 +11,10 @@ msgstr ""
"PO-Revision-Date: 2010-08-11 22:48+0000\n"
"Last-Translator: David Sansome <me@davidsansome.com>\n"
"Language-Team: Swedish <sv@li.org>\n"
"Language: sv\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: sv\n"
msgid " ms"
msgstr " ms"
@ -54,15 +54,15 @@ msgstr "%1 spår"
msgid "%1: Wiimotedev module"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n failed"
msgstr "%n misslyckades"
#, c-format, qt-plural-format
#, c-format
msgid "%n finished"
msgstr "%n färdig"
#, c-format, qt-plural-format
#, c-format
msgid "%n remaining"
msgstr "%n återstår"
@ -667,7 +667,7 @@ msgstr "Redigera spårinformation..."
msgid "Edit..."
msgstr "Redigera..."
#, c-format, qt-plural-format
#, c-format
msgid "Editing %n tracks"
msgstr "Redigerar %n spår"
@ -1209,6 +1209,9 @@ msgstr "Inte tillräckligt många medlemmar"
msgid "Not enough neighbors"
msgstr "Inte tillräckligt med grannar"
msgid "Not mounted - double click to mount"
msgstr ""
msgid "Notification type"
msgstr "Underrättelsetyp"
@ -2020,7 +2023,7 @@ msgstr "Noll"
msgid "[click to edit]"
msgstr "[klicka för att redigera]"
#, c-format, qt-plural-format
#, c-format
msgid "add %n songs"
msgstr "Lägg till %n songer"
@ -2040,7 +2043,7 @@ msgstr "Flytta songer"
msgid "options"
msgstr "alternativ"
#, c-format, qt-plural-format
#, c-format
msgid "remove %n songs"
msgstr "Ta bort %n songer"

View File

@ -11,10 +11,10 @@ msgstr ""
"PO-Revision-Date: 2010-08-31 07:52+0000\n"
"Last-Translator: Cihan Ersoy <Unknown>\n"
"Language-Team: Turkish <tr@li.org>\n"
"Language: tr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: tr\n"
msgid " ms"
msgstr " ms"
@ -54,15 +54,15 @@ msgstr "%1 parça"
msgid "%1: Wiimotedev module"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n failed"
msgstr "%n başarısız"
#, c-format, qt-plural-format
#, c-format
msgid "%n finished"
msgstr "%n tamamlandı"
#, c-format, qt-plural-format
#, c-format
msgid "%n remaining"
msgstr "%n kalan"
@ -663,7 +663,7 @@ msgstr "Parça bilgisini düzenle..."
msgid "Edit..."
msgstr "Düzenle..."
#, c-format, qt-plural-format
#, c-format
msgid "Editing %n tracks"
msgstr ""
@ -1206,6 +1206,9 @@ msgstr "Yeterli üye yok"
msgid "Not enough neighbors"
msgstr "Yeterli komşu yok"
msgid "Not mounted - double click to mount"
msgstr ""
msgid "Notification type"
msgstr "Bildirim türü"
@ -2004,7 +2007,7 @@ msgstr ""
msgid "[click to edit]"
msgstr "[düzenlemek için tıklayın]"
#, c-format, qt-plural-format
#, c-format
msgid "add %n songs"
msgstr "%n şakıyı ekle"
@ -2024,7 +2027,7 @@ msgstr "Parçaları taşı"
msgid "options"
msgstr "seçenekler"
#, c-format, qt-plural-format
#, c-format
msgid "remove %n songs"
msgstr "%n şakıyı çıkart"

View File

@ -46,15 +46,15 @@ msgstr ""
msgid "%1: Wiimotedev module"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n failed"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n finished"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n remaining"
msgstr ""
@ -655,7 +655,7 @@ msgstr ""
msgid "Edit..."
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "Editing %n tracks"
msgstr ""
@ -1192,6 +1192,9 @@ msgstr ""
msgid "Not enough neighbors"
msgstr ""
msgid "Not mounted - double click to mount"
msgstr ""
msgid "Notification type"
msgstr ""
@ -1990,7 +1993,7 @@ msgstr ""
msgid "[click to edit]"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "add %n songs"
msgstr ""
@ -2010,7 +2013,7 @@ msgstr ""
msgid "options"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "remove %n songs"
msgstr ""

View File

@ -11,10 +11,10 @@ msgstr ""
"PO-Revision-Date: 2010-09-04 07:57+0000\n"
"Last-Translator: Sergiy Gavrylov <sergiovana@bigmir.net>\n"
"Language-Team: Ukrainian <uk@li.org>\n"
"Language: uk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: uk\n"
msgid " ms"
msgstr " мс"
@ -54,15 +54,15 @@ msgstr "%1 доріжок"
msgid "%1: Wiimotedev module"
msgstr "%1: Модуль Wiimotedev"
#, c-format, qt-plural-format
#, c-format
msgid "%n failed"
msgstr "%n з помилкою"
#, c-format, qt-plural-format
#, c-format
msgid "%n finished"
msgstr "%n завершено"
#, c-format, qt-plural-format
#, c-format
msgid "%n remaining"
msgstr "%n залишилось"
@ -677,7 +677,7 @@ msgstr "Редагувати дані про доріжку..."
msgid "Edit..."
msgstr "Змінити..."
#, c-format, qt-plural-format
#, c-format
msgid "Editing %n tracks"
msgstr "Редагування %n доріжок"
@ -1221,6 +1221,9 @@ msgstr "Не достатньо учасників"
msgid "Not enough neighbors"
msgstr "Недостатньо сусідів"
msgid "Not mounted - double click to mount"
msgstr ""
msgid "Notification type"
msgstr "Тип повідомлення"
@ -2033,7 +2036,7 @@ msgstr "Zero"
msgid "[click to edit]"
msgstr "[клацніть, щоб змінити]"
#, c-format, qt-plural-format
#, c-format
msgid "add %n songs"
msgstr "додати %n композицій"
@ -2053,7 +2056,7 @@ msgstr "перемістити композиції"
msgid "options"
msgstr "параметри"
#, c-format, qt-plural-format
#, c-format
msgid "remove %n songs"
msgstr "вилучити %n композицій"

View File

@ -11,10 +11,10 @@ msgstr ""
"PO-Revision-Date: 2010-06-07 01:43+0000\n"
"Last-Translator: David Sansome <me@davidsansome.com>\n"
"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: \n"
"X-Launchpad-Export-Date: 2010-06-08 03:51+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
@ -56,15 +56,15 @@ msgstr ""
msgid "%1: Wiimotedev module"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n failed"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n finished"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n remaining"
msgstr ""
@ -665,7 +665,7 @@ msgstr ""
msgid "Edit..."
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "Editing %n tracks"
msgstr ""
@ -1202,6 +1202,9 @@ msgstr ""
msgid "Not enough neighbors"
msgstr ""
msgid "Not mounted - double click to mount"
msgstr ""
msgid "Notification type"
msgstr ""
@ -2000,7 +2003,7 @@ msgstr ""
msgid "[click to edit]"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "add %n songs"
msgstr ""
@ -2020,7 +2023,7 @@ msgstr ""
msgid "options"
msgstr "选项"
#, c-format, qt-plural-format
#, c-format
msgid "remove %n songs"
msgstr ""

View File

@ -11,10 +11,10 @@ msgstr ""
"PO-Revision-Date: 2010-09-04 20:24+0000\n"
"Last-Translator: David Sansome <me@davidsansome.com>\n"
"Language-Team: Chinese (Traditional) <zh_TW@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: \n"
msgid " ms"
msgstr " 毫秒"
@ -54,15 +54,15 @@ msgstr "%1 歌曲"
msgid "%1: Wiimotedev module"
msgstr ""
#, c-format, qt-plural-format
#, c-format
msgid "%n failed"
msgstr "%n 失敗的"
#, c-format, qt-plural-format
#, c-format
msgid "%n finished"
msgstr "%n 完成的"
#, c-format, qt-plural-format
#, c-format
msgid "%n remaining"
msgstr "%n 剩餘的"
@ -667,7 +667,7 @@ msgstr "編輯歌曲資訊..."
msgid "Edit..."
msgstr "編輯..."
#, c-format, qt-plural-format
#, c-format
msgid "Editing %n tracks"
msgstr "編輯 %n 歌曲"
@ -1205,6 +1205,9 @@ msgstr "沒有足夠的成員"
msgid "Not enough neighbors"
msgstr "沒有足夠的鄰居"
msgid "Not mounted - double click to mount"
msgstr ""
msgid "Notification type"
msgstr "通知型式"
@ -2005,7 +2008,7 @@ msgstr ""
msgid "[click to edit]"
msgstr "[點擊以編輯]"
#, c-format, qt-plural-format
#, c-format
msgid "add %n songs"
msgstr "加入 %n 歌"
@ -2025,7 +2028,7 @@ msgstr "移動歌曲"
msgid "options"
msgstr "選項"
#, c-format, qt-plural-format
#, c-format
msgid "remove %n songs"
msgstr "移除 %n 歌"