static GtkToggleActionEntry pref_toggle_entries[] =
{
- { "alt-speed-enabled", NULL, N_( "Speed _Limit Mode" ), NULL, NULL, G_CALLBACK( toggle_pref_cb ), FALSE },
+ { "alt-speed-enabled", NULL, N_( "Temporary Speed _Limits" ), NULL, NULL, G_CALLBACK( toggle_pref_cb ), FALSE },
{ "minimal-view", NULL, N_( "_Minimal View" ), "<alt>M", NULL, G_CALLBACK( toggle_pref_cb ), FALSE },
{ "sort-reversed", NULL, N_( "_Reverse Sort Order" ), NULL, NULL, G_CALLBACK( toggle_pref_cb ), FALSE },
{ "show-filterbar", NULL, N_( "_Filterbar" ), NULL, NULL, G_CALLBACK( toggle_pref_cb ), FALSE },
guint seedCustomSpinTag;
guint maxPeersSpinTag;
+ GtkWidget * size_lb;
GtkWidget * state_lb;
- GtkWidget * progress_lb;
GtkWidget * have_lb;
GtkWidget * dl_lb;
GtkWidget * ul_lb;
- GtkWidget * failed_lb;
GtkWidget * ratio_lb;
GtkWidget * error_lb;
- GtkWidget * swarm_lb;
- GtkWidget * date_added_lb;
+ GtkWidget * date_started_lb;
GtkWidget * last_activity_lb;
- GtkWidget * pieces_lb;
GtkWidget * hash_lb;
GtkWidget * privacy_lb;
- GtkWidget * creator_lb;
- GtkWidget * date_created_lb;
+ GtkWidget * origin_lb;
GtkWidget * destination_lb;
- GtkWidget * torrentfile_lb;
GtkTextBuffer * comment_buffer;
GHashTable * peer_hash;
GSList * ids;
TrCore * core;
guint periodic_refresh_tag;
- guint prefs_changed_tag;
};
static tr_torrent**
torrent_set_int( di, "peer-limit", gtk_spin_button_get_value( s ) );
}
-static char*
-get_global_ratio_radiobutton_string( void )
-{
- char * s;
- const gboolean b = pref_flag_get( TR_PREFS_KEY_RATIO_ENABLED );
- const double d = pref_double_get( TR_PREFS_KEY_RATIO );
-
- if( b )
- s = g_strdup_printf( _( "Use _Global setting (currently: stop seeding when a torrent's ratio reaches %.2f)" ), d );
- else
- s = g_strdup( _( "Use _Global setting (currently: seed regardless of ratio)" ) );
-
- return s;
-}
-
-static void
-prefsChanged( TrCore * core UNUSED, const char * key, gpointer rb )
-{
- if( !strcmp( key, TR_PREFS_KEY_RATIO_ENABLED ) ||
- !strcmp( key, TR_PREFS_KEY_RATIO ) )
- {
- char * s = get_global_ratio_radiobutton_string( );
- gtk_button_set_label( GTK_BUTTON( rb ), s );
- g_free( s );
- }
-}
-
static void
onPriorityChanged( GtkComboBox * w, struct DetailsImpl * di )
{
d->upLimitSpin = w;
w = new_priority_combo( d );
- hig_workarea_add_row( t, &row, _( "_Bandwidth priority:" ), w, NULL );
+ hig_workarea_add_row( t, &row, _( "Torrent _priority:" ), w, NULL );
d->bandwidthCombo = w;
hig_workarea_add_section_divider( t, &row );
hig_workarea_add_section_title( t, &row, _( "Seed-Until Ratio" ) );
group = NULL;
- s = get_global_ratio_radiobutton_string( );
+ s = _( "Use _global setting" );
w = gtk_radio_button_new_with_mnemonic( group, s );
- tag = g_signal_connect( d->core, "prefs-changed", G_CALLBACK( prefsChanged ), w );
- d->prefs_changed_tag = tag;
group = gtk_radio_button_get_group( GTK_RADIO_BUTTON( w ) );
hig_workarea_add_wide_control( t, &row, w );
- g_free( s );
g_object_set_data( G_OBJECT( w ), RATIO_KEY, GINT_TO_POINTER( TR_RATIOLIMIT_GLOBAL ) );
tag = g_signal_connect( w, "toggled", G_CALLBACK( ratio_mode_changed_cb ), d );
d->seedGlobalRadio = w;
d->seedForeverRadioTag = tag;
h = gtk_hbox_new( FALSE, GUI_PAD );
- w = gtk_radio_button_new_with_mnemonic( group, _( "_Stop seeding when a torrent's ratio reaches" ) );
+ s = _( "_Seed torrent until its ratio reaches:" );
+ w = gtk_radio_button_new_with_mnemonic( group, s );
d->seedCustomRadio = w;
g_object_set_data( G_OBJECT( w ), RATIO_KEY, GINT_TO_POINTER( TR_RATIOLIMIT_SINGLE ) );
tag = g_signal_connect( w, "toggled", G_CALLBACK( ratio_mode_changed_cb ), d );
/****
*****
-***** ACTIVITY TAB
+***** INFO TAB
*****
****/
}
static void
-refreshActivity( struct DetailsImpl * di, tr_torrent ** torrents, int n )
+refreshInfo( struct DetailsImpl * di, tr_torrent ** torrents, int n )
{
int i;
const char * str;
const char * mixed = _( "Mixed" );
char buf[512];
const tr_stat ** stats = g_new( const tr_stat*, n );
- for( i=0; i<n; ++i )
+ const tr_info ** infos = g_new( const tr_info*, n );
+ for( i=0; i<n; ++i ) {
stats[i] = tr_torrentStatCached( torrents[i] );
+ infos[i] = tr_torrentInfo( torrents[i] );
+ }
+
+ /* privacy_lb */
+ if( n<=0 )
+ str = none;
+ else {
+ const tr_bool baseline = infos[0]->isPrivate;
+ for( i=1; i<n; ++i )
+ if( baseline != infos[i]->isPrivate )
+ break;
+ if( i!=n )
+ str = mixed;
+ else if( baseline )
+ str = _( "Private to this tracker -- DHT and PEX disabled" );
+ else
+ str = _( "Public torrent" );
+ }
+ gtk_label_set_text( GTK_LABEL( di->privacy_lb ), str );
+
+
+ /* origin_lb */
+ if( n<=0 )
+ str = none;
+ else {
+ char datestr[64];
+ const char * creator = infos[0]->creator ? infos[0]->creator : "";
+ const time_t date = infos[0]->dateCreated;
+ gboolean mixed_creator = FALSE;
+ gboolean mixed_date = FALSE;
+ gtr_localtime2( datestr, date, sizeof( datestr ) );
+ for( i=1; i<n; ++i ) {
+ mixed_creator |= strcmp( creator, infos[i]->creator ? infos[i]->creator : "" );
+ mixed_date |= ( date != infos[i]->dateCreated );
+ }
+ if( mixed_date && mixed_creator )
+ str = mixed;
+ else if( mixed_date )
+ g_snprintf( buf, sizeof( buf ), _( "Created by %1$s" ), creator );
+ else if( mixed_creator || !*creator )
+ g_snprintf( buf, sizeof( buf ), _( "Created on %1$s" ), datestr );
+ else
+ g_snprintf( buf, sizeof( buf ), _( "Created by %1$s on %2$s" ), creator, datestr );
+ str = buf;
+ }
+ gtk_label_set_text( GTK_LABEL( di->origin_lb ), str );
+
+
+ /* comment_buffer */
+ if( n<=0 )
+ str = "";
+ else {
+ const char * baseline = infos[0]->comment ? infos[0]->comment : "";
+ for( i=1; i<n; ++i )
+ if( strcmp( baseline, infos[i]->comment ? infos[i]->comment : "" ) )
+ break;
+ if( i==n )
+ str = baseline;
+ else
+ str = mixed;
+ }
+ gtk_text_buffer_set_text( di->comment_buffer, str, -1 );
+
+ /* destination_lb */
+ if( n<=0 )
+ str = none;
+ else {
+ const char * baseline = tr_torrentGetDownloadDir( torrents[0] );
+ for( i=1; i<n; ++i )
+ if( strcmp( baseline, tr_torrentGetDownloadDir( torrents[i] ) ) )
+ break;
+ if( i==n )
+ str = baseline;
+ else
+ str = mixed;
+ }
+ gtk_label_set_text( GTK_LABEL( di->destination_lb ), str );
/* state_lb */
if( n <= 0 )
gtk_label_set_text( GTK_LABEL( di->state_lb ), str );
- /* progress_lb */
+ /* date started */
if( n <= 0 )
str = none;
else {
- double sizeWhenDone = 0;
- double leftUntilDone = 0;
+ const time_t baseline = stats[0]->startDate;
+ for( i=1; i<n; ++i )
+ if( baseline != stats[i]->startDate )
+ break;
+ if( i!=n )
+ str = mixed;
+ else if( ( baseline<=0 ) || ( stats[0]->activity == TR_STATUS_STOPPED ) )
+ str = activityString( TR_STATUS_STOPPED );
+ else
+ str = tr_strltime( buf, time(NULL)-baseline, sizeof( buf ) );
+ }
+ gtk_label_set_text( GTK_LABEL( di->date_started_lb ), str );
+
+
+ /* size_lb */
+ {
+ char sizebuf[128];
+ uint64_t size = 0;
+ int pieces = 0;
+ int32_t pieceSize = 0;
for( i=0; i<n; ++i ) {
- sizeWhenDone += stats[i]->sizeWhenDone;
- leftUntilDone += stats[i]->leftUntilDone;
+ size += infos[i]->totalSize;
+ pieces += infos[i]->pieceCount;
+ if( !pieceSize )
+ pieceSize = infos[i]->pieceSize;
+ else if( pieceSize != (int)infos[i]->pieceSize )
+ pieceSize = -1;
}
- g_snprintf( buf, sizeof( buf ), _( "%.1f%%" ), 100.0*((sizeWhenDone-leftUntilDone)/sizeWhenDone) );
- str = buf;
+ tr_strlsize( sizebuf, size, sizeof( sizebuf ) );
+ if( !size )
+ str = none;
+ else if( pieceSize >= 0 ) {
+ char piecebuf[128];
+ tr_strlsize( piecebuf, (uint64_t)pieceSize, sizeof( piecebuf ) );
+ g_snprintf( buf, sizeof( buf ),
+ ngettext( "%1$s (%2$'d piece @ %3$s)",
+ "%1$s (%2$'d pieces @ %3$s)", pieces ),
+ sizebuf, pieces, piecebuf );
+ str = buf;
+ } else {
+ g_snprintf( buf, sizeof( buf ),
+ ngettext( "%1$s (%2$'d piece)",
+ "%1$s (%2$'d pieces)", pieces ),
+ sizebuf, pieces );
+ str = buf;
+ }
+ gtk_label_set_text( GTK_LABEL( di->size_lb ), str );
}
- gtk_label_set_text( GTK_LABEL( di->progress_lb ), str );
/* have_lb */
if( n <= 0 )
str = none;
else {
- char buf1[128];
- char buf2[128];
+ double sizeWhenDone = 0;
+ double leftUntilDone = 0;
double haveUnchecked = 0;
double haveValid = 0;
double verifiedPieces = 0;
haveUnchecked += stats[i]->haveUnchecked;
haveValid += v;
verifiedPieces += v / tr_torrentInfo(torrents[i])->pieceSize;
+ sizeWhenDone += stats[i]->sizeWhenDone;
+ leftUntilDone += stats[i]->leftUntilDone;
+ }
+ if( !haveValid && !haveUnchecked )
+ str = none;
+ else {
+ char pct[16], ver[64];
+ double n = 100.0 * ( sizeWhenDone - leftUntilDone );
+ g_snprintf( pct, sizeof( pct ), _( "%.1f%%" ), n/sizeWhenDone );
+ tr_strlsize( ver, haveValid, sizeof( ver ) );
+ if( !haveUnchecked )
+ g_snprintf( buf, sizeof(buf), _( "%1$s (%2$s verified)" ), pct, ver );
+ else {
+ char u[64];
+ tr_strlsize( u, haveUnchecked, sizeof( u ) );
+ g_snprintf( buf, sizeof(buf), _( "%1$s (%2$s verified, %3$s unverified)" ), pct, ver, u );
+ }
+ str = buf;
}
- tr_strlsize( buf1, haveValid + haveUnchecked, sizeof( buf1 ) );
- tr_strlsize( buf2, haveValid, sizeof( buf2 ) );
- i = (int) ceil( verifiedPieces );
- g_snprintf( buf, sizeof( buf ), ngettext( "%1$s (%2$s verified in %3$d piece)",
- "%1$s (%2$s verified in %3$d pieces)",
- verifiedPieces ),
- buf1, buf2, i );
- str = buf;
}
gtk_label_set_text( GTK_LABEL( di->have_lb ), str );
if( n <= 0 )
str = none;
else {
- uint64_t sum = 0;
- for( i=0; i<n; ++i ) sum += stats[i]->downloadedEver;
- str = tr_strlsize( buf, sum, sizeof( buf ) );
+ char dbuf[64], fbuf[64];
+ uint64_t d=0, f=0;
+ for( i=0; i<n; ++i ) {
+ d += stats[i]->downloadedEver;
+ f += stats[i]->corruptEver;
+ }
+ tr_strlsize( dbuf, d, sizeof( dbuf ) );
+ tr_strlsize( fbuf, f, sizeof( fbuf ) );
+ if( f )
+ g_snprintf( buf, sizeof( buf ), _( "%1$s (+%2$s corrupt)" ), dbuf, fbuf );
+ else
+ tr_strlcpy( buf, dbuf, sizeof( buf ) );
+ str = buf;
}
gtk_label_set_text( GTK_LABEL( di->dl_lb ), str );
gtk_label_set_text( GTK_LABEL( di->ul_lb ), str );
- /* corrupt ever */
- if( n <= 0 )
- str = none;
- else {
- uint64_t sum = 0;
- for( i=0; i<n; ++i ) sum += stats[i]->corruptEver;
- str = tr_strlsize( buf, sum, sizeof( buf ) );
- }
- gtk_label_set_text( GTK_LABEL( di->failed_lb ), str );
-
-
/* ratio */
if( n <= 0 )
str = none;
}
gtk_label_set_text( GTK_LABEL( di->ratio_lb ), str );
-
- /* swarmspeed */
- if( n <= 0 )
+ /* hash_lb */
+ if( n<=0 )
str = none;
- else {
- double swarmSpeed = 0;
- for( i=0; i<n; ++i )
- swarmSpeed += stats[i]->swarmSpeed;
- str = tr_strlspeed( buf, swarmSpeed, sizeof( buf ) );
- }
- gtk_label_set_text( GTK_LABEL( di->swarm_lb ), str );
-
+ else if ( n==1 )
+ str = infos[0]->hashString;
+ else
+ str = mixed;
+ gtk_label_set_text( GTK_LABEL( di->hash_lb ), str );
/* error */
if( n <= 0 )
gtk_label_set_text( GTK_LABEL( di->error_lb ), str );
- /* date added */
- if( n <= 0 )
- str = none;
- else {
- const time_t baseline = stats[0]->addedDate;
- for( i=1; i<n; ++i )
- if( baseline != stats[i]->addedDate )
- break;
- if( i==n )
- str = gtr_localtime2( buf, baseline, sizeof( buf ) );
- else
- str = mixed;
- }
- gtk_label_set_text( GTK_LABEL( di->date_added_lb ), str );
-
-
/* activity date */
if( n <= 0 )
str = none;
else {
- const time_t baseline = stats[0]->activityDate;
- for( i=1; i<n; ++i )
- if( baseline != stats[i]->activityDate )
- break;
- if( i==n )
- str = gtr_localtime2( buf, baseline, sizeof( buf ) );
- else
- str = mixed;
+ time_t latest = 0;
+ for( i=0; i<n; ++i )
+ if( latest < stats[i]->activityDate )
+ latest = stats[i]->activityDate;
+ if( latest <= 0 )
+ str = none;
+ else {
+ const int period = time( NULL ) - latest;
+ if( period < 5 )
+ tr_strlcpy( buf, _( "Active now" ), sizeof( buf ) );
+ else {
+ char tbuf[128];
+ tr_strltime( tbuf, period, sizeof( tbuf ) );
+ g_snprintf( buf, sizeof( buf ), _( "%1$s ago" ), tbuf );
+ }
+ str = buf;
+ }
}
gtk_label_set_text( GTK_LABEL( di->last_activity_lb ), str );
g_free( stats );
+ g_free( infos );
}
static GtkWidget*
-activity_page_new( struct DetailsImpl * di )
+info_page_new( struct DetailsImpl * di )
{
- int row = 0;
- GtkWidget * l;
- GtkWidget * t = hig_workarea_create( );
-
- hig_workarea_add_section_title( t, &row, _( "Transfer" ) );
-
- l = di->state_lb = gtk_label_new( NULL );
- hig_workarea_add_row( t, &row, _( "State:" ), l, NULL );
+ int row = 0;
+ GtkTextBuffer * b;
+ GtkWidget *l, *w, *fr, *sw;
+ GtkWidget *t = hig_workarea_create( );
- l = di->progress_lb = gtk_label_new( NULL );
- hig_workarea_add_row( t, &row, _( "Progress:" ), l, NULL );
+ hig_workarea_add_section_title( t, &row, _( "Activity" ) );
- l = di->have_lb = gtk_label_new( NULL );
- /* "Have" refers to how much of the torrent we have */
- hig_workarea_add_row( t, &row, _( "Have:" ), l, NULL );
+ /* size */
+ l = di->size_lb = gtk_label_new( NULL );
+ hig_workarea_add_row( t, &row, _( "Torrent size:" ), l, NULL );
- l = di->dl_lb = gtk_label_new( NULL );
- hig_workarea_add_row( t, &row, _( "Downloaded:" ), l, NULL );
+ /* have */
+ l = di->have_lb = gtk_label_new( NULL );
+ hig_workarea_add_row( t, &row, _( "Have:" ), l, NULL );
- l = di->ul_lb = gtk_label_new( NULL );
- hig_workarea_add_row( t, &row, _( "Uploaded:" ), l, NULL );
+ /* downloaded */
+ l = di->dl_lb = gtk_label_new( NULL );
+ hig_workarea_add_row( t, &row, _( "Downloaded:" ), l, NULL );
- /* how much downloaded data was corrupt */
- l = di->failed_lb = gtk_label_new( NULL );
- hig_workarea_add_row( t, &row, _( "Failed DL:" ), l, NULL );
+ /* uploaded */
+ l = di->ul_lb = gtk_label_new( NULL );
+ hig_workarea_add_row( t, &row, _( "Uploaded:" ), l, NULL );
- l = di->ratio_lb = gtk_label_new( NULL );
- hig_workarea_add_row( t, &row, _( "Ratio:" ), l, NULL );
+ /* ratio */
+ l = di->ratio_lb = gtk_label_new( NULL );
+ hig_workarea_add_row( t, &row, _( "Ratio:" ), l, NULL );
- l = di->swarm_lb = gtk_label_new( NULL );
- hig_workarea_add_row( t, &row, _( "Swarm speed:" ), l, NULL );
+ /* state */
+ l = di->state_lb = gtk_label_new( NULL );
+ hig_workarea_add_row( t, &row, _( "State:" ), l, NULL );
- l = di->error_lb = gtk_label_new( NULL );
- hig_workarea_add_row( t, &row, _( "Error:" ), l, NULL );
+ /* running for */
+ l = di->date_started_lb = gtk_label_new( NULL );
+ hig_workarea_add_row( t, &row, _( "Running time:" ), l, NULL );
- hig_workarea_add_section_divider( t, &row );
- hig_workarea_add_section_title( t, &row, _( "Dates" ) );
+ /* last activity */
+ l = di->last_activity_lb = gtk_label_new( NULL );
+ hig_workarea_add_row( t, &row, _( "Last activity:" ), l, NULL );
- l = di->date_added_lb = gtk_label_new( NULL );
- hig_workarea_add_row( t, &row, _( "Started at:" ), l, NULL );
+ /* error */
+ l = di->error_lb = gtk_label_new( NULL );
+ hig_workarea_add_row( t, &row, _( "Error:" ), l, NULL );
- l = di->last_activity_lb = gtk_label_new( NULL );
- hig_workarea_add_row( t, &row, _( "Last activity at:" ), l, NULL );
hig_workarea_add_section_divider( t, &row );
- hig_workarea_finish( t, &row );
- return t;
-}
-
-/****
-*****
-***** INFO TAB
-*****
-****/
-
-static void
-refreshInfo( struct DetailsImpl * di, tr_torrent ** torrents, int n )
-{
- int i;
- char buf[128];
- const char * str;
- const char * none = _( "None" );
- const char * mixed = _( "Mixed" );
- const char * unknown = _( "Unknown" );
- const tr_info ** infos = g_new( const tr_info*, n );
-
- /* info */
- for( i=0; i<n; ++i )
- infos[i] = tr_torrentInfo( torrents[i] );
-
- /* pieces_lb */
- if( n <= 0 )
- str = none;
- else {
- int sum = 0;
- const int baseline = infos[0]->pieceSize;
- for( i=0; i<n; ++i )
- sum += infos[i]->pieceCount;
- g_snprintf( buf, sizeof( buf ),
- ngettext( "%'d Piece", "%'d Pieces", sum ), sum );
- for( i=1; i<n; ++i )
- if( baseline != (int)infos[i]->pieceSize )
- break;
- if( i==n ) {
- char tmp1[64];
- char tmp2[64];
- g_strlcpy( tmp1, buf, sizeof( tmp1 ) );
- tr_strlsize( tmp2, baseline, sizeof( tmp2 ) );
- g_snprintf( buf, sizeof( buf ), _( "%1$s @ %2$s" ), tmp1, tmp2 );
- }
- str = buf;
- }
- gtk_label_set_text( GTK_LABEL( di->pieces_lb ), str );
-
-
- /* hash_lb */
- if( n<=0 )
- str = none;
- else if ( n==1 )
- str = infos[0]->hashString;
- else
- str = mixed;
- gtk_label_set_text( GTK_LABEL( di->hash_lb ), str );
-
-
- /* privacy_lb */
- if( n<=0 )
- str = none;
- else {
- const tr_bool baseline = infos[0]->isPrivate;
- for( i=1; i<n; ++i )
- if( baseline != infos[i]->isPrivate )
- break;
- if( i!=n )
- str = mixed;
- else if( baseline )
- str = _( "Private to this tracker -- DHT and PEX disabled" );
- else
- str = _( "Public torrent" );
- }
- gtk_label_set_text( GTK_LABEL( di->privacy_lb ), str );
-
-
- /* comment_buffer */
- if( n<=0 )
- str = "";
- else {
- const char * baseline = infos[0]->comment ? infos[0]->comment : "";
- for( i=1; i<n; ++i )
- if( strcmp( baseline, infos[i]->comment ? infos[i]->comment : "" ) )
- break;
- if( i==n )
- str = baseline;
- else
- str = mixed;
- }
- gtk_text_buffer_set_text( di->comment_buffer, str, -1 );
-
-
- /* creator_lb */
- if( n<=0 )
- str = none;
- else {
- const char * baseline = infos[0]->creator ? infos[0]->creator : "";
- for( i=1; i<n; ++i )
- if( strcmp( baseline, infos[i]->creator ? infos[i]->creator : "" ) )
- break;
- if( i==n )
- str = baseline;
- else
- str = mixed;
- }
- if( !str || !*str )
- str = unknown;
- gtk_label_set_text( GTK_LABEL( di->creator_lb ), str );
-
-
- /* date_created_lb */
- if( n<=0 )
- str = none;
- else {
- const time_t baseline = infos[0]->dateCreated;
- for( i=1; i<n; ++i )
- if( baseline != infos[i]->dateCreated )
- break;
- if( i==n )
- str = gtr_localtime2( buf, baseline, sizeof( buf ) );
- else
- str = mixed;
- }
- gtk_label_set_text( GTK_LABEL( di->date_created_lb ), str );
-
-
- /* destination_lb */
- if( n<=0 )
- str = none;
- else {
- const char * baseline = tr_torrentGetDownloadDir( torrents[0] );
- for( i=1; i<n; ++i )
- if( strcmp( baseline, tr_torrentGetDownloadDir( torrents[i] ) ) )
- break;
- if( i==n )
- str = baseline;
- else
- str = mixed;
- }
- gtk_label_set_text( GTK_LABEL( di->destination_lb ), str );
-
-
- /* torrentfile_lb */
- if( n<=0 )
- str = none;
- else if( n==1 )
- str = infos[0]->torrent;
- else
- str = mixed;
- gtk_label_set_text( GTK_LABEL( di->torrentfile_lb ), str );
-
- g_free( infos );
-}
-
-static GtkWidget*
-info_page_new( struct DetailsImpl * di )
-{
- int row = 0;
- GtkTextBuffer * b;
- GtkWidget *l, *w, *fr, *sw;
- GtkWidget *t = hig_workarea_create( );
-
hig_workarea_add_section_title( t, &row, _( "Details" ) );
- /* pieces */
- l = di->pieces_lb = gtk_label_new( NULL );
- hig_workarea_add_row( t, &row, _( "Pieces:" ), l, NULL );
+ /* destination */
+ l = g_object_new( GTK_TYPE_LABEL, "selectable", TRUE,
+ "ellipsize", PANGO_ELLIPSIZE_END,
+ NULL );
+ hig_workarea_add_row( t, &row, _( "Location:" ), l, NULL );
+ di->destination_lb = l;
/* hash */
l = g_object_new( GTK_TYPE_LABEL, "selectable", TRUE,
hig_workarea_add_row( t, &row, _( "Privacy:" ), l, NULL );
di->privacy_lb = l;
+ /* origins */
+ l = gtk_label_new( NULL );
+ hig_workarea_add_row( t, &row, _( "Origin:" ), l, NULL );
+ di->origin_lb = l;
+
/* comment */
b = di->comment_buffer = gtk_text_buffer_new( NULL );
w = gtk_text_view_new_with_buffer( b );
- gtk_widget_set_size_request( w, 0u, 100u );
+ gtk_widget_set_size_request( w, 350u, 50u );
gtk_text_view_set_wrap_mode( GTK_TEXT_VIEW( w ), GTK_WRAP_WORD );
gtk_text_view_set_editable( GTK_TEXT_VIEW( w ), FALSE );
sw = gtk_scrolled_window_new( NULL, NULL );
gtk_misc_set_alignment( GTK_MISC( w ), 0.0f, 0.0f );
hig_workarea_add_section_divider( t, &row );
- hig_workarea_add_section_title( t, &row, _( "Origins" ) );
-
- l = di->creator_lb = gtk_label_new( NULL );
- gtk_label_set_ellipsize( GTK_LABEL( l ), PANGO_ELLIPSIZE_END );
- hig_workarea_add_row( t, &row, _( "Creator:" ), l, NULL );
-
- l = di->date_created_lb = gtk_label_new( NULL );
- hig_workarea_add_row( t, &row, _( "Date:" ), l, NULL );
-
- hig_workarea_add_section_divider( t, &row );
- hig_workarea_add_section_title( t, &row, _( "Location" ) );
-
- l = g_object_new( GTK_TYPE_LABEL, "selectable", TRUE,
- "ellipsize", PANGO_ELLIPSIZE_END,
- NULL );
- hig_workarea_add_row( t, &row, _( "Destination:" ), l, NULL );
- di->destination_lb = l;
-
- l = g_object_new( GTK_TYPE_LABEL, "selectable", TRUE,
- "ellipsize", PANGO_ELLIPSIZE_END,
- NULL );
- hig_workarea_add_row( t, &row, _( "Torrent file:" ), l, NULL );
- di->torrentfile_lb = l;
+ hig_workarea_finish( t, &row );
+ return t;
hig_workarea_finish( t, &row );
return t;
refreshPeers( di, torrents, n );
refreshTracker( di, torrents, n );
refreshOptions( di, torrents, n );
- refreshActivity( di, torrents, n );
g_free( torrents );
}
details_free( gpointer gdata )
{
struct DetailsImpl * data = gdata;
- g_signal_handler_disconnect( data->core, data->prefs_changed_tag );
g_source_remove( data->periodic_refresh_tag );
g_hash_table_destroy( data->webseed_hash );
g_slist_free( data->ids );
n = gtk_notebook_new( );
gtk_container_set_border_width( GTK_CONTAINER( n ), GUI_PAD );
- w = activity_page_new( di );
- l = gtk_label_new( _( "Activity" ) );
+ w = info_page_new( di );
+ l = gtk_label_new( _( "Information" ) );
gtk_notebook_append_page( GTK_NOTEBOOK( n ), w, l );
w = peer_page_new( di );
l = gtk_label_new( _( "Tracker" ) );
gtk_notebook_append_page( GTK_NOTEBOOK( n ), w, l );
- w = info_page_new( di );
- l = gtk_label_new( _( "Information" ) );
- gtk_notebook_append_page( GTK_NOTEBOOK( n ), w, l );
-
w = file_list_new( core, 0 );
gtk_container_set_border_width( GTK_CONTAINER( w ), GUI_PAD_BIG );
l = gtk_label_new( _( "Files" ) );
title = _( "Progress" );
pango_layout = gtk_widget_create_pango_layout( view, title );
pango_layout_get_pixel_size( pango_layout, &width, NULL );
- width += GUI_PAD * 2;
+ width += 30; /* room for the sort indicator */
g_object_unref( G_OBJECT( pango_layout ) );
rend = gtk_cell_renderer_progress_new( );
col = gtk_tree_view_column_new_with_attributes( title, rend, "value", FC_PROG, NULL );
gtk_tree_view_column_set_fixed_width( col, width );
gtk_tree_view_column_set_sizing( col, GTK_TREE_VIEW_COLUMN_FIXED );
gtk_tree_view_column_set_sort_column_id( col, FC_PROG );
- gtk_tree_view_append_column ( tree_view, col );
+ gtk_tree_view_append_column( tree_view, col );
/* add "enabled" column */
title = _( "Download" );
pango_layout = gtk_widget_create_pango_layout( view, title );
pango_layout_get_pixel_size( pango_layout, &width, NULL );
- width += GUI_PAD * 2;
+ width += 30; /* room for the sort indicator */
g_object_unref( G_OBJECT( pango_layout ) );
rend = gtk_cell_renderer_toggle_new( );
col = gtk_tree_view_column_new_with_attributes( title, rend, NULL );
gtk_tree_view_column_set_sizing( col, GTK_TREE_VIEW_COLUMN_FIXED );
gtk_tree_view_column_set_cell_data_func( col, rend, renderDownload, NULL, NULL );
gtk_tree_view_column_set_sort_column_id( col, FC_ENABLED );
- gtk_tree_view_append_column ( tree_view, col );
+ gtk_tree_view_append_column( tree_view, col );
/* add priority column */
title = _( "Priority" );
pango_layout = gtk_widget_create_pango_layout( view, title );
pango_layout_get_pixel_size( pango_layout, &width, NULL );
- width += GUI_PAD * 2;
+ width += 30; /* room for the sort indicator */
g_object_unref( G_OBJECT( pango_layout ) );
rend = gtk_cell_renderer_text_new( );
g_object_set( rend, "xalign", (gfloat)0.5, "yalign", (gfloat)0.5, NULL );
gtk_tree_view_column_set_sizing( col, GTK_TREE_VIEW_COLUMN_FIXED );
gtk_tree_view_column_set_sort_column_id( col, FC_PRIORITY );
gtk_tree_view_column_set_cell_data_func( col, rend, renderPriority, NULL, NULL );
- gtk_tree_view_append_column ( tree_view, col );
+ gtk_tree_view_append_column( tree_view, col );
/* create the scrolled window and stick the view in it */
scroll = gtk_scrolled_window_new( NULL, NULL );
hig_workarea_add_section_divider( t, &row );
hig_workarea_add_section_title( t, &row, _( "Limits" ) );
- s = _( "_Stop seeding torrents at ratio:" );
+ s = _( "_Seed torrent until its ratio reaches:" );
w = new_check_button( s, TR_PREFS_KEY_RATIO_ENABLED, core );
w2 = new_spin_button_double( TR_PREFS_KEY_RATIO, core, 0, INT_MAX, .05 );
gtk_widget_set_sensitive( GTK_WIDGET( w2 ), pref_flag_get( TR_PREFS_KEY_RATIO_ENABLED ) );
GtkWidget * w;
t = hig_workarea_create( );
- hig_workarea_add_section_title( t, &row, _( "Options" ) );
+ hig_workarea_add_section_title( t, &row, _( "Desktop" ) );
- s = _( "Inhibit desktop _hibernation when torrents are active" );
+ s = _( "Inhibit _hibernation when torrents are active" );
w = new_check_button( s, PREF_KEY_INHIBIT_HIBERNATION, core );
hig_workarea_add_wide_control( t, &row, w );
- s = _( "Show _icon in the desktop Notification Area" );
+ s = _( "Show Transmission in the system _tray" );
w = new_check_button( s, PREF_KEY_SHOW_TRAY_ICON, core );
hig_workarea_add_wide_control( t, &row, w );
- s = _( "Show desktop _notifications" );
+ s = _( "Show popup _notifications" );
w = new_check_button( s, PREF_KEY_SHOW_DESKTOP_NOTIFICATION, core );
hig_workarea_add_wide_control( t, &row, w );
int value;
const char * text;
} items[] = {
- { TR_CLEAR_PREFERRED, N_( "Plaintext Preferred" ) },
- { TR_ENCRYPTION_PREFERRED, N_( "Encryption Preferred" ) },
- { TR_ENCRYPTION_REQUIRED, N_( "Encryption Required" ) }
+ { TR_CLEAR_PREFERRED, N_( "Plaintext preferred" ) },
+ { TR_ENCRYPTION_PREFERRED, N_( "Encryption preferred" ) },
+ { TR_ENCRYPTION_REQUIRED, N_( "Encryption required" ) }
};
/* build a store for encryption */
g_signal_connect( data->check, "toggled", G_CALLBACK( target_cb ), w );
target_cb( data->check, w );
- hig_workarea_add_section_divider( t, &row );
- hig_workarea_add_section_title( t, &row, _( "Limits" ) );
-
- w = new_spin_button( TR_PREFS_KEY_PEER_LIMIT_GLOBAL, core, 1, 3000, 5 );
- hig_workarea_add_row( t, &row, _( "Maximum peers _overall:" ), w, NULL );
- w = new_spin_button( TR_PREFS_KEY_PEER_LIMIT_TORRENT, core, 1, 300, 5 );
- hig_workarea_add_row( t, &row, _( "Maximum peers per _torrent:" ), w, NULL );
-
hig_workarea_add_section_divider( t, &row );
hig_workarea_add_section_title ( t, &row, _( "Privacy" ) );
hig_workarea_add_wide_control( t, &row, w );
#endif
+ hig_workarea_add_section_divider( t, &row );
+ hig_workarea_add_section_title( t, &row, _( "Limits" ) );
+
+ w = new_spin_button( TR_PREFS_KEY_PEER_LIMIT_TORRENT, core, 1, 300, 5 );
+ hig_workarea_add_row( t, &row, _( "Maximum peers per _torrent:" ), w, NULL );
+ w = new_spin_button( TR_PREFS_KEY_PEER_LIMIT_GLOBAL, core, 1, 3000, 5 );
+ hig_workarea_add_row( t, &row, _( "Maximum peers _overall:" ), w, NULL );
+
hig_workarea_finish( t, &row );
g_object_weak_ref( G_OBJECT( t ), peerPageDestroyed, data );
return t;
page->widgets = g_slist_append( page->widgets, w );
/* require authentication */
- s = _( "_Require username" );
+ s = _( "Use _authentication" );
w = new_check_button( s, TR_PREFS_KEY_RPC_AUTH_REQUIRED, core );
hig_workarea_add_wide_control( t, &row, w );
page->auth_tb = GTK_TOGGLE_BUTTON( w );
page->auth_widgets = g_slist_append( page->auth_widgets, w );
/* require authentication */
- s = _( "Only allow the following IP _addresses to connect:" );
+ s = _( "Only allow these IP _addresses to connect:" );
w = new_check_button( s, TR_PREFS_KEY_RPC_WHITELIST_ENABLED, core );
hig_workarea_add_wide_control( t, &row, w );
page->whitelist_tb = GTK_TOGGLE_BUTTON( w );
page->core = TR_CORE( core );
t = hig_workarea_create( );
- hig_workarea_add_section_title ( t, &row, _( "Tracker Proxy" ) );
+ hig_workarea_add_section_title ( t, &row, _( "Tracker" ) );
s = _( "Connect to tracker via a pro_xy" );
w = new_check_button( s, TR_PREFS_KEY_PROXY_ENABLED, core );
w = hig_workarea_add_row( t, &row, s, w, NULL );
page->proxy_widgets = g_slist_append( page->proxy_widgets, w );
- s = _( "_Authentication is required" );
+ s = _( "Use _authentication" );
w = new_check_button( s, TR_PREFS_KEY_PROXY_AUTH_ENABLED, core );
g_signal_connect( w, "toggled", G_CALLBACK( onProxyToggled ), page );
hig_workarea_add_wide_control( t, &row, w );
page->core = TR_CORE( core );
t = hig_workarea_create( );
- hig_workarea_add_section_title( t, &row, _( "Global Bandwidth Limits" ) );
+ hig_workarea_add_section_title( t, &row, _( "Speed Limits" ) );
s = _( "Limit _download speed (KB/s):" );
w = new_check_button( s, TR_PREFS_KEY_DSPEED_ENABLED, core );
h = gtk_hbox_new( FALSE, GUI_PAD );
w = gtk_image_new_from_stock( "alt-speed-off", -1 );
gtk_box_pack_start( GTK_BOX( h ), w, FALSE, FALSE, 0 );
- g_snprintf( buf, sizeof( buf ), "<b>%s</b>", _( "Speed Limit Mode" ) );
+ g_snprintf( buf, sizeof( buf ), "<b>%s</b>", _( "Temporary Speed Limits" ) );
w = gtk_label_new( buf );
gtk_misc_set_alignment( GTK_MISC( w ), 0.0f, 0.5f );
gtk_label_set_use_markup( GTK_LABEL( w ), TRUE );
gtk_box_pack_start( GTK_BOX( h ), w, FALSE, FALSE, 0 );
hig_workarea_add_section_title_widget( t, &row, h );
+ s = _( "Override normal speed limits manually or at scheduled times" );
+ g_snprintf( buf, sizeof( buf ), "<small>%s</small>", s );
+ w = gtk_label_new( buf );
+ gtk_label_set_use_markup( GTK_LABEL( w ), TRUE );
+ gtk_misc_set_alignment( GTK_MISC( w ), 0.5f, 0.5f );
+ hig_workarea_add_wide_control( t, &row, w );
+
s = _( "Limit do_wnload speed (KB/s):" );
w = new_spin_button( TR_PREFS_KEY_ALT_SPEED_DOWN, core, 0, INT_MAX, 5 );
hig_workarea_add_row( t, &row, s, w, NULL );
w = new_spin_button( TR_PREFS_KEY_ALT_SPEED_UP, core, 0, INT_MAX, 5 );
hig_workarea_add_row( t, &row, s, w, NULL );
- g_snprintf( buf, sizeof( buf ), "<small>%s</small>", _( "When enabled, Speed Limit Mode overrides the Global Bandwidth Limits" ) );
- w = gtk_label_new( buf );
- gtk_label_set_use_markup( GTK_LABEL( w ), TRUE );
- gtk_misc_set_alignment( GTK_MISC( w ), 0.5f, 0.5f );
- hig_workarea_add_wide_control( t, &row, w );
-
- s = _( "Use Speed Limit Mode _between:" );
+ s = _( "_Scheduled use:" );
h = gtk_hbox_new( FALSE, 0 );
w2 = new_time_combo( core, TR_PREFS_KEY_ALT_SPEED_TIME_BEGIN );
page->sched_widgets = g_slist_append( page->sched_widgets, w2 );
data->prefsTag = g_signal_connect( TR_CORE( core ), "prefs-changed", G_CALLBACK( onCorePrefsChanged ), data );
g_object_weak_ref( G_OBJECT( t ), networkPageDestroyed, data );
- s = _( "_Randomize the port every launch" );
- w = new_check_button( s, TR_PREFS_KEY_PEER_PORT_RANDOM_ON_START, core );
- hig_workarea_add_wide_control( t, &row, w );
-
s = _( "Use UPnP or NAT-PMP port _forwarding from my router" );
w = new_check_button( s, TR_PREFS_KEY_PORT_FORWARDING, core );
hig_workarea_add_wide_control( t, &row, w );
+ s = _( "Pick a _random port every time Transmission is started" );
+ w = new_check_button( s, TR_PREFS_KEY_PEER_PORT_RANDOM_ON_START, core );
+ hig_workarea_add_wide_control( t, &row, w );
+
hig_workarea_finish( t, &row );
return t;
}
gtk_label_new ( _( "Web" ) ) );
gtk_notebook_append_page( GTK_NOTEBOOK( n ),
trackerPage( core ),
- gtk_label_new ( _( "Trackers" ) ) );
+ gtk_label_new ( _( "Proxy" ) ) );
g_signal_connect( d, "response", G_CALLBACK( response_cb ), core );
gtk_box_pack_start( GTK_BOX( GTK_DIALOG( d )->vbox ), n, TRUE, TRUE, 0 );
gtk_button_set_image( GTK_BUTTON( w ), p->alt_speed_image[b?1:0] );
gtk_button_set_alignment( GTK_BUTTON( w ), 0.5, 0.5 );
- tip = b ? _( "Click to disable Speed Limit Mode" )
- : _( "Click to enable Speed Limit Mode" );
+ tip = b ? _( "Click to disable Temporary Speed Limits" )
+ : _( "Click to enable Temporary Speed Limits" );
gtr_widget_set_tooltip_text( w, tip );
}
QTabWidget * t = new QTabWidget( this );
QWidget * w;
- t->addTab( w = createActivityTab( ), tr( "Activity" ) );
+ t->addTab( w = createInfoTab( ), tr( "Information" ) );
myWidgets << w;
t->addTab( w = createPeersTab( ), tr( "Peers" ) );
myWidgets << w;
t->addTab( w = createTrackerTab( ), tr( "Tracker" ) );
myWidgets << w;
- t->addTab( w = createInfoTab( ), tr( "Information" ) );
- myWidgets << w;
t->addTab( w = createFilesTab( ), tr( "Files" ) );
myWidgets << w;
t->addTab( w = createOptionsTab( ), tr( "Options" ) );
}
myStateLabel->setText( string );
- // myProgressLabel
- if( torrents.empty( ) )
- string = tr( "None" );
- else {
- double sizeWhenDone = 0;
- double leftUntilDone = 0;
- foreach( const Torrent * t, torrents ) {
- sizeWhenDone += t->sizeWhenDone( );
- leftUntilDone += t->leftUntilDone( );
- }
- string = locale.toString( 100.0*((sizeWhenDone-leftUntilDone)/sizeWhenDone), 'f', 2 );
- }
- myProgressLabel->setText( string );
-
// myHaveLabel
+ double sizeWhenDone = 0;
+ double leftUntilDone = 0;
int64_t haveTotal = 0;
int64_t haveVerified = 0;
+ int64_t haveUnverified = 0;
int64_t verifiedPieces = 0;
foreach( const Torrent * t, torrents ) {
haveTotal += t->haveTotal( );
+ haveUnverified += t->haveUnverified( );
const uint64_t v = t->haveVerified( );
haveVerified += v;
verifiedPieces += v / t->pieceSize( );
+ sizeWhenDone += t->sizeWhenDone( );
+ leftUntilDone += t->leftUntilDone( );
+ }
+ if( !haveVerified && !haveUnverified )
+ string = none;
+ else {
+ QString pct = locale.toString( 100.0*((sizeWhenDone-leftUntilDone)/sizeWhenDone), 'f', 2 );
+ if( !haveUnverified )
+ string = tr( "%1 (%2 verified)" )
+ .arg( pct )
+ .arg( Utils :: sizeToString( haveVerified ) );
+ else
+ string = tr( "%1 (%2 verified, %3 unverified)" )
+ .arg( pct )
+ .arg( Utils :: sizeToString( haveVerified ) )
+ .arg( Utils :: sizeToString( haveUnverified ) );
}
- myHaveLabel->setText( tr( "%1 (%2 verified in %L3 pieces)" )
- .arg( Utils::sizeToString( haveTotal ) )
- .arg( Utils::sizeToString( haveVerified ) )
- .arg( verifiedPieces ) );
+ myHaveLabel->setText( string );
- int64_t sum = 0;
- foreach( const Torrent * t, torrents ) sum += t->downloadedEver( );
- myDownloadedLabel->setText( Utils::sizeToString( sum ) );
+ // myDownloadedLabel
+ if( torrents.empty( ) )
+ string = none;
+ else {
+ uint64_t d=0, f=0;
+ foreach( const Torrent * t, torrents ) {
+ d += t->downloadedEver( );
+ f += t->failedEver( );
+ }
+ const QString dstr = Utils::sizeToString( d );
+ const QString fstr = Utils::sizeToString( f );
+ if( f )
+ string = tr( "%1 (+%2s corrupt)" ).arg( dstr ).arg( fstr );
+ else
+ string = dstr;
+ }
+ myDownloadedLabel->setText( string );
- sum = 0;
+ uint64_t sum = 0;
foreach( const Torrent * t, torrents ) sum += t->uploadedEver( );
myUploadedLabel->setText( Utils::sizeToString( sum ) );
- sum = 0;
- foreach( const Torrent *t, torrents ) sum += t->failedEver( );
- myFailedLabel->setText( Utils::sizeToString( sum ) );
-
double d = 0;
foreach( const Torrent *t, torrents ) d += t->ratio( );
myRatioLabel->setText( Utils :: ratioToString( d / n ) );
- Speed speed;
- foreach( const Torrent *t, torrents ) speed += t->swarmSpeed( );
- mySwarmSpeedLabel->setText( Utils::speedToString( speed ) );
+ const QDateTime qdt_now = QDateTime::currentDateTime( );
+ // myRunTimeLabel
if( torrents.empty( ) )
string = none;
else {
- string = torrents[0]->dateAdded().toString();
+ bool allPaused = true;
+ QDateTime baseline = torrents[0]->lastStarted( );
foreach( const Torrent * t, torrents ) {
- if( string != t->dateAdded().toString() ) {
- string = mixed;
- break;
- }
+ if( baseline != t->lastStarted( ) )
+ baseline = QDateTime( );
+ if( !t->isPaused( ) )
+ allPaused = false;
}
+ if( allPaused )
+ string = tr( "Stopped" );
+ else if( baseline.isNull( ) )
+ string = mixed;
+ else
+ string = Utils::timeToString( baseline.secsTo( qdt_now ) );
}
- myAddedDateLabel->setText( string );
+ myRunTimeLabel->setText( string );
+ // myLastActivityLabel
if( torrents.empty( ) )
string = none;
else {
if( latest < dt )
latest = dt;
}
- string = latest.toString( );
+ const int seconds = latest.secsTo( qdt_now );
+ if( seconds < 5 )
+ string = tr( "Active now" );
+ else
+ string = tr( "%1 ago" ).arg( Utils::timeToString( seconds ) );
}
- myActivityLabel->setText( string );
+ myLastActivityLabel->setText( string );
if( torrents.empty( ) )
}
}
}
+ if( string.isEmpty( ) )
+ string = none;
myErrorLabel->setText( string );
/// information tab
///
- // myPiecesLabel
+ // mySizeLabel
if( torrents.empty( ) )
string = none;
else {
- int64_t pieceCount = 0;
- uint64_t baseSize = torrents[0]->pieceSize( );
+ int pieces = 0;
+ uint64_t size = 0;
+ uint32_t pieceSize = torrents[0]->pieceSize( );
foreach( const Torrent * t, torrents ) {
- pieceCount += t->pieceCount( );
- if( baseSize != t->pieceSize( ) )
- baseSize = 0;
+ pieces += t->pieceCount( );
+ size += t->totalSize( );
+ if( pieceSize != t->pieceSize( ) )
+ pieceSize = 0;
}
- if( !baseSize ) // mixed piece size
- string = tr( "%L1 Pieces" ).arg( pieceCount );
+ if( !size )
+ string = none;
+ else if( pieceSize > 0 )
+ string = tr( "%1 (%Ln pieces @ %2)", "", pieces )
+ .arg( Utils::sizeToString( size ) )
+ .arg( Utils::sizeToString( pieceSize ) );
else
- string = tr( "%L1 Pieces @ %2" ).arg( pieceCount )
- .arg( Utils::sizeToString( baseSize ) );
+ string = tr( "%1 (%Ln pieces)", "", pieces )
+ .arg( Utils::sizeToString( size ) );
}
- myPiecesLabel->setText( string );
+ mySizeLabel->setText( string );
// myHashLabel
if( torrents.empty( ) )
string = none;
else {
bool b = torrents[0]->isPrivate( );
- string = b ? tr( "Private to this tracker -- PEX disabled" )
+ string = b ? tr( "Private to this tracker -- DHT and PEX disabled" )
: tr( "Public torrent" );
foreach( const Torrent * t, torrents ) {
if( b != t->isPrivate( ) ) {
}
myCommentBrowser->setText( string );
- // myCreatorLabel
- if( torrents.empty( ) )
- string = none;
- else {
- string = torrents[0]->creator( );
- foreach( const Torrent * t, torrents ) {
- if( string != t->creator( ) ) {
- string = mixed;
- break;
- }
- }
- }
- myCreatorLabel->setText( string.isEmpty() ? unknown : string );
-
- // myDateCreatedLabel
+ // myOriginLabel
if( torrents.empty( ) )
string = none;
else {
- string = torrents[0]->dateCreated().toString();
+ bool mixed_creator=false, mixed_date=false;
+ const QString creator = torrents[0]->creator();
+ const QString date = torrents[0]->dateCreated().toString();
foreach( const Torrent * t, torrents ) {
- if( string != t->dateCreated().toString() ) {
- string = mixed;
- break;
- }
+ mixed_creator |= ( creator != t->creator() );
+ mixed_date |= ( date != t->dateCreated().toString() );
}
+ if( mixed_creator && mixed_date )
+ string = mixed;
+ else if( mixed_date )
+ string = tr( "Created by %1" ).arg( creator );
+ else if( mixed_creator || creator.isEmpty( ) )
+ string = tr( "Created on %1" ).arg( date );
+ else
+ string = tr( "Created by %1 on %2" ).arg( creator ).arg( date );
}
- myDateCreatedLabel->setText( string );
-
- // myDestinationLabel
+ myOriginLabel->setText( string );
+
+
+ // myLocationLabel
if( torrents.empty( ) )
string = none;
else {
}
}
}
- myDestinationLabel->setText( string );
+ myLocationLabel->setText( string );
- // myTorrentFileLabel
- if( torrents.empty( ) )
- string = none;
- else {
- string = torrents[0]->torrentFile( );
- foreach( const Torrent * t, torrents ) {
- if( string != t->torrentFile( ) ) {
- string = mixed;
- break;
- }
- }
- }
- myTorrentFileLabel->setText( string );
///
/// Options Tab
***/
QWidget *
-Details :: createActivityTab( )
+Details :: createInfoTab( )
{
HIG * hig = new HIG( this );
hig->addSectionTitle( tr( "Transfer" ) );
- hig->addRow( tr( "State:" ), myStateLabel = new SqueezeLabel );
- hig->addRow( tr( "Progress:" ), myProgressLabel = new SqueezeLabel );
+ hig->addRow( tr( "Torrent size:" ), mySizeLabel = new SqueezeLabel );
hig->addRow( tr( "Have:" ), myHaveLabel = new SqueezeLabel );
hig->addRow( tr( "Downloaded:" ), myDownloadedLabel = new SqueezeLabel );
hig->addRow( tr( "Uploaded:" ), myUploadedLabel = new SqueezeLabel );
- hig->addRow( tr( "Failed DL:" ), myFailedLabel = new SqueezeLabel );
hig->addRow( tr( "Ratio:" ), myRatioLabel = new SqueezeLabel );
- hig->addRow( tr( "Swarm Rate:" ), mySwarmSpeedLabel = new SqueezeLabel );
+ hig->addRow( tr( "State:" ), myStateLabel = new SqueezeLabel );
+ hig->addRow( tr( "Running time:" ), myRunTimeLabel = new SqueezeLabel );
+ hig->addRow( tr( "Last activity:" ), myLastActivityLabel = new SqueezeLabel );
hig->addRow( tr( "Error:" ), myErrorLabel = new SqueezeLabel );
hig->addSectionDivider( );
- hig->addSectionTitle( tr( "Dates" ) );
- hig->addRow( tr( "Added on:" ), myAddedDateLabel = new SqueezeLabel );
- hig->addRow( tr( "Last activity on:" ), myActivityLabel = new SqueezeLabel );
+ hig->addSectionDivider( );
+ hig->addSectionTitle( tr( "Details" ) );
+ hig->addRow( tr( "Location:" ), myLocationLabel = new SqueezeLabel );
+ hig->addRow( tr( "Hash:" ), myHashLabel = new SqueezeLabel );
+ hig->addRow( tr( "Privacy:" ), myPrivacyLabel = new SqueezeLabel );
+ hig->addRow( tr( "Origin:" ), myOriginLabel = new SqueezeLabel );
+ hig->addRow( tr( "Comment:" ), myCommentBrowser = new QTextBrowser );
+ const int h = QFontMetrics(myCommentBrowser->font()).lineSpacing() * 4;
+ myCommentBrowser->setMinimumHeight( h );
+ myCommentBrowser->setMaximumHeight( h );
+
hig->finish( );
return hig;
m->addItem( tr( "Normal" ), TR_PRI_NORMAL );
m->addItem( tr( "High" ), TR_PRI_HIGH );
connect( m, SIGNAL(currentIndexChanged(int)), this, SLOT(onBandwidthPriorityChanged(int)));
- hig->addRow( tr( "&Bandwidth priority:" ), m );
+ hig->addRow( tr( "Torrent &priority:" ), m );
myBandwidthPriorityCombo = m;
h = new QHBoxLayout( );
h->setSpacing( HIG :: PAD );
- r = new QRadioButton( tr( "&Stop seeding when a torrent's ratio reaches" ) );
+ r = new QRadioButton( tr( "&Seed torrent until its ratio reaches:" ) );
r->setProperty( RATIO_KEY, TR_RATIOLIMIT_SINGLE );
connect( r, SIGNAL(clicked(bool)), this, SLOT(onSeedUntilChanged(bool)));
mySeedCustomRadio = r;
****
***/
-QWidget *
-Details :: createInfoTab( )
-{
- HIG * hig = new HIG( );
- hig->addSectionTitle( tr( "Details" ) );
- hig->addRow( tr( "Pieces:" ), myPiecesLabel = new SqueezeLabel );
- hig->addRow( tr( "Hash:" ), myHashLabel = new SqueezeLabel );
- hig->addRow( tr( "Privacy:" ), myPrivacyLabel = new SqueezeLabel );
- hig->addRow( tr( "Comment:" ), myCommentBrowser = new QTextBrowser );
- hig->addSectionDivider( );
- hig->addSectionTitle( tr( "Origins" ) );
- hig->addRow( tr( "Creator:" ), myCreatorLabel = new SqueezeLabel );
- hig->addRow( tr( "Date:" ), myDateCreatedLabel = new SqueezeLabel );
- hig->addSectionDivider( );
- hig->addSectionTitle( tr( "Origins" ) );
- hig->addRow( tr( "Destination folder:" ), myDestinationLabel = new SqueezeLabel );
- hig->addRow( tr( "Torrent file:" ), myTorrentFileLabel = new SqueezeLabel );
- const int h = QFontMetrics(myCommentBrowser->font()).lineSpacing() * 4;
- myTorrentFileLabel->setMinimumWidth( 300 );
- myTorrentFileLabel->setSizePolicy ( QSizePolicy::Expanding, QSizePolicy::Preferred );
-
- myCommentBrowser->setMinimumHeight( h );
- myCommentBrowser->setMaximumHeight( h );
-
- hig->finish( );
- return hig;
-}
-
-/***
-****
-***/
-
QWidget *
Details :: createTrackerTab( )
{
void setIds( const QSet<int>& ids );
private:
- QWidget * createActivityTab( );
QWidget * createPeersTab( );
QWidget * createTrackerTab( );
QWidget * createInfoTab( );
bool myHavePendingRefresh;
QLabel * myStateLabel;
- QLabel * myProgressLabel;
QLabel * myHaveLabel;
QLabel * myDownloadedLabel;
QLabel * myUploadedLabel;
- QLabel * myFailedLabel;
QLabel * myRatioLabel;
- QLabel * mySwarmSpeedLabel;
QLabel * myErrorLabel;
- QLabel * myAddedDateLabel;
- QLabel * myActivityLabel;
+ QLabel * myRunTimeLabel;
+ QLabel * myLastActivityLabel;
QCheckBox * mySessionLimitCheck;
QCheckBox * mySingleDownCheck;
QSpinBox * myPeerLimitSpin;
QComboBox * myBandwidthPriorityCombo;
- QLabel * myPiecesLabel;
+ QLabel * mySizeLabel;
QLabel * myHashLabel;
QLabel * myPrivacyLabel;
- QLabel * myCreatorLabel;
- QLabel * myDateCreatedLabel;
- QLabel * myDestinationLabel;
- QLabel * myTorrentFileLabel;
+ QLabel * myOriginLabel;
+ QLabel * myLocationLabel;
QTextBrowser * myCommentBrowser;
QLabel * myTrackerLabel;
b = myPrefs.getBool( key );
myAltSpeedButton->setChecked( b );
myAltSpeedButton->setIcon( b ? mySpeedModeOnIcon : mySpeedModeOffIcon );
- myAltSpeedButton->setToolTip( b ? tr( "Click to disable Speed Limit Mode" )
- : tr( "Click to enable Speed Limit Mode" ) );
+ myAltSpeedButton->setToolTip( b ? tr( "Click to disable Temporary Speed Limits" )
+ : tr( "Click to enable Temporary Speed Limits" ) );
break;
default:
myProxyWidgets << l << r;
l = hig->addRow( tr( "Proxy &port:" ), r = spinBoxNew( Prefs::PROXY_PORT, 1, 65535, 1 ) );
myProxyWidgets << l << r;
- hig->addWideControl( l = checkBoxNew( tr( "Require &authentication" ), Prefs::PROXY_AUTH_ENABLED ) );
+ hig->addWideControl( l = checkBoxNew( tr( "Use &authentication" ), Prefs::PROXY_AUTH_ENABLED ) );
myProxyWidgets << l;
l = hig->addRow( tr( "&Username:" ), r = lineEditNew( Prefs::PROXY_USERNAME ) );
myProxyAuthWidgets << l << r;
hig->addRow( l, h, 0 );
l = hig->addRow( tr( "Listening &port:" ), w = spinBoxNew( Prefs::RPC_PORT, 0, 65535, 1 ) );
myWebWidgets << l << w;
- hig->addWideControl( w = checkBoxNew( tr( "&Require username" ), Prefs::RPC_AUTH_REQUIRED ) );
+ hig->addWideControl( w = checkBoxNew( tr( "Use &authentication" ), Prefs::RPC_AUTH_REQUIRED ) );
myWebWidgets << w;
l = hig->addRow( tr( "&Username:" ), w = lineEditNew( Prefs::RPC_USERNAME ) );
myWebAuthWidgets << l << w;
l = hig->addRow( tr( "Pass&word:" ), w = lineEditNew( Prefs::RPC_PASSWORD, QLineEdit::Password ) );
myWebAuthWidgets << l << w;
- hig->addWideControl( w = checkBoxNew( tr( "Only allow the following IP &addresses to connect:" ), Prefs::RPC_WHITELIST_ENABLED ) );
+ hig->addWideControl( w = checkBoxNew( tr( "Only allow these IP &addresses to connect:" ), Prefs::RPC_WHITELIST_ENABLED ) );
myWebWidgets << w;
l = hig->addRow( tr( "Addresses:" ), w = lineEditNew( Prefs::RPC_WHITELIST ) );
myWebWhitelistWidgets << l << w;
{
QWidget *l, *r;
HIG * hig = new HIG( this );
- hig->addSectionTitle( tr( "Global Bandwidth Limits" ) );
+ hig->addSectionTitle( tr( "Speed Limits" ) );
l = checkBoxNew( tr( "Limit &download speed (KB/s):" ), Prefs::DSPEED_ENABLED );
r = spinBoxNew( Prefs::DSPEED, 0, INT_MAX, 5 );
label->setPixmap( QPixmap( ":/icons/alt-limit-off.png" ) );
label->setAlignment( Qt::AlignLeft|Qt::AlignVCenter );
h->addWidget( label );
- label = new QLabel( tr( "Speed Limit Mode" ) );
+ label = new QLabel( tr( "Temporary Speed Limits" ) );
label->setStyleSheet( "font: bold" );
label->setAlignment( Qt::AlignLeft|Qt::AlignVCenter );
h->addWidget( label );
hig->addSectionTitle( h );
- QString s = tr( "Limit d&ownload speed (KB/s):" );
+ QString s = tr( "<small>Override normal speed limits manually or at scheduled times</small>" );
+ hig->addWideControl( new QLabel( s ) );
+
+ s = tr( "Limit d&ownload speed (KB/s):" );
r = spinBoxNew( Prefs :: ALT_SPEED_LIMIT_DOWN, 0, INT_MAX, 5 );
hig->addRow( s, r );
r = spinBoxNew( Prefs :: ALT_SPEED_LIMIT_UP, 0, INT_MAX, 5 );
hig->addRow( s, r );
- s = tr( "<small>When enabled, Speed Limit Mode overrides the Global Bandwidth Limits</small>" );
- hig->addWideControl( new QLabel( s ) );
-
- QCheckBox * c = checkBoxNew( tr( "Use Speed Limit Mode &between" ), Prefs::ALT_SPEED_LIMIT_TIME_ENABLED );
+ QCheckBox * c = checkBoxNew( tr( "&Scheduled use:" ), Prefs::ALT_SPEED_LIMIT_TIME_ENABLED );
h = new QHBoxLayout( );
h->setSpacing( HIG::PAD );
QWidget * w = timeEditNew( Prefs :: ALT_SPEED_LIMIT_TIME_BEGIN );
hig->addRow( tr( "&Port for incoming connections:" ), s );
hig->addRow( "", h, 0 );
- hig->addWideControl( checkBoxNew( tr( "&Randomize the port every launch" ), Prefs :: PEER_PORT_RANDOM_ON_START ) );
hig->addWideControl( checkBoxNew( tr( "Use UPnP or NAT-PMP port &forwarding from my router" ), Prefs::PORT_FORWARDING ) );
+ hig->addWideControl( checkBoxNew( tr( "Pick a &random port every time Transmission is started" ), Prefs :: PEER_PORT_RANDOM_ON_START ) );
hig->finish( );
return hig;
myBlockWidgets << l;
hig->addWideControl( l );
- hig->addSectionDivider( );
- hig->addSectionTitle( tr( "Limits" ) );
- hig->addRow( tr( "Maximum peers &overall:" ), spinBoxNew( Prefs::PEER_LIMIT_GLOBAL, 1, 3000, 5 ) );
- hig->addRow( tr( "Maximum peers per &torrent:" ), spinBoxNew( Prefs::PEER_LIMIT_TORRENT, 1, 300, 5 ) );
-
QComboBox * box = new QComboBox( );
- box->addItem( tr( "Plaintext Preferred" ), 0 );
- box->addItem( tr( "Encryption Preferred" ), 1 );
- box->addItem( tr( "Encryption Required" ), 2 );
+ box->addItem( tr( "Plaintext preferred" ), 0 );
+ box->addItem( tr( "Encryption preferred" ), 1 );
+ box->addItem( tr( "Encryption required" ), 2 );
myWidgets.insert( Prefs :: ENCRYPTION, box );
connect( box, SIGNAL(activated(int)), this, SLOT(encryptionEdited(int)));
hig->addSectionDivider( );
hig->addSectionTitle( tr( "Privacy" ) );
hig->addRow( tr( "&Encryption mode:" ), box );
- hig->addWideControl( checkBoxNew( tr( "Use peer e&xchange (PEX)" ), Prefs::PEX_ENABLED ) );
- hig->addWideControl( checkBoxNew( tr( "Use &distributed hash table (DHT)" ), Prefs::PEX_ENABLED ) );
+ hig->addWideControl( checkBoxNew( tr( "Use PE&X to find more peers" ), Prefs::PEX_ENABLED ) );
+ hig->addWideControl( checkBoxNew( tr( "Use &DHT to find more peers" ), Prefs::DHT_ENABLED ) );
+
+ hig->addSectionDivider( );
+ hig->addSectionTitle( tr( "Limits" ) );
+ hig->addRow( tr( "Maximum peers per &torrent:" ), spinBoxNew( Prefs::PEER_LIMIT_TORRENT, 1, 300, 5 ) );
+ hig->addRow( tr( "Maximum peers &overall:" ), spinBoxNew( Prefs::PEER_LIMIT_GLOBAL, 1, 3000, 5 ) );
hig->finish( );
updateBlocklistCheckBox( );
hig->addSectionDivider( );
hig->addSectionTitle( tr( "Limits" ) );
- l = checkBoxNew( tr( "&Stop seeding torrents at ratio:" ), Prefs::RATIO_ENABLED );
+ l = checkBoxNew( tr( "&Seed torrent until its ratio reaches:" ), Prefs::RATIO_ENABLED );
r = doubleSpinBoxNew( Prefs::RATIO, 0, INT_MAX, 0.5, 2 );
hig->addRow( l, r );
enableBuddyWhenChecked( qobject_cast<QCheckBox*>(l), r );
QString torrentFile( ) const { return getString( TORRENT_FILE ); }
bool hasError( ) const { return !getError( ).isEmpty( ); }
bool isDone( ) const { return getSize( LEFT_UNTIL_DONE ) == 0; }
- bool isSeed( ) const { return haveVerified() >= getSize( TOTAL_SIZE ); }
+ bool isSeed( ) const { return haveVerified() >= totalSize(); }
bool isPrivate( ) const { return getBool( IS_PRIVATE ); }
bool getSeedRatio( double& setme ) const;
uint64_t haveVerified( ) const { return getSize( HAVE_VERIFIED ); }
- uint64_t haveTotal( ) const { return haveVerified( ) + getSize( HAVE_UNCHECKED ); }
+ uint64_t haveUnverified( ) const { return getSize( HAVE_UNCHECKED ); }
+ uint64_t haveTotal( ) const { return haveVerified( ) + haveUnverified(); }
+ uint64_t totalSize( ) const { return getSize( TOTAL_SIZE ); }
uint64_t sizeWhenDone( ) const { return getSize( SIZE_WHEN_DONE ); }
uint64_t leftUntilDone( ) const { return getSize( LEFT_UNTIL_DONE ); }
uint64_t pieceSize( ) const { return getSize( PIECE_SIZE ); }
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0" language="en">
-<context>
- <name>AboutDialog</name>
- <message>
- <location filename="about.cc" line="35"/>
- <source>About Transmission</source>
- <translation></translation>
- </message>
- <message>
- <location filename="about.cc" line="58"/>
- <source>Copyright 2005-2009 The Transmission Project</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="about.cc" line="72"/>
- <source>C&redits</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="about.cc" line="76"/>
- <source>&License</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="about.cc" line="89"/>
- <source>Credits</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="about.cc" line="53"/>
- <source>A fast and easy BitTorrent client</source>
- <translation></translation>
- </message>
-</context>
<context>
<name>Details</name>
- <message>
- <location filename="details.cc" line="133"/>
- <source>Activity</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="135"/>
- <source>Peers</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="137"/>
- <source>Tracker</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="141"/>
- <source>Files</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="143"/>
- <source>Options</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="139"/>
- <source>Information</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="277"/>
- <source>%1 (%2 verified in %L3 pieces)</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="224"/>
- <location filename="details.cc" line="255"/>
- <source>None</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="129"/>
- <source>Torrent Properties</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="details.cc" line="225"/>
- <source>Mixed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="details.cc" line="360"/>
- <source>%L1 Pieces</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="details.cc" line="362"/>
- <source>%L1 Pieces @ %2</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="386"/>
- <source>Private to this tracker -- PEX disabled</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="387"/>
- <source>Public torrent</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="630"/>
- <source>Now</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="details.cc" line="787"/>
- <source>Transfer</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="788"/>
- <source>State:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="789"/>
- <source>Progress:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="790"/>
- <source>Have:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="791"/>
- <source>Downloaded:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="792"/>
- <source>Uploaded:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="793"/>
- <source>Failed DL:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="794"/>
- <source>Ratio:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="795"/>
- <source>Swarm Rate:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="796"/>
- <source>Error:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="799"/>
- <source>Dates</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="891"/>
- <source>Honor global &limits</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="896"/>
- <source>Limit &download speed (KB/s)</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="906"/>
- <source>Limit &upload speed (KB/s)</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="917"/>
- <source>Low</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="details.cc" line="918"/>
- <source>Normal</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="details.cc" line="919"/>
- <source>High</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="details.cc" line="921"/>
- <source>&Bandwidth priority:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="details.cc" line="926"/>
- <source>Seed-Until Ratio</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="928"/>
- <source>Use &global setting</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="934"/>
- <source>Seed &regardless of ratio</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="942"/>
- <source>&Stop seeding when a torrent's ratio reaches</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="955"/>
- <source>Peer Connections</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="961"/>
- <source>&Maximum Peers</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="976"/>
- <source>Details</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="977"/>
- <source>Pieces:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="978"/>
- <source>Hash:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="979"/>
- <source>Privacy:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="980"/>
- <source>Comment:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="982"/>
- <location filename="details.cc" line="986"/>
- <source>Origins</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="983"/>
- <source>Creator:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="984"/>
- <source>Date:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="987"/>
- <source>Destination folder:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="988"/>
- <source>Torrent file:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="1009"/>
- <source>Scrape</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="1010"/>
- <source>Last scrape at:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="1011"/>
- <location filename="details.cc" line="1017"/>
- <source>Tracker responded:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="1012"/>
- <source>Next scrape in:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="1014"/>
- <source>Announce</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="1015"/>
- <source>Tracker:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="1016"/>
- <source>Last announce at:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="1018"/>
- <source>Next announce in:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="1019"/>
- <source>Manual announce allowed in:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="226"/>
- <source>Unknown</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="723"/>
- <source>Optimistic unchoke</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="724"/>
- <source>Downloading from this peer</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="725"/>
- <source>We would download from this peer if they would let us</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="726"/>
- <source>Uploading to peer</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="727"/>
- <source>We would upload to this peer if they asked</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="728"/>
- <source>Peer has unchoked us, but we're not interested</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="729"/>
- <source>We unchoked this peer, but they're not interested</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="701"/>
- <location filename="details.cc" line="730"/>
- <source>Encrypted connection</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="731"/>
- <source>Peer was discovered through Peer Exchange (PEX)</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="732"/>
- <source>Peer is an incoming connection</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="800"/>
- <source>Added on:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="801"/>
- <source>Last activity on:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="889"/>
- <source>Speed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="details.cc" line="1040"/>
- <source>Up</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="1040"/>
- <source>Down</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="1040"/>
- <source>%</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="1040"/>
- <source>Status</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="1040"/>
- <source>Address</source>
- <translation></translation>
- </message>
- <message>
- <location filename="details.cc" line="1040"/>
- <source>Client</source>
- <translation></translation>
- </message>
-</context>
-<context>
- <name>FileTreeItem</name>
- <message>
- <location filename="file-tree.cc" line="153"/>
- <source>Low</source>
- <translation></translation>
- </message>
- <message>
- <location filename="file-tree.cc" line="154"/>
- <source>High</source>
- <translation></translation>
- </message>
- <message>
- <location filename="file-tree.cc" line="155"/>
- <source>Normal</source>
- <translation></translation>
- </message>
- <message>
- <location filename="file-tree.cc" line="156"/>
- <source>Mixed</source>
- <translation></translation>
- </message>
-</context>
-<context>
- <name>FileTreeModel</name>
- <message>
- <location filename="file-tree.cc" line="291"/>
- <source>File</source>
- <translation></translation>
- </message>
- <message>
- <location filename="file-tree.cc" line="292"/>
- <source>Progress</source>
- <translation></translation>
- </message>
- <message>
- <location filename="file-tree.cc" line="293"/>
- <source>Download</source>
- <translation></translation>
- </message>
- <message>
- <location filename="file-tree.cc" line="294"/>
- <source>Priority</source>
- <translation></translation>
- </message>
-</context>
-<context>
- <name>LicenseDialog</name>
- <message>
- <location filename="license.cc" line="22"/>
- <source>License</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>MainWindow</name>
- <message>
- <location filename="mainwin.ui" line="14"/>
- <source>Transmission</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="65"/>
- <source>&Torrent</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="89"/>
- <source>&Edit</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="100"/>
- <source>&Help</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="110"/>
- <source>&View</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="138"/>
- <source>toolBar</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="173"/>
- <source>&Add...</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="176"/>
- <source>Add a torrent</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="179"/>
- <source>Ctrl+D</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="184"/>
- <source>&New...</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="187"/>
- <source>Create a new torrent</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="190"/>
- <source>Ctrl+N</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="195"/>
- <source>&Properties</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="198"/>
- <source>Show torrent properties</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="201"/>
- <source>Alt+Enter</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="206"/>
- <source>&Open Folder</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="209"/>
- <source>Open the torrent's folder</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="212"/>
- <source>Ctrl+O</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="217"/>
- <source>&Start</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="220"/>
- <source>Start torrent</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="223"/>
- <source>Ctrl+S</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="228"/>
- <source>Ask Tracker for &More Peers</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="231"/>
- <source>Ask tracker for more peers</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="236"/>
- <source>&Pause</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="239"/>
- <source>Pause torrent</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="242"/>
- <source>Ctrl+P</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="247"/>
- <source>&Verify Local Data</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="250"/>
- <source>Verify local data</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="255"/>
- <source>&Remove</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="258"/>
- <source>Remove torrent</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="261"/>
- <source>Del</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="266"/>
- <source>&Delete Files and Remove</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="269"/>
- <source>Remove torrent and delete its files</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="272"/>
- <source>Shift+Del</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="277"/>
- <source>&Start All</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="282"/>
- <source>&Pause All</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="287"/>
- <source>&Quit</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="290"/>
- <source>Ctrl+Q</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="295"/>
- <source>&Select All</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="298"/>
- <source>Ctrl+A</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="303"/>
- <source>&Deselect All</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="306"/>
- <source>Ctrl+Shift+A</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="311"/>
- <source>&Preferences</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="319"/>
- <source>&Minimal View</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="322"/>
- <source>Alt+M</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="330"/>
- <source>&Toolbar</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="338"/>
- <source>&Filterbar</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="346"/>
- <source>&Statusbar</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="354"/>
- <source>Sort by &Activity</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="362"/>
- <source>Sort by A&ge</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="370"/>
- <source>Sort by &ETA</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="378"/>
- <source>Sort by &Name</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="386"/>
- <source>Sort by &Progress</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="394"/>
- <source>Sort by &Ratio</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="402"/>
- <source>Sort by Si&ze</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="410"/>
- <source>Sort by &State</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="418"/>
- <source>Sort by &Tracker</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="426"/>
- <source>Message &Log</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="516"/>
- <source>&Main Window</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="529"/>
- <source>&Change Session...</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="532"/>
- <source>Choose Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="537"/>
- <source>Set &Location...</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="434"/>
- <source>&Statistics</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="439"/>
- <source>&Contents</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="444"/>
- <source>&About</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="452"/>
- <source>&Reverse Sort Order</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="460"/>
- <source>&Name</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="468"/>
- <source>&Files</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="476"/>
- <source>&Tracker</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="484"/>
- <source>Total Ratio</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="492"/>
- <source>Session Ratio</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="500"/>
- <source>Total Transfer</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.ui" line="508"/>
- <source>Session Transfer</source>
- <translation></translation>
+ <message numerus="yes">
+ <location filename="details.cc" line="388"/>
+ <source>%1 (%Ln pieces @ %2)</source>
+ <translation>
+ <numerusform>%1 (%Ln piece @ %2)</numerusform>
+ <numerusform>%1 (%Ln pieces @ %2)</numerusform>
+ </translation>
</message>
- <message>
- <location filename="mainwin.ui" line="524"/>
- <source>Tray &Icon</source>
- <translation></translation>
+ <message numerus="yes">
+ <location filename="details.cc" line="392"/>
+ <source>%1 (%Ln pieces)</source>
+ <translation>
+ <numerusform>%1 (%Ln piece)</numerusform>
+ <numerusform>%1 (%Ln pieces)</numerusform>
+ </translation>
</message>
</context>
<context>
<name>MakeDialog</name>
- <message>
- <location filename="make-dialog.cc" line="48"/>
- <source>New Torrent</source>
- <translation></translation>
- </message>
- <message>
- <location filename="make-dialog.cc" line="54"/>
- <source>Source</source>
- <translation></translation>
- </message>
- <message>
- <location filename="make-dialog.cc" line="60"/>
- <source><i>No source selected</i></source>
- <translation></translation>
- </message>
- <message>
- <location filename="make-dialog.cc" line="64"/>
- <source>F&older</source>
- <translation></translation>
- </message>
- <message>
- <location filename="make-dialog.cc" line="67"/>
- <source>&File</source>
- <translation></translation>
- </message>
- <message>
- <location filename="make-dialog.cc" line="72"/>
- <source>Trackers</source>
- <translation></translation>
- </message>
- <message>
- <location filename="make-dialog.cc" line="78"/>
- <source>Separate tiers with an empty line</source>
- <translation></translation>
- </message>
- <message>
- <location filename="make-dialog.cc" line="80"/>
- <source>Options</source>
- <translation></translation>
- </message>
- <message>
- <location filename="make-dialog.cc" line="81"/>
- <source>Commen&t:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="make-dialog.cc" line="85"/>
- <source>Progress</source>
- <translation></translation>
- </message>
- <message>
- <location filename="make-dialog.cc" line="106"/>
- <source>&New Torrent</source>
- <translation></translation>
- </message>
- <message>
- <location filename="make-dialog.cc" line="116"/>
- <source>&Close</source>
- <translation></translation>
- </message>
- <message>
- <location filename="make-dialog.cc" line="144"/>
- <source>%1.torrent created!</source>
- <translation></translation>
- </message>
- <message>
- <location filename="make-dialog.cc" line="148"/>
- <source>Error: Invalid URL</source>
- <translation></translation>
- </message>
- <message>
- <location filename="make-dialog.cc" line="152"/>
- <source>Torrent creation cancelled</source>
- <translation></translation>
- </message>
- <message>
- <location filename="make-dialog.cc" line="156"/>
- <source>Error: Couldn't read "%1": %2</source>
- <translation></translation>
- </message>
- <message>
- <location filename="make-dialog.cc" line="162"/>
- <source>Error: Couldn't create "%1": %2</source>
- <translation></translation>
- </message>
- <message>
- <location filename="make-dialog.cc" line="178"/>
- <source>Creating %1.torrent</source>
- <translation></translation>
- </message>
- <message>
- <location filename="make-dialog.cc" line="181"/>
- <location filename="make-dialog.cc" line="293"/>
- <source><i>No source selected<i></source>
- <translation></translation>
- </message>
- <message>
- <location filename="make-dialog.cc" line="184"/>
- <source><i>No tracker announce URLs listed</i></source>
- <translation></translation>
- </message>
- <message>
- <location filename="make-dialog.cc" line="297"/>
- <source>%1 in %2; %3 @ %4</source>
- <translation></translation>
- </message>
- <message>
- <location filename="make-dialog.cc" line="111"/>
- <source>&Stop</source>
- <translation></translation>
- </message>
<message numerus="yes">
<location filename="make-dialog.cc" line="295"/>
<source>%Ln File(s)</source>
</translation>
</message>
</context>
-<context>
- <name>Options</name>
- <message>
- <location filename="options.cc" line="57"/>
- <location filename="options.cc" line="322"/>
- <source>Add Torrent</source>
- <translation></translation>
- </message>
- <message>
- <location filename="options.cc" line="68"/>
- <source>&Torrent file:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="options.cc" line="85"/>
- <source>&Destination folder:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="options.cc" line="104"/>
- <source>&Verify Local Data</source>
- <translation></translation>
- </message>
- <message>
- <location filename="options.cc" line="109"/>
- <source>&Start when added</source>
- <translation></translation>
- </message>
- <message>
- <location filename="options.cc" line="113"/>
- <source>&Delete source file</source>
- <oldsource>&Move source file to Trash</oldsource>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="options.cc" line="324"/>
- <source>Torrent Files (*.torrent);;All Files (*.*)</source>
- <translation></translation>
- </message>
- <message>
- <location filename="options.cc" line="345"/>
- <source>Select Destination</source>
- <translation></translation>
- </message>
-</context>
<context>
<name>PrefsDialog</name>
- <message>
- <location filename="prefs-dialog.cc" line="197"/>
- <source>Tracker Proxy</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="198"/>
- <source>Connect to tracker via a pro&xy</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="200"/>
- <source>Proxy &server:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="202"/>
- <source>Proxy &port:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="204"/>
- <source>Require &authentication</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="206"/>
- <location filename="prefs-dialog.cc" line="237"/>
- <source>&Username:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="208"/>
- <location filename="prefs-dialog.cc" line="239"/>
- <source>Pass&word:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="223"/>
- <source>Web Interface</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="227"/>
- <source>&Open web interface</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="230"/>
- <source>&Enable web interface</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="233"/>
- <source>Listening &port:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="235"/>
- <source>&Require username</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="241"/>
- <source>Only allow the following IP &addresses to connect:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="243"/>
- <source>Addresses:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="380"/>
- <source>&Randomize the port every launch</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="460"/>
- <location filename="prefs-dialog.cc" line="552"/>
- <source>Limits</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="269"/>
- <source>Limit &download speed (KB/s):</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="292"/>
- <source>Limit d&ownload speed (KB/s):</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="296"/>
- <source>Limit u&pload speed (KB/s):</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="365"/>
- <source>Incoming Peers</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="381"/>
- <source>Use UPnP or NAT-PMP port &forwarding from my router</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="444"/>
- <source>Blocklist</source>
- <translation></translation>
- </message>
<message numerus="yes">
<source>Enable &blocklist (contains %Ln rule(s))</source>
<translation type="obsolete">
<numerusform>Enable &blocklist (contains %Ln rules)</numerusform>
</translation>
</message>
- <message>
- <location filename="prefs-dialog.cc" line="608"/>
- <source>Not supported by remote sessions</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="447"/>
- <source>&Update blocklist</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="300"/>
- <source><small>When enabled, Speed Limit Mode overrides the Global Bandwidth Limits</small></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="317"/>
- <source>&On days:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="320"/>
- <source>Every Day</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="321"/>
- <source>Weekdays</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="322"/>
- <source>Weekends</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="323"/>
- <source>Sunday</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="324"/>
- <source>Monday</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="325"/>
- <source>Tuesday</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="326"/>
- <source>Wednesday</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="327"/>
- <source>Thursday</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="328"/>
- <source>Friday</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="329"/>
- <source>Saturday</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="348"/>
- <source>Port is <b>open</b></source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="349"/>
- <source>Port is <b>closed</b></source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="355"/>
- <source>Testing...</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="369"/>
- <source>&Test Port</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="370"/>
- <location filename="prefs-dialog.cc" line="682"/>
- <source>Status unknown</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="378"/>
- <source>&Port for incoming connections:</source>
- <translation></translation>
- </message>
<message numerus="yes">
<location filename="prefs-dialog.cc" line="409"/>
<source><b>Update succeeded!</b><p>Blocklist now has %Ln rules.</source>
<numerusform></numerusform>
</translation>
</message>
- <message>
- <location filename="prefs-dialog.cc" line="418"/>
- <source><b>Update Blocklist</b><p>Getting new blocklist...</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="455"/>
- <source>Enable &automatic updates</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="461"/>
- <source>Maximum peers &overall:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="462"/>
- <source>Maximum peers per &torrent:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="465"/>
- <source>Plaintext Preferred</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="466"/>
- <source>Encryption Preferred</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="467"/>
- <source>Encryption Required</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="472"/>
- <source>Privacy</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="490"/>
- <source>Select Watch Directory</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="508"/>
- <source>Select Destination</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="531"/>
- <source>Adding Torrents</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="533"/>
- <source>Automatically &add torrents from:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="541"/>
- <source>Display &options dialog</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="542"/>
- <source>&Start when added</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="549"/>
- <source>&Destination folder:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="574"/>
- <source>Transmission Preferences</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="577"/>
- <source>Torrents</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="578"/>
- <source>Peers</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="580"/>
- <source>Network</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="581"/>
- <source>Web</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="634"/>
- <source>Enable &blocklist</source>
- <translation type="unfinished"></translation>
- </message>
<message numerus="yes">
<location filename="prefs-dialog.cc" line="636"/>
<source>Enable &blocklist (%Ln rules)</source>
<numerusform>Enable &blocklist (%Ln rules)</numerusform>
</translation>
</message>
- <message>
- <location filename="prefs-dialog.cc" line="267"/>
- <source>Global Bandwidth Limits</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="286"/>
- <source>Speed Limit Mode</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="303"/>
- <source>Use Speed Limit Mode &between</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="473"/>
- <source>&Encryption mode:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="474"/>
- <source>Use peer e&xchange (PEX)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="475"/>
- <source>Use &distributed hash table (DHT)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="543"/>
- <source>&Delete source files</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="554"/>
- <source>&Stop seeding torrents at ratio:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="579"/>
- <source>Speed</source>
- <translation></translation>
- </message>
- <message>
- <location filename="prefs-dialog.cc" line="274"/>
- <source>Limit &upload speed (KB/s):</source>
- <translation></translation>
- </message>
<message numerus="yes">
<source>Enable &blocklist (%Ln entries)</source>
<translation type="obsolete">
</translation>
</message>
</context>
-<context>
- <name>QObject</name>
- <message>
- <location filename="app.cc" line="105"/>
- <source>transmission %1</source>
- <translation></translation>
- </message>
- <message>
- <location filename="app.cc" line="106"/>
- <source>Invalid option</source>
- <translation></translation>
- </message>
- <message>
- <location filename="app.cc" line="107"/>
- <source>Got opt %1</source>
- <translation></translation>
- </message>
-</context>
-<context>
- <name>RelocateDialog</name>
- <message>
- <location filename="relocate.cc" line="74"/>
- <source>Set Torrent Location</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="relocate.cc" line="80"/>
- <source>Set Location</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="relocate.cc" line="81"/>
- <source>New &location:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="relocate.cc" line="82"/>
- <source>&Move from the current folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="relocate.cc" line="83"/>
- <source>Local data is &already there</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>Session</name>
- <message>
- <location filename="session.cc" line="686"/>
- <source>Add Torrent</source>
- <translation></translation>
- </message>
-</context>
-<context>
- <name>SessionDialog</name>
- <message>
- <location filename="session-dialog.cc" line="71"/>
- <source>Change Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="session-dialog.cc" line="77"/>
- <source>Source</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="session-dialog.cc" line="78"/>
- <source>Start &Local Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="session-dialog.cc" line="82"/>
- <source>Connect to &Remote Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="session-dialog.cc" line="88"/>
- <source>&Host:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="session-dialog.cc" line="93"/>
- <source>&Port:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="session-dialog.cc" line="95"/>
- <source>&Authentication required</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="session-dialog.cc" line="102"/>
- <source>&Username:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="session-dialog.cc" line="107"/>
- <source>Pass&word:</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
<context>
<name>StatsDialog</name>
- <message>
- <location filename="stats-dialog.cc" line="35"/>
- <source>Statistics</source>
- <translation></translation>
- </message>
- <message>
- <location filename="stats-dialog.cc" line="38"/>
- <source>Current Session</source>
- <translation></translation>
- </message>
- <message>
- <location filename="stats-dialog.cc" line="39"/>
- <location filename="stats-dialog.cc" line="46"/>
- <source>Uploaded:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="stats-dialog.cc" line="40"/>
- <location filename="stats-dialog.cc" line="47"/>
- <source>Downloaded:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="stats-dialog.cc" line="41"/>
- <location filename="stats-dialog.cc" line="48"/>
- <source>Ratio:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="stats-dialog.cc" line="42"/>
- <location filename="stats-dialog.cc" line="49"/>
- <source>Duration:</source>
- <translation></translation>
- </message>
- <message>
- <location filename="stats-dialog.cc" line="44"/>
- <source>Total</source>
- <translation></translation>
- </message>
<message numerus="yes">
<location filename="stats-dialog.cc" line="45"/>
<location filename="stats-dialog.cc" line="98"/>
</translation>
</message>
</context>
-<context>
- <name>Torrent</name>
- <message>
- <location filename="torrent.cc" line="614"/>
- <source>Waiting to verify local data</source>
- <translation></translation>
- </message>
- <message>
- <location filename="torrent.cc" line="615"/>
- <source>Verifying local data</source>
- <translation></translation>
- </message>
- <message>
- <location filename="torrent.cc" line="616"/>
- <source>Downloading</source>
- <translation></translation>
- </message>
- <message>
- <location filename="torrent.cc" line="617"/>
- <source>Seeding</source>
- <translation></translation>
- </message>
- <message>
- <location filename="torrent.cc" line="618"/>
- <source>Paused</source>
- <translation></translation>
- </message>
-</context>
<context>
<name>TorrentDelegate</name>
- <message>
- <location filename="torrent-delegate.cc" line="78"/>
- <source>%1 of %2 (%3%)</source>
- <translation></translation>
- </message>
- <message>
- <location filename="torrent-delegate.cc" line="89"/>
- <source>%1 of %2 (%3%), uploaded %4 (Ratio: %5)</source>
- <translation></translation>
- </message>
- <message>
- <location filename="torrent-delegate.cc" line="102"/>
- <source>%1, uploaded %2 (Ratio: %3 Goal %4)</source>
- <translation></translation>
- </message>
- <message>
- <location filename="torrent-delegate.cc" line="113"/>
- <source>%1, uploaded %2 (Ratio: %3)</source>
- <translation></translation>
- </message>
- <message>
- <location filename="torrent-delegate.cc" line="122"/>
- <location filename="torrent-delegate.cc" line="222"/>
- <source> - </source>
- <translation></translation>
- </message>
- <message>
- <location filename="torrent-delegate.cc" line="124"/>
- <source>%1 left</source>
- <translation></translation>
- </message>
- <message>
- <location filename="torrent-delegate.cc" line="126"/>
- <source>Remaining time unknown</source>
- <translation></translation>
- </message>
- <message>
- <location filename="torrent-delegate.cc" line="145"/>
- <source>Down: %1, Up: %2</source>
- <translation></translation>
- </message>
- <message>
- <location filename="torrent-delegate.cc" line="147"/>
- <source>Down: %1</source>
- <translation></translation>
- </message>
- <message>
- <location filename="torrent-delegate.cc" line="149"/>
- <source>Up: %1</source>
- <translation></translation>
- </message>
- <message>
- <location filename="torrent-delegate.cc" line="151"/>
- <source>Idle</source>
- <translation></translation>
- </message>
- <message>
- <location filename="torrent-delegate.cc" line="164"/>
- <source>Paused</source>
- <translation></translation>
- </message>
- <message>
- <location filename="torrent-delegate.cc" line="168"/>
- <source>Waiting to verify local data</source>
- <translation></translation>
- </message>
- <message>
- <location filename="torrent-delegate.cc" line="172"/>
- <source>Verifying local data (%1% tested)</source>
- <translation></translation>
- </message>
<message numerus="yes">
<location filename="torrent-delegate.cc" line="207"/>
<source>Downloading from %1 of %n connected peer(s)</source>
<numerusform>Seeding to %1 of %n connected peers</numerusform>
</translation>
</message>
- <message>
- <location filename="torrent-delegate.cc" line="178"/>
- <source>Ratio: %1, </source>
- <translation></translation>
- </message>
</context>
<context>
<name>TrMainWindow</name>
- <message>
- <location filename="mainwin.cc" line="654"/>
- <source> - %1</source>
- <translation></translation>
- </message>
<message numerus="yes">
<location filename="mainwin.cc" line="665"/>
<source>%Ln Torrent(s)</source>
<numerusform>%L1 of %Ln Torrents</numerusform>
</translation>
</message>
- <message>
- <location filename="mainwin.cc" line="689"/>
- <location filename="mainwin.cc" line="705"/>
- <source>Ratio: %1</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.cc" line="694"/>
- <location filename="mainwin.cc" line="700"/>
- <source>Down: %1, Up: %2</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.cc" line="1035"/>
- <source>Add Torrent</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.cc" line="1037"/>
- <source>Torrent Files (*.torrent);;All Files (*.*)</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.cc" line="1041"/>
- <source>Display &options dialog</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.cc" line="1099"/>
- <source>Transmission server is responding</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.cc" line="1100"/>
- <source>Last response from server was %1 ago</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.cc" line="1009"/>
- <source>Click to disable Speed Limit Mode</source>
- <translation></translation>
- </message>
- <message>
- <location filename="mainwin.cc" line="365"/>
- <source>A&ll</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="mainwin.cc" line="365"/>
- <source>&Active</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="mainwin.cc" line="365"/>
- <source>&Downloading</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="mainwin.cc" line="365"/>
- <source>&Seeding</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="mainwin.cc" line="365"/>
- <source>&Paused</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="mainwin.cc" line="509"/>
- <source>Limit Download Speed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="mainwin.cc" line="512"/>
- <location filename="mainwin.cc" line="532"/>
- <source>Unlimited</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="mainwin.cc" line="517"/>
- <location filename="mainwin.cc" line="537"/>
- <location filename="mainwin.cc" line="939"/>
- <location filename="mainwin.cc" line="947"/>
- <source>Limited at %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="mainwin.cc" line="529"/>
- <source>Limit Upload Speed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="mainwin.cc" line="550"/>
- <source>Stop Seeding at Ratio</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="mainwin.cc" line="554"/>
- <source>Seed Forever</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="mainwin.cc" line="559"/>
- <location filename="mainwin.cc" line="955"/>
- <source>Stop at Ratio (%1)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="mainwin.cc" line="1010"/>
- <source>Click to enable Speed Limit Mode</source>
- <translation></translation>
- </message>
</context>
<context>
<name>Utils</name>
- <message>
- <location filename="utils.cc" line="40"/>
- <location filename="utils.cc" line="77"/>
- <source>None</source>
- <translation></translation>
- </message>
<message numerus="yes">
<location filename="utils.cc" line="45"/>
<source>%Ln byte(s)</source>
<numerusform>%Ln bytes</numerusform>
</translation>
</message>
- <message>
- <location filename="utils.cc" line="54"/>
- <source>%L1 KB</source>
- <translation></translation>
- </message>
- <message>
- <location filename="utils.cc" line="59"/>
- <source>%L1 MB</source>
- <translation></translation>
- </message>
- <message>
- <location filename="utils.cc" line="64"/>
- <source>%L1 GB</source>
- <translation></translation>
- </message>
<message numerus="yes">
<location filename="utils.cc" line="106"/>
<source>%Ln day(s)</source>
<numerusform>%Ln seconds</numerusform>
</translation>
</message>
- <message>
- <location filename="utils.cc" line="116"/>
- <location filename="utils.cc" line="123"/>
- <location filename="utils.cc" line="130"/>
- <source>%1, %2</source>
- <translation></translation>
- </message>
- <message>
- <location filename="utils.cc" line="147"/>
- <source>%L1 KB/s</source>
- <translation></translation>
- </message>
- <message>
- <location filename="utils.cc" line="149"/>
- <source>%L1 MB/s</source>
- <translation></translation>
- </message>
- <message>
- <location filename="utils.cc" line="151"/>
- <source>%L1 GB/s</source>
- <translation></translation>
- </message>
</context>
</TS>