summary refs log blame commit diff stats
path: root/plugins/perl/perl.c
blob: c9bfa5e9cc4fe7f52bfcf6373b68b067d50f0b7f (plain) (tree)























                                                                            




                    

                   








































                                                                                                




































                                                                                             



















                                                                                        
      















                                                                                             
                                                                                                 
                                                                             
     
                                                                             
                                        
      
 
                                             
                               
                                    


                                           
     
            
                                                              









                                                                      
      





















































































































































                                                                                                                                                       







                                                                          














                                               
                                            
                                                 
                                           
























































                                                                                              

                                            
                                                 
                                           























































                                                                                                 
                                            
                                                 
                                           













































                                                                                              
                                            
                                                 
                                           








































































                                                                                              
                                            
                                                 
                                           

















































































































































































































































































                                                                                                                             
                    




                         
                         
                                
                                                                                                                                     




                                           
                                 





                                                  

                                                    
                                

                                                  














                                                                                  
                    




                         
                         
                                
                                                                                                                                                 




                                           
                                                                                     





                                                                              
                                 






                                                  

                                                    
                                
                                                  















                                                                                       
                    


                         
                         
                                
                                                                                                                                    





                                           
                                 





                                                  

                                                    
                                
                                                  

































                                                                                                                             

                                                    
                                                   
                                                  














                                                                      
                    












                                                                                                                   
                                 



















                                                                                           



                                                    

































                                                                            
 










































































































































































































































































































                                                                                                                                             
             
                                                                                                        
     
                                                                                                        
      






                                                                                   


                                                                                                                            



                                                                                                                        

                                                                                                                              
                                                                                                

                                                                                                                   

































































































































































                                                                                                                            
/* X-Chat 2.0 PERL Plugin
 * Copyright (C) 1998-2002 Peter Zelezny.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 */

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#ifdef ENABLE_NLS
#include <locale.h>
#endif
#ifdef WIN32
#include <windows.h>
#else
#include <dirent.h>
#endif

#undef PACKAGE
#include "../../config.h"		  /* for #define OLD_PERL */
#include "xchat-plugin.h"

static xchat_plugin *ph;		  /* plugin handle */

static int perl_load_file (char *script_name);

#ifdef WIN32
/* STRINGIFY is from perl's CORE/config.h */
#ifndef PERL_REQUIRED_VERSION
	#define PERL_REQUIRED_VERSION STRINGIFY(PERL_REVISION) "." STRINGIFY(PERL_VERSION)
#endif

#ifndef PERL_DLL
	#define PERL_DLL "perl" STRINGIFY(PERL_REVISION) STRINGIFY(PERL_VERSION) ".dll"
#endif

static DWORD
child (char *str)
{
	MessageBoxA (0, str, "Perl DLL Error",
					 MB_OK | MB_ICONHAND | MB_SETFOREGROUND | MB_TASKMODAL);
	return 0;
}

static void
thread_mbox (char *str)
{
	DWORD tid;

	CloseHandle (CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) child,
										str, 0, &tid));
}

#endif

/* leave this before XSUB.h, to avoid readdir() being redefined */

#ifdef WIN32
static void
perl_auto_load_from_path (const char *path)
{
	WIN32_FIND_DATA find_data;
	HANDLE find_handle;
	char *search_path;
	int path_len = strlen (path);

	/* +6 for \*.pl and \0 */
	search_path = malloc(path_len + 6);
	sprintf (search_path, "%s\\*.pl", path);

	find_handle = FindFirstFile (search_path, &find_data);

	if (find_handle != INVALID_HANDLE_VALUE)
	{
		do
		{
			if (!(find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY
				||find_data.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN))
			{
				char *full_path =
					malloc (path_len + strlen (find_data.cFileName) + 2);
				sprintf (full_path, "%s\\%s", path, find_data.cFileName);

				perl_load_file (full_path);
				free (full_path);
			}
		}
		while (FindNextFile (find_handle, &find_data) != 0);
		FindClose (find_handle);
	}

	free (search_path);
}
#else
static void
perl_auto_load_from_path (const char *path)
{
	DIR *dir;
	struct dirent *ent;

	dir = opendir (path);
	if (dir) {
		while ((ent = readdir (dir))) {
			int len = strlen (ent->d_name);
			if (len > 3 && strcasecmp (".pl", ent->d_name + len - 3) == 0) {
				char *file = malloc (len + strlen (path) + 2);
				sprintf (file, "%s/%s", path, ent->d_name);
				perl_load_file (file);
				free (file);
			}
		}
		closedir (dir);
	}
}
#endif

static int
perl_auto_load (void *unused)
{
	const char *xdir;
	char *sub_dir;
#ifdef WIN32
	int copied = 0;
	char *slash = NULL;
#endif

	/* get the dir in local filesystem encoding (what opendir() expects!) */
	xdir = xchat_get_info (ph, "xchatdirfs");
	if (!xdir)			/* xchatdirfs is new for 2.0.9, will fail on older */
		xdir = xchat_get_info (ph, "xchatdir");

	/* don't pollute the filesystem with script files, this only causes misuse of the folders
	 * only use ~/.config/hexchat/addons/ and %APPDATA%\HexChat\addons */
#if 0
	/* autoload from ~/.config/hexchat/ or %APPDATA%\HexChat\ on win32 */
	perl_auto_load_from_path (xdir);
#endif

	sub_dir = malloc (strlen (xdir) + 8);
	strcpy (sub_dir, xdir);
	strcat (sub_dir, "/addons");
	perl_auto_load_from_path (sub_dir);
	free (sub_dir);

#if 0
#ifdef WIN32
	/* autoload from  C:\Program Files\HexChat\plugins\ */
	sub_dir = malloc (1025 + 9);
	copied = GetModuleFileName( 0, sub_dir, 1024 );
	sub_dir[copied] = '\0';
	slash = strrchr( sub_dir, '\\' );
	if( slash != NULL ) {
		*slash = '\0';
	}
	perl_auto_load_from_path ( strncat (sub_dir, "\\plugins", 9));
	free (sub_dir);
#endif
#endif
	return 0;
}

#include <EXTERN.h>
#define WIN32IOP_H
#include <perl.h>
#include <XSUB.h>

typedef struct
{
	SV *callback;
	SV *userdata;
	xchat_hook *hook;   /* required for timers */
	xchat_context *ctx; /* allow timers to remember their context */
	SV *package;      /* need to track the package name when removing hooks
	                       by returning REMOVE
							   */
	unsigned int depth;
} HookData;

static PerlInterpreter *my_perl = NULL;
extern void boot_DynaLoader (pTHX_ CV * cv);

/*
  this is used for autoload and shutdown callbacks
*/
static int
execute_perl (SV * function, char *args)
{

	int count, ret_value = 1;

	dSP;
	ENTER;
	SAVETMPS;

	PUSHMARK (SP);
	XPUSHs (sv_2mortal (newSVpv (args, 0)));
	PUTBACK;

	count = call_sv (function, G_EVAL | G_SCALAR);
	SPAGAIN;
	if (SvTRUE (ERRSV)) {
		xchat_printf(ph, "Perl error: %s\n", SvPV_nolen (ERRSV));
		if (!SvOK (POPs)) {}		/* remove undef from the top of the stack */
	} else if (count != 1) {
		xchat_printf (ph, "Perl error: expected 1 value from %s, "
						  "got: %d\n", SvPV_nolen (function), count);
	} else {
		ret_value = POPi;
	}
	PUTBACK;
	FREETMPS;
	LEAVE;

	return ret_value;
}

static char *
get_filename (char *word[], char *word_eol[])
{
	int len;
	char *file;

	len = strlen (word[2]);

	/* if called as /load "filename.pl" the only difference between word and
	 * word_eol will be the two quotes
	 */
	
	if (strchr (word[2], ' ') != NULL
		|| (strlen (word_eol[2]) - strlen(word[2])) == 2 )
	{
		file = word[2];
	} else {
		file = word_eol[2];
	}

	len = strlen (file);

	if (len > 3 && strncasecmp (".pl", file + len - 3, 3) == 0) {
		return file;
	}

	return NULL;
}

static SV *
list_item_to_sv ( xchat_list *list, const char *const *fields )
{
	HV *hash = newHV();
	SV *field_value;
	const char *field;
	int field_index = 0;
	const char *field_name;
	int name_len;

	while (fields[field_index] != NULL) {
		field_name = fields[field_index] + 1;
		name_len = strlen (field_name);

		switch (fields[field_index][0]) {
		case 's':
			field = xchat_list_str (ph, list, field_name);
			if (field != NULL) {
				field_value = newSVpvn (field, strlen (field));
			} else {
				field_value = &PL_sv_undef;
			}
			break;
		case 'p':
			field_value = newSViv (PTR2IV (xchat_list_str (ph, list,
																	 field_name)));
			break;
		case 'i':
			field_value = newSVuv (xchat_list_int (ph, list, field_name));
			break;
		case 't':
			field_value = newSVnv (xchat_list_time (ph, list, field_name));
			break;
		default:
			field_value = &PL_sv_undef;
		}
		hv_store (hash, field_name, name_len, field_value, 0);
		field_index++;
	}
	return sv_2mortal (newRV_noinc ((SV *) hash));
}

static AV *
array2av (char *array[])
{
	int count = 0;
	SV *temp = NULL;
	AV *av = newAV();
	sv_2mortal ((SV *)av);

	for (
		count = 1;
		count < 32 && array[count] != NULL && array[count][0] != 0;
		count++
	) {
		temp = newSVpv (array[count], 0);
		SvUTF8_on (temp);
		av_push (av, temp);
	}

	return av;
}

/* sets $Xchat::Embed::current_package */
static void
set_current_package (SV *package)
{
	SV *current_package = get_sv ("Xchat::Embed::current_package", 1);
	SvSetSV_nosteal (current_package, package);
}

static int
fd_cb (int fd, int flags, void *userdata)
{
	HookData *data = (HookData *) userdata;
	int retVal = 0;
	int count = 0;

	dSP;
	ENTER;
	SAVETMPS;

	PUSHMARK (SP);
	XPUSHs (data->userdata);
	PUTBACK;

	set_current_package (data->package);
	count = call_sv (data->callback, G_EVAL);
	set_current_package (&PL_sv_undef);
	SPAGAIN;

	if (SvTRUE (ERRSV)) {
		xchat_printf (ph, "Error in fd callback %s", SvPV_nolen (ERRSV));
		if (!SvOK (POPs)) {}		  /* remove undef from the top of the stack */
		retVal = XCHAT_EAT_ALL;
	} else {
		if (count != 1) {
			xchat_print (ph, "Fd handler should only return 1 value.");
			retVal = XCHAT_EAT_NONE;
		} else {
			retVal = POPi;
			if (retVal == 0) {
				/* if 0 is returned, the fd is going to get unhooked */
				PUSHMARK (SP);
				XPUSHs (sv_2mortal (newSViv (PTR2IV (data->hook))));
				PUTBACK;

				call_pv ("Xchat::unhook", G_EVAL);
				SPAGAIN;

				SvREFCNT_dec (data->callback);

				if (data->userdata) {
					SvREFCNT_dec (data->userdata);
				}
				free (data);
			}
		}

	}

	PUTBACK;
	FREETMPS;
	LEAVE;

	return retVal;
}

static int
timer_cb (void *userdata)
{
	HookData *data = (HookData *) userdata;
	int retVal = 0;
	int count = 0;

	dSP;
	ENTER;
	SAVETMPS;

	PUSHMARK (SP);
	XPUSHs (data->userdata);
	PUTBACK;

	if (data->ctx) {
		xchat_set_context (ph, data->ctx);
	}

	set_current_package (data->package);
	count = call_sv (data->callback, G_EVAL);
	set_current_package (&PL_sv_undef);
	SPAGAIN;

	if (SvTRUE (ERRSV)) {
		xchat_printf (ph, "Error in timer callback %s", SvPV_nolen (ERRSV));
		if (!SvOK (POPs)) {}		  /* remove undef from the top of the stack */
		retVal = XCHAT_EAT_ALL;
	} else {
		if (count != 1) {
			xchat_print (ph, "Timer handler should only return 1 value.");
			retVal = XCHAT_EAT_NONE;
		} else {
			retVal = POPi;
			if (retVal == 0) {
				/* if 0 is return the timer is going to get unhooked */
				PUSHMARK (SP);
				XPUSHs (sv_2mortal (newSViv (PTR2IV (data->hook))));
				XPUSHs (sv_mortalcopy (data->package));
				PUTBACK;

				call_pv ("Xchat::unhook", G_EVAL);
				SPAGAIN;
			}
		}

	}

	PUTBACK;
	FREETMPS;
	LEAVE;

	return retVal;
}

static int
server_cb (char *word[], char *word_eol[], void *userdata)
{
	HookData *data = (HookData *) userdata;
	int retVal = 0;
	int count = 0;

	dSP;
	ENTER;
	SAVETMPS;

	if (data->depth)
		return XCHAT_EAT_NONE;

	/*               xchat_printf (ph, */
	/*                               "Recieved %d words in server callback", av_len (wd)); */
	PUSHMARK (SP);
	XPUSHs (newRV_noinc ((SV *) array2av (word)));
	XPUSHs (newRV_noinc ((SV *) array2av (word_eol)));
	XPUSHs (data->userdata);
	PUTBACK;

	data->depth++;
	set_current_package (data->package);
	count = call_sv (data->callback, G_EVAL);
	set_current_package (&PL_sv_undef);
	data->depth--;
	SPAGAIN;
	if (SvTRUE (ERRSV)) {
		xchat_printf (ph, "Error in server callback %s", SvPV_nolen (ERRSV));
		if (!SvOK (POPs)) {}		  /* remove undef from the top of the stack */
		retVal = XCHAT_EAT_NONE;
	} else {
		if (count != 1) {
			xchat_print (ph, "Server handler should only return 1 value.");
			retVal = XCHAT_EAT_NONE;
		} else {
			retVal = POPi;
		}

	}

	PUTBACK;
	FREETMPS;
	LEAVE;

	return retVal;
}

static int
command_cb (char *word[], char *word_eol[], void *userdata)
{
	HookData *data = (HookData *) userdata;
	int retVal = 0;
	int count = 0;

	dSP;
	ENTER;
	SAVETMPS;
	
	if (data->depth)
		return XCHAT_EAT_NONE;

	/*               xchat_printf (ph, "Recieved %d words in command callback", */
	/*                               av_len (wd)); */
	PUSHMARK (SP);
	XPUSHs (newRV_noinc ((SV *) array2av (word)));
	XPUSHs (newRV_noinc ((SV *) array2av (word_eol)));
	XPUSHs (data->userdata);
	PUTBACK;

	data->depth++;
	set_current_package (data->package);
	count = call_sv (data->callback, G_EVAL);
	set_current_package (&PL_sv_undef);
	data->depth--;
	SPAGAIN;
	if (SvTRUE (ERRSV)) {
		xchat_printf (ph, "Error in command callback %s", SvPV_nolen (ERRSV));
		if (!SvOK (POPs)) {}		  /* remove undef from the top of the stack */
		retVal = XCHAT_EAT_XCHAT;
	} else {
		if (count != 1) {
			xchat_print (ph, "Command handler should only return 1 value.");
			retVal = XCHAT_EAT_NONE;
		} else {
			retVal = POPi;
		}

	}

	PUTBACK;
	FREETMPS;
	LEAVE;

	return retVal;
}

static int
print_cb (char *word[], void *userdata)
{

	HookData *data = (HookData *) userdata;
	SV *temp = NULL;
	int retVal = 0;
	int count = 1;
	int last_index = 31;
	/* must be initialized after SAVETMPS */
	AV *wd = NULL;

	dSP;
	ENTER;
	SAVETMPS;

	if (data->depth)
		return XCHAT_EAT_NONE;

	wd = newAV ();
	sv_2mortal ((SV *) wd);

	/* need to scan backwards to find the index of the last element since some
	   events such as "DCC Timeout" can have NULL elements in between non NULL
	   elements */

	while (last_index >= 0
			 && (word[last_index] == NULL || word[last_index][0] == 0)) {
		last_index--;
	}

	for (count = 1; count <= last_index; count++) {
		if (word[count] == NULL) {
			av_push (wd, &PL_sv_undef);
		} else if (word[count][0] == 0) {
			av_push (wd, newSVpvn ("",0));	
		} else {
			temp = newSVpv (word[count], 0);
			SvUTF8_on (temp);
			av_push (wd, temp);
		}
	}

	/*xchat_printf (ph, "Recieved %d words in print callback", av_len (wd)+1); */
	PUSHMARK (SP);
	XPUSHs (newRV_noinc ((SV *) wd));
	XPUSHs (data->userdata);
	PUTBACK;

	data->depth++;
	set_current_package (data->package);
	count = call_sv (data->callback, G_EVAL);
	set_current_package (&PL_sv_undef);
	data->depth--;
	SPAGAIN;
	if (SvTRUE (ERRSV)) {
		xchat_printf (ph, "Error in print callback %s", SvPV_nolen (ERRSV));
		if (!SvOK (POPs)) {}		  /* remove undef from the top of the stack */
		retVal = XCHAT_EAT_NONE;
	} else {
		if (count != 1) {
			xchat_print (ph, "Print handler should only return 1 value.");
			retVal = XCHAT_EAT_NONE;
		} else {
			retVal = POPi;
		}

	}

	PUTBACK;
	FREETMPS;
	LEAVE;

	return retVal;
}

/* custom IRC perl functions for scripting */

/* Xchat::Internal::register (scriptname, version, desc, shutdowncallback, filename)
 *
 */

static
XS (XS_Xchat_register)
{
	char *name, *version, *desc, *filename;
	void *gui_entry;
	dXSARGS;
	if (items != 4) {
		xchat_printf (ph,
						  "Usage: Xchat::Internal::register(scriptname, version, desc, filename)");
	} else {
		name = SvPV_nolen (ST (0));
		version = SvPV_nolen (ST (1));
		desc = SvPV_nolen (ST (2));
		filename = SvPV_nolen (ST (3));

		gui_entry = xchat_plugingui_add (ph, filename, name,
													desc, version, NULL);

		XSRETURN_IV (PTR2IV (gui_entry));

	}
}


/* Xchat::print(output) */
static
XS (XS_Xchat_print)
{

	char *text = NULL;

	dXSARGS;
	if (items != 1) {
		xchat_print (ph, "Usage: Xchat::Internal::print(text)");
	} else {
		text = SvPV_nolen (ST (0));
		xchat_print (ph, text);
	}
	XSRETURN_EMPTY;
}

static
XS (XS_Xchat_emit_print)
{
	char *event_name;
	int RETVAL;
	int count;

	dXSARGS;
	if (items < 1) {
		xchat_print (ph, "Usage: Xchat::emit_print(event_name, ...)");
	} else {
		event_name = (char *) SvPV_nolen (ST (0));
		RETVAL = 0;

		/* we need to figure out the number of defined values passed in */
		for (count = 0; count < items; count++) {
			if (!SvOK (ST (count))) {
				break;
			}
		}

		switch (count) {
		case 1:
			RETVAL = xchat_emit_print (ph, event_name, NULL);
			break;
		case 2:
			RETVAL = xchat_emit_print (ph, event_name,
												SvPV_nolen (ST (1)), NULL);
			break;
		case 3:
			RETVAL = xchat_emit_print (ph, event_name,
												SvPV_nolen (ST (1)),
												SvPV_nolen (ST (2)), NULL);
			break;
		case 4:
			RETVAL = xchat_emit_print (ph, event_name,
												SvPV_nolen (ST (1)),
												SvPV_nolen (ST (2)),
												SvPV_nolen (ST (3)), NULL);
			break;
		case 5:
			RETVAL = xchat_emit_print (ph, event_name,
												SvPV_nolen (ST (1)),
												SvPV_nolen (ST (2)),
												SvPV_nolen (ST (3)),
												SvPV_nolen (ST (4)), NULL);
			break;

		}

		XSRETURN_IV (RETVAL);
	}
}

static
XS (XS_Xchat_send_modes)
{
	AV *p_targets = NULL;
	int modes_per_line = 0;
	char sign;
	char mode;
	int i = 0;
	const char **targets;
	int target_count = 0;
	SV **elem;

	dXSARGS;
	if (items < 3 || items > 4) {
		xchat_print (ph,
			"Usage: Xchat::send_modes( targets, sign, mode, modes_per_line)"
		);
	} else {
		if (SvROK (ST (0))) {
			p_targets = (AV*) SvRV (ST (0));
			target_count = av_len (p_targets) + 1;
			targets = malloc (target_count * sizeof (char *));
			for (i = 0; i < target_count; i++ ) {
				elem = av_fetch (p_targets, i, 0);

				if (elem != NULL) {
					targets[i] = SvPV_nolen (*elem);
				} else {
					targets[i] = "";
				}
			}
		} else{
			targets = malloc (sizeof (char *));
			targets[0] = SvPV_nolen (ST (0));
			target_count = 1;
		}
		
		if (target_count == 0) {
			XSRETURN_EMPTY;
		}

		sign = (SvPV_nolen (ST (1)))[0];
		mode = (SvPV_nolen (ST (2)))[0];

		if (items == 4 ) {
			modes_per_line = (int) SvIV (ST (3)); 
		}

		xchat_send_modes (ph, targets, target_count, modes_per_line, sign, mode);
		free (targets);
	}
}
static
XS (XS_Xchat_get_info)
{
	SV *temp = NULL;
	dXSARGS;
	if (items != 1) {
		xchat_print (ph, "Usage: Xchat::get_info(id)");
	} else {
		SV *id = ST (0);
		const char *RETVAL;

		RETVAL = xchat_get_info (ph, SvPV_nolen (id));
		if (RETVAL == NULL) {
			XSRETURN_UNDEF;
		}

		if (!strncmp ("win_ptr", SvPV_nolen (id), 7)
			|| !strncmp ("gtkwin_ptr", SvPV_nolen (id), 10))
		{
			XSRETURN_IV (PTR2IV (RETVAL));
		} else {
			
			if (
				!strncmp ("libdirfs", SvPV_nolen (id), 8) ||
				!strncmp ("xchatdirfs", SvPV_nolen (id), 10)
			) {
				XSRETURN_PV (RETVAL);
			} else {
				temp = newSVpv (RETVAL, 0);
				SvUTF8_on (temp);
				PUSHMARK (SP);
				XPUSHs (sv_2mortal (temp));
				PUTBACK;
			}
		}
	}
}

static
XS (XS_Xchat_context_info)
{
	const char *const *fields;
	dXSARGS;

	if (items > 0 ) {
		xchat_print (ph, "Usage: Xchat::Internal::context_info()");
	}
	fields = xchat_list_fields (ph, "channels" );
	XPUSHs (list_item_to_sv (NULL, fields));
	XSRETURN (1);
}

static
XS (XS_Xchat_get_prefs)
{
	const char *str;
	int integer;
	SV *temp = NULL;
	dXSARGS;
	if (items != 1) {
		xchat_print (ph, "Usage: Xchat::get_prefs(name)");
	} else {


		switch (xchat_get_prefs (ph, SvPV_nolen (ST (0)), &str, &integer)) {
		case 0:
			XSRETURN_UNDEF;
			break;
		case 1:
			temp = newSVpv (str, 0);
			SvUTF8_on (temp);
			SP -= items;
			sp = mark;
			XPUSHs (sv_2mortal (temp));
			PUTBACK;
			break;
		case 2:
			XSRETURN_IV (integer);
			break;
		case 3:
			if (integer) {
				XSRETURN_YES;
			} else {
				XSRETURN_NO;
			}
		}
	}
}

/* Xchat::Internal::hook_server(name, priority, callback, userdata) */
static
XS (XS_Xchat_hook_server)
{

	char *name;
	int pri;
	SV *callback;
	SV *userdata;
	SV *package;
	xchat_hook *hook;
	HookData *data;

	dXSARGS;

	if (items != 5) {
		xchat_print (ph,
						 "Usage: Xchat::Internal::hook_server(name, priority, callback, userdata, package)");
	} else {
		name = SvPV_nolen (ST (0));
		pri = (int) SvIV (ST (1));
		callback = ST (2);
		userdata = ST (3);
		package = ST (4);
		data = NULL;
		data = malloc (sizeof (HookData));
		if (data == NULL) {
			XSRETURN_UNDEF;
		}

		data->callback = newSVsv (callback);
		data->userdata = newSVsv (userdata);
		data->depth = 0;
		data->package = newSVsv (package);

		hook = xchat_hook_server (ph, name, pri, server_cb, data);

		XSRETURN_IV (PTR2IV (hook));
	}
}

/* Xchat::Internal::hook_command(name, priority, callback, help_text, userdata) */
static
XS (XS_Xchat_hook_command)
{
	char *name;
	int pri;
	SV *callback;
	char *help_text = NULL;
	SV *userdata;
	SV *package;
	xchat_hook *hook;
	HookData *data;

	dXSARGS;

	if (items != 6) {
		xchat_print (ph,
						 "Usage: Xchat::Internal::hook_command(name, priority, callback, help_text, userdata, package)");
	} else {
		name = SvPV_nolen (ST (0));
		pri = (int) SvIV (ST (1));
		callback = ST (2);

		/* leave the help text as NULL if the help text is undefined to avoid
		 * overriding the default help message for builtin commands */
		if (SvOK(ST (3))) {
			help_text = SvPV_nolen (ST (3));
		}

		userdata = ST (4);
		package = ST (5);
		data = NULL;

		data = malloc (sizeof (HookData));
		if (data == NULL) {
			XSRETURN_UNDEF;
		}

		data->callback = newSVsv (callback);
		data->userdata = newSVsv (userdata);
		data->depth = 0;
		data->package = newSVsv (package);
		hook = xchat_hook_command (ph, name, pri, command_cb, help_text, data);

		XSRETURN_IV (PTR2IV (hook));
	}

}

/* Xchat::Internal::hook_print(name, priority, callback, [userdata]) */
static
XS (XS_Xchat_hook_print)
{

	char *name;
	int pri;
	SV *callback;
	SV *userdata;
	SV *package;
	xchat_hook *hook;
	HookData *data;
	dXSARGS;
	if (items != 5) {
		xchat_print (ph,
						 "Usage: Xchat::Internal::hook_print(name, priority, callback, userdata, package)");
	} else {
		name = SvPV_nolen (ST (0));
		pri = (int) SvIV (ST (1));
		callback = ST (2);
		data = NULL;
		userdata = ST (3);
		package = ST (4);

		data = malloc (sizeof (HookData));
		if (data == NULL) {
			XSRETURN_UNDEF;
		}

		data->callback = newSVsv (callback);
		data->userdata = newSVsv (userdata);
		data->depth = 0;
		data->package = newSVsv (package);
		hook = xchat_hook_print (ph, name, pri, print_cb, data);

		XSRETURN_IV (PTR2IV (hook));
	}
}

/* Xchat::Internal::hook_timer(timeout, callback, userdata) */
static
XS (XS_Xchat_hook_timer)
{
	int timeout;
	SV *callback;
	SV *userdata;
	xchat_hook *hook;
	SV *package;
	HookData *data;

	dXSARGS;

	if (items != 4) {
		xchat_print (ph,
						 "Usage: Xchat::Internal::hook_timer(timeout, callback, userdata, package)");
	} else {
		timeout = (int) SvIV (ST (0));
		callback = ST (1);
		data = NULL;
		userdata = ST (2);
		package = ST (3);

		data = malloc (sizeof (HookData));
		if (data == NULL) {
			XSRETURN_UNDEF;
		}

		data->callback = newSVsv (callback);
		data->userdata = newSVsv (userdata);
		data->ctx = xchat_get_context (ph);
		data->package = newSVsv (package);
		hook = xchat_hook_timer (ph, timeout, timer_cb, data);
		data->hook = hook;

		XSRETURN_IV (PTR2IV (hook));
	}
}

/* Xchat::Internal::hook_fd(fd, callback, flags, userdata) */
static
XS (XS_Xchat_hook_fd)
{
	int fd;
	SV *callback;
	int flags;
	SV *userdata;
	SV *package;
	xchat_hook *hook;
	HookData *data;

	dXSARGS;

	if (items != 4) {
		xchat_print (ph,
						 "Usage: Xchat::Internal::hook_fd(fd, callback, flags, userdata)");
	} else {
		fd = (int) SvIV (ST (0));
		callback = ST (1);
		flags = (int) SvIV (ST (2));
		userdata = ST (3);
		package = ST (4);
		data = NULL;

#ifdef WIN32
		if ((flags & XCHAT_FD_NOTSOCKET) == 0) {
			/* this _get_osfhandle if from win32iop.h in the perl distribution,
			 *  not the one provided by Windows
			 */ 
			fd = _get_osfhandle(fd);
			if (fd < 0) {
				xchat_print(ph, "Invalid file descriptor");
				XSRETURN_UNDEF;
			}
		}
#endif

		data = malloc (sizeof (HookData));
		if (data == NULL) {
			XSRETURN_UNDEF;
		}

		data->callback = newSVsv (callback);
		data->userdata = newSVsv (userdata);
		data->depth = 0;
		data->package = newSVsv (package);
		hook = xchat_hook_fd (ph, fd, flags, fd_cb, data);
		data->hook = hook;

		XSRETURN_IV (PTR2IV (hook));
	}
}

static
XS (XS_Xchat_unhook)
{
	xchat_hook *hook;
	HookData *userdata;
	int retCount = 0;
	dXSARGS;
	if (items != 1) {
		xchat_print (ph, "Usage: Xchat::unhook(hook)");
	} else {
		hook = INT2PTR (xchat_hook *, SvUV (ST (0)));
		userdata = (HookData *) xchat_unhook (ph, hook);

		if (userdata != NULL) {
			if (userdata->callback != NULL) {
				SvREFCNT_dec (userdata->callback);
			}

			if (userdata->userdata != NULL) {
				XPUSHs (sv_mortalcopy (userdata->userdata));
				SvREFCNT_dec (userdata->userdata);
				retCount = 1;
			}

			if (userdata->package != NULL) {
				SvREFCNT_dec (userdata->package);
			}

			free (userdata);
		}
		XSRETURN (retCount);
	}
	XSRETURN_EMPTY;
}

/* Xchat::Internal::command(command) */
static
XS (XS_Xchat_command)
{
	char *cmd = NULL;

	dXSARGS;
	if (items != 1) {
		xchat_print (ph, "Usage: Xchat::Internal::command(command)");
	} else {
		cmd = SvPV_nolen (ST (0));
		xchat_command (ph, cmd);

	}
	XSRETURN_EMPTY;
}

static
XS (XS_Xchat_find_context)
{
	char *server = NULL;
	char *chan = NULL;
	xchat_context *RETVAL;

	dXSARGS;
	if (items > 2)
		xchat_print (ph, "Usage: Xchat::find_context ([channel, [server]])");
	{

		switch (items) {
		case 0:						  /* no server name and no channel name */
			/* nothing to do, server and chan are already NULL */
			break;
		case 1:						  /* channel name only */
			/* change channel value only if it is true or 0 */
			/* otherwise leave it as null */
			if (SvTRUE (ST (0)) || SvNIOK (ST (0))) {
				chan = SvPV_nolen (ST (0));
				/*                               xchat_printf( ph, "XSUB - find_context( %s, NULL )", chan ); */
			}
			/* else { xchat_print( ph, "XSUB - find_context( NULL, NULL )" ); } */
			/* chan is already NULL */
			break;
		case 2:						  /* server and channel */
			/* change channel value only if it is true or 0 */
			/* otherwise leave it as NULL */
			if (SvTRUE (ST (0)) || SvNIOK (ST (0))) {
				chan = SvPV_nolen (ST (0));
				/*                               xchat_printf( ph, "XSUB - find_context( %s, NULL )", SvPV_nolen(ST(0) )); */
			}

			/* else { xchat_print( ph, "XSUB - 2 arg NULL chan" ); } */
			/* change server value only if it is true or 0 */
			/* otherwise leave it as NULL */
			if (SvTRUE (ST (1)) || SvNIOK (ST (1))) {
				server = SvPV_nolen (ST (1));
				/*                               xchat_printf( ph, "XSUB - find_context( NULL, %s )", SvPV_nolen(ST(1) )); */
			}
			/*  else { xchat_print( ph, "XSUB - 2 arg NULL server" ); } */
			break;
		}

		RETVAL = xchat_find_context (ph, server, chan);
		if (RETVAL != NULL) {
			/*                      xchat_print (ph, "XSUB - context found"); */
			XSRETURN_IV (PTR2IV (RETVAL));
		} else {
			/*           xchat_print (ph, "XSUB - context not found"); */
			XSRETURN_UNDEF;
		}
	}
}

static
XS (XS_Xchat_get_context)
{
	dXSARGS;
	if (items != 0) {
		xchat_print (ph, "Usage: Xchat::get_context()");
	} else {
		XSRETURN_IV (PTR2IV (xchat_get_context (ph)));
	}
}

static
XS (XS_Xchat_set_context)
{
	xchat_context *ctx;
	dXSARGS;
	if (items != 1) {
		xchat_print (ph, "Usage: Xchat::set_context(ctx)");
	} else {
		ctx = INT2PTR (xchat_context *, SvUV (ST (0)));
		XSRETURN_IV ((IV) xchat_set_context (ph, ctx));
	}
}

static
XS (XS_Xchat_nickcmp)
{
	dXSARGS;
	if (items != 2) {
		xchat_print (ph, "Usage: Xchat::nickcmp(s1, s2)");
	} else {
		XSRETURN_IV ((IV) xchat_nickcmp (ph, SvPV_nolen (ST (0)),
													SvPV_nolen (ST (1))));
	}
}

static
XS (XS_Xchat_get_list)
{
	SV *name;
	xchat_list *list;
	const char *const *fields;
	int count = 0;					  /* return value for scalar context */
	dXSARGS;

	if (items != 1) {
		xchat_print (ph, "Usage: Xchat::get_list(name)");
	} else {
		SP -= items;				  /*remove the argument list from the stack */

		name = ST (0);

		list = xchat_list_get (ph, SvPV_nolen (name));

		if (list == NULL) {
			XSRETURN_EMPTY;
		}

		if (GIMME_V == G_SCALAR) {
			while (xchat_list_next (ph, list)) {
				count++;
			}
			xchat_list_free (ph, list);
			XSRETURN_IV ((IV) count);
		}

		fields = xchat_list_fields (ph, SvPV_nolen (name));
		while (xchat_list_next (ph, list)) {
			XPUSHs (list_item_to_sv (list, fields));
		}
		xchat_list_free (ph, list);

		PUTBACK;
		return;
	}
}

static
XS (XS_Xchat_Embed_plugingui_remove)
{
	void *gui_entry;
	dXSARGS;
	if (items != 1) {
		xchat_print (ph, "Usage: Xchat::Embed::plugingui_remove(handle)");
	} else {
		gui_entry = INT2PTR (void *, SvUV (ST (0)));
		xchat_plugingui_remove (ph, gui_entry);
	}
	XSRETURN_EMPTY;
}

/* xs_init is the second argument perl_parse. As the name hints, it
   initializes XS subroutines (see the perlembed manpage) */
static void
xs_init (pTHX)
{
	HV *stash;
	SV *version;
	/* This one allows dynamic loading of perl modules in perl
	   scripts by the 'use perlmod;' construction */
	newXS ("DynaLoader::boot_DynaLoader", boot_DynaLoader, __FILE__);
	/* load up all the custom IRC perl functions */
	newXS ("Xchat::Internal::register", XS_Xchat_register, __FILE__);
	newXS ("Xchat::Internal::hook_server", XS_Xchat_hook_server, __FILE__);
	newXS ("Xchat::Internal::hook_command", XS_Xchat_hook_command, __FILE__);
	newXS ("Xchat::Internal::hook_print", XS_Xchat_hook_print, __FILE__);
	newXS ("Xchat::Internal::hook_timer", XS_Xchat_hook_timer, __FILE__);
	newXS ("Xchat::Internal::hook_fd", XS_Xchat_hook_fd, __FILE__);
	newXS ("Xchat::Internal::unhook", XS_Xchat_unhook, __FILE__);
	newXS ("Xchat::Internal::print", XS_Xchat_print, __FILE__);
	newXS ("Xchat::Internal::command", XS_Xchat_command, __FILE__);
	newXS ("Xchat::Internal::set_context", XS_Xchat_set_context, __FILE__);
	newXS ("Xchat::Internal::get_info", XS_Xchat_get_info, __FILE__);
	newXS ("Xchat::Internal::context_info", XS_Xchat_context_info, __FILE__);
	newXS ("Xchat::Internal::get_list", XS_Xchat_get_list, __FILE__);
	
	newXS ("Xchat::find_context", XS_Xchat_find_context, __FILE__);
	newXS ("Xchat::get_context", XS_Xchat_get_context, __FILE__);
	newXS ("Xchat::get_prefs", XS_Xchat_get_prefs, __FILE__);
	newXS ("Xchat::emit_print", XS_Xchat_emit_print, __FILE__);
	newXS ("Xchat::send_modes", XS_Xchat_send_modes, __FILE__);
	newXS ("Xchat::nickcmp", XS_Xchat_nickcmp, __FILE__);

	newXS ("Xchat::Embed::plugingui_remove", XS_Xchat_Embed_plugingui_remove,
			 __FILE__);

	stash = get_hv ("Xchat::", TRUE);
	if (stash == NULL) {
		exit (1);
	}

	newCONSTSUB (stash, "PRI_HIGHEST", newSViv (XCHAT_PRI_HIGHEST));
	newCONSTSUB (stash, "PRI_HIGH", newSViv (XCHAT_PRI_HIGH));
	newCONSTSUB (stash, "PRI_NORM", newSViv (XCHAT_PRI_NORM));
	newCONSTSUB (stash, "PRI_LOW", newSViv (XCHAT_PRI_LOW));
	newCONSTSUB (stash, "PRI_LOWEST", newSViv (XCHAT_PRI_LOWEST));

	newCONSTSUB (stash, "EAT_NONE", newSViv (XCHAT_EAT_NONE));
	newCONSTSUB (stash, "EAT_XCHAT", newSViv (XCHAT_EAT_XCHAT));
	newCONSTSUB (stash, "EAT_PLUGIN", newSViv (XCHAT_EAT_PLUGIN));
	newCONSTSUB (stash, "EAT_ALL", newSViv (XCHAT_EAT_ALL));
	newCONSTSUB (stash, "FD_READ", newSViv (XCHAT_FD_READ));
	newCONSTSUB (stash, "FD_WRITE", newSViv (XCHAT_FD_WRITE));
	newCONSTSUB (stash, "FD_EXCEPTION", newSViv (XCHAT_FD_EXCEPTION));
	newCONSTSUB (stash, "FD_NOTSOCKET", newSViv (XCHAT_FD_NOTSOCKET));
	newCONSTSUB (stash, "KEEP", newSViv (1));
	newCONSTSUB (stash, "REMOVE", newSViv (0));

	version = get_sv( "Xchat::VERSION", 1 );
	sv_setpv( version, PACKAGE_VERSION );
}

static void
perl_init (void)
{
	int warn;
	int arg_count;
	char *perl_args[] = { "", "-e", "0", "-w" };
	char *env[] = { "" };
	static const char xchat_definitions[] = {
		/* Redefine the $SIG{__WARN__} handler to have XChat
		   printing warnings in the main window. (TheHobbit) */
#include "xchat.pm.h"
	};
#ifdef OLD_PERL
	static const char irc_definitions[] = {
#include "irc.pm.h"
	};
#endif
#ifdef ENABLE_NLS

	/* Problem is, dynamicaly loaded modules check out the $]
	   var. It appears that in the embedded interpreter we get
	   5,00503 as soon as the LC_NUMERIC locale calls for a comma
	   instead of a point in separating integer and decimal
	   parts. I realy can't understant why... The following
	   appears to be an awful workaround... But it'll do until I
	   (or someone else :)) found the "right way" to solve this
	   nasty problem. (TheHobbit <thehobbit@altern.org>) */

	setlocale (LC_NUMERIC, "C");

#endif

	warn = 0;
	xchat_get_prefs (ph, "perl_warnings", NULL, &warn);
	arg_count = warn ? 4 : 3;

	PERL_SYS_INIT3 (&arg_count, (char ***)&perl_args, (char ***)&env);
	my_perl = perl_alloc ();
	perl_construct (my_perl);
	PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
	perl_parse (my_perl, xs_init, arg_count, perl_args, (char **)NULL);

	/*
	   Now initialising the perl interpreter by loading the
	   perl_definition array.
	 */

	eval_pv (xchat_definitions, TRUE);
#ifdef OLD_PERL
	eval_pv (irc_definitions, TRUE);
#endif

}


static int
perl_load_file (char *filename)
{
#ifdef WIN32
	static HMODULE lib = NULL;

	if (!lib) {
		lib = LoadLibraryA (PERL_DLL);
		if (!lib) {
			if (GetLastError () == ERROR_BAD_EXE_FORMAT)
				/* http://forum.xchat.org/viewtopic.php?t=3277 */
				thread_mbox ("Cannot use this " PERL_DLL "\n\n"
#ifdef _WIN64
								 "64-bit Strawberry Perl is required.");
#else
								 "32-bit Strawberry Perl is required.");
#endif
			else {
				/* a lot of people install this old version */
				lib = LoadLibraryA ("perl56.dll");
				if (lib) {
					FreeLibrary (lib);
					lib = NULL;
					thread_mbox ("Cannot open " PERL_DLL "\n\n"
									 "You must have either ActivePerl or Straberry Perl"
									 PERL_REQUIRED_VERSION
									 " installed in order to\n"
									 "run perl scripts.\n\n"
									 "I have found Perl 5.6, but that is too old.");
				} else {
					thread_mbox ("Cannot open " PERL_DLL "\n\n"
									 "You must have either ActivePerl or Strawberry Perl "
									 PERL_REQUIRED_VERSION " installed in order to\n"
									 "run perl scripts.\n\n"
									 "http://www.activestate.com/ActivePerl/\n"
									 "http://strawberryperl.com/\n"
									 "Make sure perl's bin directory is in your PATH.");
				}
			}
			/* failure */
			return FALSE;
		}

		/* success */
		FreeLibrary (lib);
	}
#endif

	if (my_perl == NULL) {
		perl_init ();
	}

	return execute_perl (sv_2mortal (newSVpv ("Xchat::Embed::load", 0)),
								filename);

}

static void
perl_end (void)
{

	if (my_perl != NULL) {
		execute_perl (sv_2mortal (newSVpv ("Xchat::Embed::unload_all", 0)), "");
		PL_perl_destruct_level = 1;
		perl_destruct (my_perl);
		perl_free (my_perl);
		PERL_SYS_TERM();
		my_perl = NULL;
	}

}

static int
perl_command_unloadall (char *word[], char *word_eol[], void *userdata)
{
	if (my_perl != NULL) {
		execute_perl (sv_2mortal (newSVpv ("Xchat::Embed::unload_all", 0)), "");
		return XCHAT_EAT_XCHAT;
	}

	return XCHAT_EAT_XCHAT;
}

static int
perl_command_reloadall (char *word[], char *word_eol[], void *userdata)
{
	if (my_perl != NULL) {
		execute_perl (sv_2mortal (newSVpv ("Xchat::Embed::reload_all", 0)), "");

		return XCHAT_EAT_XCHAT;
	} else {
		perl_auto_load( NULL );
	}
	return XCHAT_EAT_XCHAT;
}

static int
perl_command_load (char *word[], char *word_eol[], void *userdata)
{
	char *file = get_filename (word, word_eol);

	if (file != NULL )
	{
		perl_load_file (file);
		return XCHAT_EAT_XCHAT;
	}

	return XCHAT_EAT_NONE;
}

static int
perl_command_unload (char *word[], char *word_eol[], void *userdata)
{
	char *file = get_filename (word, word_eol);
	
	if (my_perl != NULL && file != NULL) {
		execute_perl (sv_2mortal (newSVpv ("Xchat::Embed::unload", 0)), file);
		return XCHAT_EAT_XCHAT;
	}

	return XCHAT_EAT_NONE;
}

static int
perl_command_reload (char *word[], char *word_eol[], void *userdata)
{
	char *file = get_filename (word, word_eol);
	
	if (my_perl != NULL && file != NULL) {
		execute_perl (sv_2mortal (newSVpv ("Xchat::Embed::reload", 0)), file);
		return XCHAT_EAT_XCHAT;
	}
	
	return XCHAT_EAT_XCHAT;
}

void
xchat_plugin_get_info (char **name, char **desc, char **version,
							  void **reserved)
{
	*name = "Perl";
	*desc = "Perl scripting interface";
	*version = PACKAGE_VERSION;
	if (reserved)
		*reserved = NULL;
}


/* Reinit safeguard */

static int initialized = 0;

int
xchat_plugin_init (xchat_plugin * plugin_handle, char **plugin_name,
						 char **plugin_desc, char **plugin_version, char *arg)
{
	if (initialized != 0) {
		xchat_print (plugin_handle, "Perl interface already loaded\n");
		return 0;
	}

	ph = plugin_handle;
	initialized = 1;

	*plugin_name = "Perl";
	*plugin_desc = "Perl scripting interface";
	*plugin_version = PACKAGE_VERSION;

	xchat_hook_command (ph, "load", XCHAT_PRI_NORM, perl_command_load, 0, 0);
	xchat_hook_command (ph, "unload", XCHAT_PRI_NORM, perl_command_unload, 0,
							  0);
	xchat_hook_command (ph, "reload", XCHAT_PRI_NORM, perl_command_reload, 0,
							  0);
	xchat_hook_command (ph, "pl_reload", XCHAT_PRI_NORM, perl_command_reload, 0,
							  0);
	xchat_hook_command (ph, "unloadall", XCHAT_PRI_NORM,
							  perl_command_unloadall, 0, 0);
	xchat_hook_command (ph, "reloadall", XCHAT_PRI_NORM,
							  perl_command_reloadall, 0, 0);

	/*perl_init (); */
	xchat_hook_timer (ph, 0, perl_auto_load, NULL );

	xchat_print (ph, "Perl interface loaded\n");

	return 1;
}

int
xchat_plugin_deinit (xchat_plugin * plugin_handle)
{
	perl_end ();

	initialized = 0;
	xchat_print (plugin_handle, "Perl interface unloaded\n");

	return 1;
}
an> "_Download List" msgstr "Lataa luettelo" #: src/fe-gtk/chanlist.c:783 msgid "Save _List..." msgstr "Tallenna luettelo..." #: src/fe-gtk/chanlist.c:796 msgid "Show only:" msgstr "Näytä vain:" #: src/fe-gtk/chanlist.c:808 msgid "channels with" msgstr "kanavat, joilla on" #: src/fe-gtk/chanlist.c:821 msgid "to" msgstr "—" #: src/fe-gtk/chanlist.c:833 msgid "users." msgstr "käyttäjää." #: src/fe-gtk/chanlist.c:839 msgid "Look in:" msgstr "Käy läpi:" #: src/fe-gtk/chanlist.c:851 msgid "Channel name" msgstr "Kanavanimi" #: src/fe-gtk/chanlist.c:872 msgid "Search type:" msgstr "Hakutapa:" #: src/fe-gtk/chanlist.c:879 msgid "Simple Search" msgstr "Yksinkertainen haku" # MSWin-versioon #: src/fe-gtk/chanlist.c:880 msgid "Pattern Match (Wildcards)" msgstr "Hakulauseke (jokerimerkit)" #: src/fe-gtk/chanlist.c:882 msgid "Regular Expression" msgstr "Säännöllinen lauseke" #: src/fe-gtk/chanlist.c:893 src/fe-gtk/search.c:118 msgid "Find:" msgstr "Etsi:" #: src/fe-gtk/dccgui.c:166 #, c-format msgid "Send file to %s" msgstr "Lähetä tiedosto käyttäjälle %s" #: src/fe-gtk/dccgui.c:496 msgid "That file is not resumable." msgstr "Tämän tiedoston siirtoa ei voi jatkaa." #: src/fe-gtk/dccgui.c:500 #, c-format msgid "" "Cannot access file: %s\n" "%s.\n" "Resuming not possible." msgstr "" "Tiedostoa ei voi käsitellä: %s\n" "%s.\n" "Jatkaminen ei ole mahdollista." #: src/fe-gtk/dccgui.c:507 msgid "File in download directory is larger than file offered. Resuming not possible." msgstr "Tiedosto latauskansiossa on suurempi kuin tarjottu tiedosto. Jatkaminen ei ole mahdollista." #: src/fe-gtk/dccgui.c:511 msgid "Cannot resume the same file from two people." msgstr "Saman tiedoston siirtoa ei voi jatkaa kahdelta käyttäjältä." #: src/fe-gtk/dccgui.c:740 msgid "XChat: Uploads and Downloads" msgstr "XChat: Tiedostonsiirrot" #: src/fe-gtk/dccgui.c:756 src/fe-gtk/dccgui.c:993 src/fe-gtk/notifygui.c:138 msgid "Status" msgstr "Tila" #: src/fe-gtk/dccgui.c:757 src/fe-gtk/plugingui.c:75 msgid "File" msgstr "Tiedosto" #: src/fe-gtk/dccgui.c:762 msgid "ETA" msgstr "Arvioitu aika" # Näkymää rajaava radionappula #: src/fe-gtk/dccgui.c:784 src/fe-gtk/menu.c:1421 msgid "Both" msgstr "Molemmat" # Radionappula #: src/fe-gtk/dccgui.c:790 msgid "Uploads" msgstr "Lähetykset" # Radionappula #: src/fe-gtk/dccgui.c:796 msgid "Downloads" msgstr "Lataukset" # Näyttää tiedoston koko polun omalla koneella # ja siirtoon käytettävän IP-osoitteen ja portin. #: src/fe-gtk/dccgui.c:801 msgid "Details" msgstr "Lisätiedot" #: src/fe-gtk/dccgui.c:812 msgid "File:" msgstr "Tiedosto:" #: src/fe-gtk/dccgui.c:813 msgid "Address:" msgstr "Osoite:" #: src/fe-gtk/dccgui.c:819 src/fe-gtk/dccgui.c:1014 msgid "Abort" msgstr "Keskeytä" #: src/fe-gtk/dccgui.c:820 src/fe-gtk/dccgui.c:1015 msgid "Accept" msgstr "Hyväksy" #: src/fe-gtk/dccgui.c:821 msgid "Resume" msgstr "Jatka" #: src/fe-gtk/dccgui.c:822 msgid "Open Folder..." msgstr "Avaa kansio..." #: src/fe-gtk/dccgui.c:982 msgid "XChat: DCC Chat List" msgstr "XChat: DCC-keskusteluluettelo" #: src/fe-gtk/dccgui.c:995 msgid "Recv" msgstr "Saapunut" #: src/fe-gtk/dccgui.c:996 msgid "Sent" msgstr "Lähetetty" #: src/fe-gtk/dccgui.c:997 msgid "Start Time" msgstr "Aloitusaika" #: src/fe-gtk/editlist.c:139 msgid "*NEW*" msgstr "*UUSI*" #: src/fe-gtk/editlist.c:140 msgid "EDIT ME" msgstr "MUOKKAA TÄTÄ" #: src/fe-gtk/editlist.c:310 src/fe-gtk/plugingui.c:73 msgid "Name" msgstr "Nimi" #: src/fe-gtk/editlist.c:311 msgid "Command" msgstr "Komento" #: src/fe-gtk/editlist.c:339 msgid "Move Up" msgstr "Siirrä ylemmäs" #: src/fe-gtk/editlist.c:343 msgid "Move Dn" msgstr "Siirrä alemmas" #: src/fe-gtk/editlist.c:351 msgid "Cancel" msgstr "Peru" #: src/fe-gtk/editlist.c:355 msgid "Save" msgstr "Tallenna" #: src/fe-gtk/editlist.c:363 src/fe-gtk/fkeys.c:765 msgid "Add New" msgstr "Lisää uusi" #: src/fe-gtk/editlist.c:367 src/fe-gtk/fkeys.c:770 src/fe-gtk/ignoregui.c:386 msgid "Delete" msgstr "Poista" #: src/fe-gtk/editlist.c:375 msgid "Sort" msgstr "Lajittele" #: src/fe-gtk/editlist.c:379 msgid "Help" msgstr "Ohje" #: src/fe-gtk/fe-gtk.c:126 msgid "Don't auto connect to servers" msgstr "ei ota yhteyttä palvelimiin" #: src/fe-gtk/fe-gtk.c:127 msgid "Use a different config directory" msgstr "käyttää erityistä asetushakemistoa" #: src/fe-gtk/fe-gtk.c:128 msgid "Don't auto load any plugins" msgstr "ei lataa liitännäisiä" #: src/fe-gtk/fe-gtk.c:129 msgid "Show plugin auto-load directory" msgstr "näyttää vakioliitännäisten hakemiston" #: src/fe-gtk/fe-gtk.c:130 msgid "Show user config directory" msgstr "näyttää käyttäjän asetushakemiston" #: src/fe-gtk/fe-gtk.c:131 msgid "Open an irc://server:port/channel URL" msgstr "avaa URLin (irc://palvelin:portti/kanava)" #: src/fe-gtk/fe-gtk.c:133 msgid "Open URL in an existing XChat" msgstr "Avaa URL käynnissä olevaan XChattiin" #: src/fe-gtk/fe-gtk.c:135 msgid "Begin minimized. Level 0=Normal 1=Iconified 2=Tray" msgstr "Aloita pienennettynä. Taso: 0=tavallinen, 1=kuvakkeena, 2=ilmoitusalueella" #: src/fe-gtk/fe-gtk.c:135 msgid "level" msgstr "taso" #: src/fe-gtk/fe-gtk.c:136 msgid "Show version information" msgstr "näyttää versiotiedot" #: src/fe-gtk/fe-gtk.c:256 #, c-format msgid "" "Failed to open font:\n" "\n" "%s" msgstr "" "Kirjasimen avaaminen ei onnistunut:\n" "\n" "%s" #: src/fe-gtk/fe-gtk.c:635 msgid "Search buffer is empty.\n" msgstr "Hakupuskuri on tyhjä.\n" #: src/fe-gtk/fe-gtk.c:731 #, c-format msgid "%d bytes" msgstr "%d tavua" #: src/fe-gtk/fe-gtk.c:732 #, c-format msgid "Network send queue: %d bytes" msgstr "Verkon lähetysjonossa on %d tavua." #: src/fe-gtk/fkeys.c:159 msgid "The Run Command action runs the data in Data 1 as if it has been typed into the entry box where you pressed the key sequence. Thus it can contain text (which will be sent to the channel/person), commands or user commands. When run all \\n characters in Data 1 are used to deliminate seperate commands so it is possible to run more than one command. If you want a \\ in the actual text run then enter \\\\" msgstr "Run Command -komento ajaa Data 1:n sisällön, kuin se olisi kirjoitettu syötekenttään, jossa näppäinyhdistelmää painettiin. Se voi siis sisältää tekstiä (joka lähetetään kanavalle/henkilölle), komentoja tai käyttäjäkomentoja. Ajettaessa kaikki Data 1:n sisältämät \\n-merkit tulkitaan komentojen erottimiksi; siten on mahdollista ajaa useampi komento. Jos haluat \\-merkin varsinaiseen tekstiin, käytä merkintää \\\\" #: src/fe-gtk/fkeys.c:161 msgid "The Change Page command switches between pages in the notebook. Set Data 1 to the page you want to switch to. If Data 2 is set to anything then the switch will be relative to the current position" msgstr "Change Page -komento siirtyy välilehdeltä toiselle. Aseta Data 1:n arvoksi lehti, jolle halutaan siirtyä. Jos Data 2 on asetettu, siirtyminen on suhteessa nykyiseen sijaintiin" #: src/fe-gtk/fkeys.c:163 msgid "The Insert in Buffer command will insert the contents of Data 1 into the entry where the key sequence was pressed at the current cursor position" msgstr "Insert in Buffer -komento lisää Data 1:n sisällön syöteriville kohdistimen kohdalle" #: src/fe-gtk/fkeys.c:165 msgid "The Scroll Page command scrolls the text widget up or down one page or one line. Set Data 1 to either Up, Down, +1 or -1." msgstr "Scroll Page -komento vierittää tekstikenttää (Data 1:n arvosta riippuen) ylös tai alas yhden sivun (Up, Down) tai rivin (+1, -1) verran." #: src/fe-gtk/fkeys.c:167 msgid "The Set Buffer command sets the entry where the key sequence was entered to the contents of Data 1" msgstr "Set Buffer -komento asettaa syöteriviksi Data 1:n sisällön" #: src/fe-gtk/fkeys.c:169 msgid "The Last Command command sets the entry to contain the last command entered - the same as pressing up in a shell" msgstr "Last Command -komento asettaa syöteriviksi edellisen annetun komennon - vastaa ylänuolen painamista kuoressa" #: src/fe-gtk/fkeys.c:171 msgid "The Next Command command sets the entry to contain the next command entered - the same as pressing down in a shell" msgstr "Next Command -komento asettaa syöteriviksi seuraavan annetun komennon - vastaa alanuolen painamista kuoressa" #: src/fe-gtk/fkeys.c:173 msgid "This command changes the text in the entry to finish an incomplete nickname or command. If Data 1 is set then double-tabbing in a string will select the last nick, not the next" msgstr "Tämä komento täydentää syöterivillä osoittimen edellä olevan epätäydellisen kutsumanimen tai komennon. Jos Data 1 on asetettu, kaksi kertaa painaminen valitsee edellisen kutsumanimen, ei seuraavaa" #: src/fe-gtk/fkeys.c:175 msgid "This command scrolls up and down through the list of nicks. If Data 1 is set to anything it will scroll up, else it scrolls down" msgstr "Tämä komento vierittää käyttäjäluetteloa ylös ja alas. Jos Data 1 on asetettu, luetteloa vieritetään ylös, muutoin alas" #: src/fe-gtk/fkeys.c:177 msgid "This command checks the last word entered in the entry against the replace list and replaces it if it finds a match" msgstr "Tämä komento vertaa viimeistä annettua sanaa korvauslistaan ja muuttaa sen,jos löytyy täsmäävyys." #: src/fe-gtk/fkeys.c:179 msgid "This command moves the front tab left by one" msgstr "Tämä komento siirtää päällimmäistä välilehteä yhden vasemmalle" #: src/fe-gtk/fkeys.c:181 msgid "This command moves the front tab right by one" msgstr "Tämä komento siirtää päällimmäistä välilehteä yhden oikealle" #: src/fe-gtk/fkeys.c:183 msgid "This command moves the current tab family to the left" msgstr "Tämä komento siirtää nykyistä välilehtiötä vasemmalle" #: src/fe-gtk/fkeys.c:185 msgid "This command moves the current tab family to the right" msgstr "Tämä komento siirtää nykyistä välilehtiötä oikealle" #: src/fe-gtk/fkeys.c:187 msgid "Push input line into history but doesn't send to server" msgstr "Lisää syöterivin historiaan, mutta ei lähetä palvelimelle" #: src/fe-gtk/fkeys.c:198 msgid "There was an error loading key bindings configuration" msgstr "Virhe ladattaessa näppäinsidonta-asetuksia" #: src/fe-gtk/fkeys.c:450 src/fe-gtk/fkeys.c:451 src/fe-gtk/fkeys.c:452 #: src/fe-gtk/fkeys.c:453 src/fe-gtk/fkeys.c:743 src/fe-gtk/fkeys.c:749 #: src/fe-gtk/fkeys.c:754 src/fe-gtk/maingui.c:1616 src/fe-gtk/maingui.c:1719 #: src/fe-gtk/maingui.c:3201 msgid "<none>" msgstr "<ei mitään>" #: src/fe-gtk/fkeys.c:707 msgid "Mod" msgstr "Määre" #: src/fe-gtk/fkeys.c:708 src/fe-gtk/fkeys.c:803 msgid "Key" msgstr "Näppäin" #: src/fe-gtk/fkeys.c:709 msgid "Action" msgstr "Toiminto" #: src/fe-gtk/fkeys.c:718 msgid "XChat: Keyboard Shortcuts" msgstr "XChat: Pikanäppäimet" #: src/fe-gtk/fkeys.c:796 msgid "Shift" msgstr "Vaihto" #: src/fe-gtk/fkeys.c:798 msgid "Alt" msgstr "Alt" #: src/fe-gtk/fkeys.c:800 msgid "Ctrl" msgstr "Ctrl" #: src/fe-gtk/fkeys.c:807 msgid "Data 1" msgstr "Data 1" #: src/fe-gtk/fkeys.c:810 msgid "Data 2" msgstr "Data 2" #: src/fe-gtk/fkeys.c:852 msgid "Error opening keys config file\n" msgstr "Virhe avattaessa näppäinasetustiedostoa\n" #: src/fe-gtk/fkeys.c:1019 #, c-format msgid "" "Unknown keyname %s in key bindings config file\n" "Load aborted, please fix %s/keybindings.conf\n" msgstr "" "Tuntematon näppäinnimi %s näppäinsidontojen asetustiedostossa\n" "Lataus keskeytetty, korjaa tiedosto %s/keybindings\n" #: src/fe-gtk/fkeys.c:1057 #, c-format msgid "" "Unknown action %s in key bindings config file\n" "Load aborted, Please fix %s/keybindings\n" msgstr "" "Tuntematon toiminto %s näppäinsidontojen asetustiedostossa\n" "Lataus keskeytetty, korjaa tiedosto %s/keybindings\n" #: src/fe-gtk/fkeys.c:1078 #, c-format msgid "" "Expecting Data line (beginning Dx{:|!}) but got:\n" "%s\n" "\n" "Load aborted, Please fix %s/keybindings\n" msgstr "" "Odotettiin Datariviä (alku Dx{:|!}), mutta saatiin:\n" "%s\n" "\n" "Lataus keskeytetty, korjaa tiedosto %s/keybindings\n" #: src/fe-gtk/fkeys.c:1147 #, c-format msgid "" "Key bindings config file is corrupt, load aborted\n" "Please fix %s/keybindings.conf\n" msgstr "" "Näppäinsidontojen asetustiedosto on turmeltunut, lataus keskeytetty\n" "Korjaa tiedosto %s/keybindings.conf\n" #: src/fe-gtk/gtkutil.c:117 msgid "Cannot write to that file." msgstr "Antamaasi tiedostoon ei voi kirjoittaa." #: src/fe-gtk/gtkutil.c:119 msgid "Cannot read that file." msgstr "Antamaasi tiedostoa ei voi lukea." #: src/fe-gtk/ignoregui.c:117 src/fe-gtk/ignoregui.c:263 msgid "That mask already exists." msgstr "Kyseinen peite on jo olemassa." #: src/fe-gtk/ignoregui.c:177 src/fe-gtk/maingui.c:2100 msgid "Private" msgstr "Yksityiset" #: src/fe-gtk/ignoregui.c:178 msgid "Notice" msgstr "Tiedotteet" #: src/fe-gtk/ignoregui.c:179 msgid "CTCP" msgstr "CTCP" #: src/fe-gtk/ignoregui.c:180 msgid "DCC" msgstr "DCC" #: src/fe-gtk/ignoregui.c:181 msgid "Invite" msgstr "Kutsut" #: src/fe-gtk/ignoregui.c:182 msgid "Unignore" msgstr "Huomioi toistaiseksi" #: src/fe-gtk/ignoregui.c:307 msgid "Enter mask to ignore:" msgstr "Anna peite huomiotta jätettäville:" #: src/fe-gtk/ignoregui.c:354 msgid "XChat: Ignore list" msgstr "XChat: Huomioimattomuusluettelo" #: src/fe-gtk/ignoregui.c:361 msgid "Ignore Stats:" msgstr "Huomioimattomuustilastot:" #: src/fe-gtk/ignoregui.c:369 msgid "Channel:" msgstr "Kavavia:" #: src/fe-gtk/ignoregui.c:370 msgid "Private:" msgstr "Yksityisiä:" #: src/fe-gtk/ignoregui.c:371 msgid "Notice:" msgstr "Ilmoituksia:" #: src/fe-gtk/ignoregui.c:372 msgid "CTCP:" msgstr "CTCP:" #: src/fe-gtk/ignoregui.c:373 msgid "Invite:" msgstr "Kutsuja:" # Tarkistettava #: src/fe-gtk/ignoregui.c:384 src/fe-gtk/notifygui.c:420 msgid "Add..." msgstr "Lisää uusi..." #: src/fe-gtk/joind.c:83 msgid "Channel name too short, try again." msgstr "Kanavan nimi on liian lyhyt. Yritä uudestaan." # Sen ikkunan otsikko, joka ilmoittaa, että # palvelimeen on saatu yhteys. #: src/fe-gtk/joind.c:125 msgid "XChat: Connection Complete" msgstr "XChat: Yhteys muodostettu" #: src/fe-gtk/joind.c:150 #, c-format msgid "Connection to %s complete." msgstr "Yhteys palvelimeen %s on valmis." #: src/fe-gtk/joind.c:159 msgid "In the Server-List window, no channel (chat room) has been entered to be automatically joined for this network." msgstr "Palvelinluetteloon ei ole tälle IRC-verkolle syötetty yhtään kanavaa, joille tulisi liittyä automaattisesti." #: src/fe-gtk/joind.c:165 msgid "What would you like to do next?" msgstr "Mitä haluat tehdä?" #: src/fe-gtk/joind.c:170 msgid "_Nothing, I'll join a channel later." msgstr "_En mitään, liityn kanaville itse." #: src/fe-gtk/joind.c:179 msgid "_Join this channel:" msgstr "_Liittyä kanavalle:" #: src/fe-gtk/joind.c:191 msgid "If you know the name of the channel you want to join, enter it here." msgstr "Jos tiedät mille kanavalle haluat liittyä, kirjoita sen nimi tähän." #: src/fe-gtk/joind.c:198 msgid "O_pen the Channel-List window." msgstr "Avata kanava_luettelon:" #: src/fe-gtk/joind.c:205 msgid "Retrieving the Channel-List may take a minute or two." msgstr "Kanavaluettelon kerääminen saattaa kestää parikin minuuttia." #: src/fe-gtk/joind.c:212 msgid "_Always show this dialog after connecting." msgstr "Näytä tämä valintaikkuna _aina, kun yhteys on muodostettu." # Keskusteluikkunan otsikko. Perään tulee # keskustelukumppanin nimi ja palvelin. #: src/fe-gtk/maingui.c:500 msgid "Dialog with" msgstr "Keskustelijana" #: src/fe-gtk/maingui.c:787 #, c-format msgid "Topic for %s is: %s" msgstr "Kanavan %s aihe on: %s" #: src/fe-gtk/maingui.c:792 msgid "No topic is set" msgstr "Kanavalla ei ole aihetta." #: src/fe-gtk/maingui.c:1177 #, c-format msgid "This server still has %d channels or dialogs associated with it. Close them all?" msgstr "Palvelimelta on edelleen auki %d kanavaa tai keskustelua. Suljetaanko kaikki?" #: src/fe-gtk/maingui.c:1304 msgid "Quit XChat?" msgstr "Lopetetaanko XChat?" #: src/fe-gtk/maingui.c:1325 msgid "Don't ask next time." msgstr "Älä kysy jatkossa." #: src/fe-gtk/maingui.c:1331 #, c-format msgid "You are connected to %i IRC networks." msgstr "Ollaan yhteydessä %i IRC-verkkoon." #: src/fe-gtk/maingui.c:1333 msgid "Are you sure you want to quit?" msgstr "Lopetetaanko varmasti?" #: src/fe-gtk/maingui.c:1335 msgid "Some file transfers are still active." msgstr "Tiedostonsiirtoja on vielä käynnissä." #: src/fe-gtk/maingui.c:1353 msgid "_Minimize to Tray" msgstr "Pienennä ilmoitusalueelle" # syöttökentän tilannevalikko #: src/fe-gtk/maingui.c:1567 msgid "Insert Attribute or Color Code" msgstr "Lisää määre tai värikoodi" #: src/fe-gtk/maingui.c:1569 msgid "<b>Bold</b>" msgstr "<b>Lihavoitu</b>" #: src/fe-gtk/maingui.c:1570 msgid "<u>Underline</u>" msgstr "<u>Alleviivattu</u>" #: src/fe-gtk/maingui.c:1572 msgid "Normal" msgstr "Tavallinen" #: src/fe-gtk/maingui.c:1574 msgid "Colors 0-7" msgstr "Värit 0–7" #: src/fe-gtk/maingui.c:1584 msgid "Colors 8-15" msgstr "Värit 8–15" #: src/fe-gtk/maingui.c:1629 msgid "Beep on message" msgstr "Anna äänimerkki viestin saapuessa" #: src/fe-gtk/maingui.c:1632 msgid "Blink tray on message" msgstr "Välkytä ilmoitusalueella viestin saapuessa" #: src/fe-gtk/maingui.c:1635 msgid "Show join/part messages" msgstr "Näytä liittymis/poistumisviestit" #: src/fe-gtk/maingui.c:1637 msgid "Color paste" msgstr "Liitä väritysten kanssa" #: src/fe-gtk/maingui.c:1647 src/fe-gtk/menu.c:1950 msgid "_Close Tab" msgstr "_Sulje välilehti" #: src/fe-gtk/maingui.c:1649 src/fe-gtk/menu.c:1949 msgid "_Detach Tab" msgstr "_Irrota välilehti" #: src/fe-gtk/maingui.c:1968 src/fe-gtk/maingui.c:2074 msgid "User limit must be a number!\n" msgstr "Käyttäjärajan tulee olla numero!\n" #: src/fe-gtk/maingui.c:2096 msgid "Topic Protection" msgstr "Aiheensuojaus" #: src/fe-gtk/maingui.c:2097 msgid "No outside messages" msgstr "Ei ulkopuolisia viestejä" #: src/fe-gtk/maingui.c:2098 msgid "Secret" msgstr "Salainen" #: src/fe-gtk/maingui.c:2099 msgid "Invite Only" msgstr "Vain kutsutuille" #: src/fe-gtk/maingui.c:2101 msgid "Moderated" msgstr "Moderoitu" #: src/fe-gtk/maingui.c:2102 msgid "Ban List" msgstr "Banniluettelo" #: src/fe-gtk/maingui.c:2104 msgid "Keyword" msgstr "Tunnussana" #: src/fe-gtk/maingui.c:2116 msgid "User Limit" msgstr "Käyttäjäraja" #: src/fe-gtk/maingui.c:2225 msgid "Show/Hide userlist" msgstr "Näytä/piilota käyttäjäluettelo" #: src/fe-gtk/maingui.c:2350 msgid "" "Unable to set transparent background!\n" "\n" "You may be using a non-compliant window\n" "manager that is not currently supported.\n" msgstr "" "Taustaa ei voi asettaa läpikuultavaksi!\n" "\n" "Ikkunointiohjelma on ehkä epäyhteensopiva,\n" "eikä sitä tällä hetkellä tueta.\n" #: src/fe-gtk/maingui.c:2621 msgid "Enter new nickname:" msgstr "Anna uusi kutsumanimi:" #: src/fe-gtk/menu.c:124 msgid "Host unknown" msgstr "Tuntematon isäntä" #: src/fe-gtk/menu.c:544 #, c-format msgid "<tt><b>%-11s</b></tt> %s" msgstr "<tt><b>%-11s</b></tt> %s" #: src/fe-gtk/menu.c:549 src/fe-gtk/menu.c:553 msgid "Real Name:" msgstr "Oikea nimi:" #: src/fe-gtk/menu.c:557 msgid "User:" msgstr "Käyttäjä:" #: src/fe-gtk/menu.c:561 msgid "Country:" msgstr "Maa:" #: src/fe-gtk/menu.c:565 msgid "Server:" msgstr "Palvelin:" #: src/fe-gtk/menu.c:577 msgid "Away Msg:" msgstr "Poissaoloviesti:" #: src/fe-gtk/menu.c:587 #, c-format msgid "%u minutes ago" msgstr "%u minuuttia sitten" #: src/fe-gtk/menu.c:589 src/fe-gtk/menu.c:592 msgid "Last Msg:" msgstr "Puhunut kanavalla:" #: src/fe-gtk/menu.c:704 msgid "The Menubar is now hidden. You can show it again by pressing F9 or right-clicking in a blank part of the main text area." msgstr "Valikkopalkki on nyt piilossa. Sen saa taas esiin painamalla Ctrl-F9:ää tai hiiren oikeaa painiketta tekstialueen tyhjässä kohdassa." #: src/fe-gtk/menu.c:799 msgid "Open Link in Browser" msgstr "Avaa linkki selaimeen" #: src/fe-gtk/menu.c:800 msgid "Copy Selected Link" msgstr "Kopioi valittu linkki" #: src/fe-gtk/menu.c:862 src/fe-gtk/menu.c:1100 msgid "Join Channel" msgstr "Liity kanavalle" #: src/fe-gtk/menu.c:866 msgid "Part Channel" msgstr "Poistu kanavalta" #: src/fe-gtk/menu.c:868 msgid "Cycle Channel" msgstr "Liity kanavalle uudelleen" #: src/fe-gtk/menu.c:892 msgid "XChat: User menu" msgstr "XChat: Käyttäjän valikko" #: src/fe-gtk/menu.c:901 msgid "Edit This Menu..." msgstr "Muokkaa tätä valikkoa..." #: src/fe-gtk/menu.c:1102 msgid "Retrieve channel list..." msgstr "Valitse kanavaluettelosta..." #: src/fe-gtk/menu.c:1170 msgid "" "User Commands - Special codes:\n" "\n" "%c = current channel\n" "%e = current network name\n" "%m = machine info\n" "%n = your nick\n" "%t = time/date\n" "%v = xchat version\n" "%2 = word 2\n" "%3 = word 3\n" "&2 = word 2 to the end of line\n" "&3 = word 3 to the end of line\n" "\n" "eg:\n" "/cmd john hello\n" "\n" "%2 would be \"john\"\n" "&2 would be \"john hello\"." msgstr "" "Käyttäjän komennot - Erikoiskoodit:\n" "\n" "%c = nykyinen kanava\n" "%e = nykyinen verkko\n" "%m = koneen tiedot\n" "%n = oma kutsumanimi\n" "%t = aika/päiväys\n" "%v = xchat-versio\n" "%2 = 2. sana\n" "%3 = 3. sana\n" "&2 = 2. sanasta rivin loppuun\n" "&3 = 3. sanasta rivin loppuun\n" "\n" "esim:\n" "/cmd jarkko terve\n" "\n" "%2 olisi \"jarkko\"\n" "&2 olisi \"jarkko terve\"." #: src/fe-gtk/menu.c:1186 msgid "" "Userlist Buttons - Special codes:\n" "\n" "%a = all selected nicks\n" "%c = current channel\n" "%e = current network name\n" "%h = selected nick's hostname\n" "%m = machine info\n" "%n = your nick\n" "%s = selected nick\n" "%t = time/date\n" msgstr "" "Käyttäjälistapainikkeet - Erikoiskoodit:\n" "\n" "%a = kaikki valitut kutsumanimet\n" "%e = nykyinen verkko\n" "%c = nykyinen kanava\n" "%h = valitun käyttäjän isäntänimi\n" "%m = koneen tiedot\n" "%n = oma kutsumanimi\n" "%s = valittu kutsumanimi\n" "%t = aika/päiväys\n" #: src/fe-gtk/menu.c:1196 msgid "" "Dialog Buttons - Special codes:\n" "\n" "%a = all selected nicks\n" "%c = current channel\n" "%e = current network name\n" "%h = selected nick's hostname\n" "%m = machine info\n" "%n = your nick\n" "%s = selected nick\n" "%t = time/date\n" msgstr "" "Keskustelupainikkeet - Erikoiskoodit:\n" "\n" "%a = kaikki valitut kutsumanimet\n" "%c = nykyinen kanava\n" "%e = nykyinen verkko\n" "%h = valitun käyttäjän isäntänimi\n" "%m = koneen tiedot\n" "%n = oma kutsumanimi\n" "%s = valittu kutsumanimi\n" "%t = aika/päiväys\n" #: src/fe-gtk/menu.c:1206 msgid "" "CTCP Replies - Special codes:\n" "\n" "%d = data (the whole ctcp)\n" "%e = current network name\n" "%m = machine info\n" "%s = nick who sent the ctcp\n" "%t = time/date\n" "%2 = word 2\n" "%3 = word 3\n" "&2 = word 2 to the end of line\n" "&3 = word 3 to the end of line\n" "\n" msgstr "" "CTCP-vastaukset - Erikoiskoodit:\n" "\n" "%d = data (koko ctcp)\n" "%e = nykyinen verkko\n" "%m = koneen tiedot\n" "%s = ctcp:n lähettäjän kutsumanimi\n" "%t = aika/päiväys\n" "%2 = 2. sana\n" "%3 = 3. sana\n" "&2 = 2. sanasta rivin loppuun\n" "&3 = 3. sanasta rivin loppuun\n" "\n" #: src/fe-gtk/menu.c:1217 #, c-format msgid "" "URL Handlers - Special codes:\n" "\n" "%s = the URL string\n" "\n" "Putting a ! infront of the command\n" "indicates it should be sent to a\n" "shell instead of XChat" msgstr "" "URL-käsittelimet - Erikoiskoodit:\n" "\n" "%s = URL-merkkijono\n" "\n" "Huutomerkki (!) komennon edessä ilmaisee,\n" "että komento lähetetään XChatin sijaan\n" "kuorelle." #: src/fe-gtk/menu.c:1226 msgid "XChat: User Defined Commands" msgstr "XChat: Käyttäjän määrittelemät komennot" #: src/fe-gtk/menu.c:1233 msgid "XChat: Userlist Popup menu" msgstr "XChat: Käyttäjäluettelon ponnahdusvalikko" #: src/fe-gtk/menu.c:1240 msgid "Replace with" msgstr "Korvaava teksti" #: src/fe-gtk/menu.c:1240 msgid "XChat: Replace" msgstr "XChat: Korvaaminen" #: src/fe-gtk/menu.c:1247 msgid "XChat: URL Handlers" msgstr "XChat: URL-käsittelimet" #: src/fe-gtk/menu.c:1266 msgid "XChat: Userlist buttons" msgstr "XChat: Käyttäjäluettelon painikkeet" #: src/fe-gtk/menu.c:1273 msgid "XChat: Dialog buttons" msgstr "XChat: Keskusteluikkunan painikkeet" #: src/fe-gtk/menu.c:1280 msgid "XChat: CTCP Replies" msgstr "XChat: CTCP-vastaukset" #: src/fe-gtk/menu.c:1378 msgid "_XChat" msgstr "_XChat" #: src/fe-gtk/menu.c:1379 msgid "Network Li_st..." msgstr "Verkkoluettelo..." #: src/fe-gtk/menu.c:1382 msgid "_New" msgstr "Uusi" #: src/fe-gtk/menu.c:1383 msgid "Server Tab..." msgstr "Palvelinvälilehti..." #: src/fe-gtk/menu.c:1384 msgid "Channel Tab..." msgstr "Kanavavälilehti..." #: src/fe-gtk/menu.c:1385 msgid "Server Window..." msgstr "Palvelinikkuna..." #: src/fe-gtk/menu.c:1386 msgid "Channel Window..." msgstr "Kanavaikkuna..." #: src/fe-gtk/menu.c:1391 src/fe-gtk/menu.c:1393 msgid "_Load Plugin or Script..." msgstr "Lataa skripti tai liitännäinen..." #: src/fe-gtk/menu.c:1401 src/fe-gtk/plugin-tray.c:463 msgid "_Quit" msgstr "Lopeta" #: src/fe-gtk/menu.c:1403 msgid "_View" msgstr "Näytä" #: src/fe-gtk/menu.c:1405 msgid "_Menu Bar" msgstr "Valikkopalkki" #: src/fe-gtk/menu.c:1406 msgid "_Topic Bar" msgstr "Aihepalkki" #: src/fe-gtk/menu.c:1407 msgid "_User List" msgstr "Käyttäjäluettelo" #: src/fe-gtk/menu.c:1408 msgid "U_serlist Buttons" msgstr "Käyttäjäluettelon painikkeet" #: src/fe-gtk/menu.c:1409 msgid "M_ode Buttons" msgstr "Tilapainikkeet" #: src/fe-gtk/menu.c:1411 msgid "_Channel Switcher" msgstr "Kanavavalitsin" #: src/fe-gtk/menu.c:1413 msgid "_Tabs" msgstr "Välilehtinä" #: src/fe-gtk/menu.c:1414 msgid "T_ree" msgstr "Puuna" #: src/fe-gtk/menu.c:1416 msgid "_Network Meters" msgstr "Verkkomittarit" #: src/fe-gtk/menu.c:1418 msgid "Off" msgstr "Poissa" #: src/fe-gtk/menu.c:1419 msgid "Graph" msgstr "Graafinen" #: src/fe-gtk/menu.c:1424 msgid "_Server" msgstr "_Palvelin" #: src/fe-gtk/menu.c:1425 msgid "_Disconnect" msgstr "Katkaise yhteys" #: src/fe-gtk/menu.c:1426 msgid "_Reconnect" msgstr "Yhdistä uudelleen" #: src/fe-gtk/menu.c:1430 msgid "Marked Away" msgstr "Merkitty poissaolevaksi" # Missäköhän tämä näkyy? #: src/fe-gtk/menu.c:1432 msgid "_Usermenu" msgstr "Käyttäjävalikko" #: src/fe-gtk/menu.c:1434 msgid "S_ettings" msgstr "A_setukset" #: src/fe-gtk/menu.c:1435 msgid "_Preferences" msgstr "Ominaisuudet" #: src/fe-gtk/menu.c:1437 msgid "Advanced" msgstr "Lisäasetukset" #: src/fe-gtk/menu.c:1438 msgid "Auto Replace..." msgstr "Automaattikorvaukset..." #: src/fe-gtk/menu.c:1439 msgid "CTCP Replies..." msgstr "CTCP-vastaukset..." #: src/fe-gtk/menu.c:1440 msgid "Dialog Buttons..." msgstr "Keskusteluikkunan painikkeet..." #: src/fe-gtk/menu.c:1441 msgid "Keyboard Shortcuts..." msgstr "Pikanäppäimet..." #: src/fe-gtk/menu.c:1442 msgid "Text Events..." msgstr "Tapahtumatekstit..." #: src/fe-gtk/menu.c:1443 msgid "URL Handlers..." msgstr "URL-käsittelimet..." #: src/fe-gtk/menu.c:1444 msgid "User Commands..." msgstr "Käyttäjän komennot..." #: src/fe-gtk/menu.c:1445 msgid "Userlist Buttons..." msgstr "Käyttäjäluettelon painikkeet..." #: src/fe-gtk/menu.c:1446 msgid "Userlist Popup..." msgstr "Käyttäjäluettelon pikavalikko..." #: src/fe-gtk/menu.c:1449 msgid "_Window" msgstr "_Ikkuna" #: src/fe-gtk/menu.c:1450 msgid "Ban List..." msgstr "Banniluettelo..." #: src/fe-gtk/menu.c:1451 msgid "Channel List..." msgstr "Kanavaluettelo..." #: src/fe-gtk/menu.c:1452 msgid "Character Chart..." msgstr "Merkistökartta..." #: src/fe-gtk/menu.c:1453 msgid "Direct Chat..." msgstr "DCC-keskustelu..." #: src/fe-gtk/menu.c:1454 msgid "File Transfers..." msgstr "Tiedostonsiirrot..." #: src/fe-gtk/menu.c:1455 msgid "Ignore List..." msgstr "Huomioimattomuusluettelo..." #: src/fe-gtk/menu.c:1456 msgid "Notify List..." msgstr "Ilmoitusluettelo..." #: src/fe-gtk/menu.c:1457 msgid "Plugins and Scripts..." msgstr "Skriptit ja liitännäiset..." #: src/fe-gtk/menu.c:1458 msgid "Raw Log..." msgstr "Raakaloki..." #: src/fe-gtk/menu.c:1459 msgid "URL Grabber..." msgstr "URL-kaappaaja..." #: src/fe-gtk/menu.c:1461 msgid "Reset Marker Line" msgstr "Siirrä lukumerkki loppuun" #: src/fe-gtk/menu.c:1462 msgid "C_lear Text" msgstr "P_yyhi teksti" #: src/fe-gtk/menu.c:1464 msgid "Search Text..." msgstr "Hae tekstistä..." #: src/fe-gtk/menu.c:1465 msgid "Save Text..." msgstr "Tallenna teksti..." #: src/fe-gtk/menu.c:1467 src/fe-gtk/menu.c:1941 msgid "_Help" msgstr "_Ohje" #: src/fe-gtk/menu.c:1468 msgid "_Contents" msgstr "_Sisältö" #: src/fe-gtk/menu.c:1469 msgid "_About" msgstr "_Tietoja" #: src/fe-gtk/menu.c:1954 msgid "_Attach Window" msgstr "Kiinnitä ikkuna" #: src/fe-gtk/menu.c:1955 msgid "_Close Window" msgstr "Sulje ikkuna" #: src/fe-gtk/notifygui.c:137 msgid "User" msgstr "Käyttäjä" #: src/fe-gtk/notifygui.c:140 msgid "Last Seen" msgstr "Nähty viimeksi" #: src/fe-gtk/notifygui.c:181 msgid "Offline" msgstr "Tavoittamattomissa" #: src/fe-gtk/notifygui.c:201 src/fe-gtk/setup.c:229 msgid "Never" msgstr "Ei koskaan" #: src/fe-gtk/notifygui.c:204 src/fe-gtk/notifygui.c:229 #, c-format msgid "%d minutes ago" msgstr "%d minuuttia sitten" #: src/fe-gtk/notifygui.c:219 msgid "Online" msgstr "Tavoitettavissa" #: src/fe-gtk/notifygui.c:348 msgid "Enter nickname to add:" msgstr "Anna lisättävä kutsumanimi:" #: src/fe-gtk/notifygui.c:376 msgid "Notify on these networks:" msgstr "Ilmoita seuraavissa verkoissa:" #: src/fe-gtk/notifygui.c:387 msgid "Comma separated list of networks is accepted." msgstr "Pilkuilla eroteltu luettelo IRC-verkkoja." #: src/fe-gtk/notifygui.c:407 msgid "XChat: Notify List" msgstr "XChat: Ilmoitusluettelo" #: src/fe-gtk/notifygui.c:424 msgid "Remove" msgstr "Poista" #: src/fe-gtk/notifygui.c:428 msgid "Open Dialog" msgstr "Aloita keskustelu" #: src/fe-gtk/plugin-tray.c:163 msgid "" "Cannot find 'notify-send' to open balloon alerts.\n" "Please install libnotify." msgstr "" "Komentoa 'notify-send' ei löydy, joten puhekuplia ei voida näyttää.\n" "Tilanteen korjaamiseksi pitää asentaa libnotify." #: src/fe-gtk/plugin-tray.c:214 #, c-format msgid "XChat: Connected to %u networks and %u channels" msgstr "XChat: Yhteydessä %u verkkoon ja %u kanavaan" #: src/fe-gtk/plugin-tray.c:451 msgid "_Restore" msgstr "Palauta" #: src/fe-gtk/plugin-tray.c:453 msgid "_Hide" msgstr "Piilota" #: src/fe-gtk/plugin-tray.c:456 msgid "_Blink on" msgstr "Välkytä kun tulee" #: src/fe-gtk/plugin-tray.c:457 src/fe-gtk/setup.c:467 msgid "Channel Message" msgstr "Kanavaviesti" #: src/fe-gtk/plugin-tray.c:458 src/fe-gtk/setup.c:468 msgid "Private Message" msgstr "Yksityisviesti" #: src/fe-gtk/plugin-tray.c:459 src/fe-gtk/setup.c:469 msgid "Highlighted Message" msgstr "Korostettu viesti" #: src/fe-gtk/plugin-tray.c:507 src/fe-gtk/plugin-tray.c:515 #, c-format msgid "XChat: Highlighted message from: %s (%s)" msgstr "XChat: Korostettu viesti käyttäjältä %s (%s)" #: src/fe-gtk/plugin-tray.c:510 #, c-format msgid "XChat: %u highlighted messages, latest from: %s (%s)" msgstr "XChat: %u korostettua viestiä, viimeksi käyttäjältä %s (%s)" #: src/fe-gtk/plugin-tray.c:533 src/fe-gtk/plugin-tray.c:540 #, c-format msgid "XChat: New public message from: %s (%s)" msgstr "XChat: Uusi julkinen viesti käyttäjältä: %s (%s)" #: src/fe-gtk/plugin-tray.c:536 #, c-format msgid "XChat: %u new public messages." msgstr "XChat: %u uutta julkista viestiä." #: src/fe-gtk/plugin-tray.c:562 src/fe-gtk/plugin-tray.c:569 #, c-format msgid "XChat: Private message from: %s (%s)" msgstr "XChat: Yksityisviesti käyttäjältä %s (%s)" #: src/fe-gtk/plugin-tray.c:565 #, c-format msgid "XChat: %u private messages, latest from: %s (%s)" msgstr "XChat: %u yksityisviestiä, viimeksi käyttäjältä %s (%s)" #: src/fe-gtk/plugin-tray.c:615 src/fe-gtk/plugin-tray.c:623 #, c-format msgid "XChat: File offer from: %s (%s)" msgstr "XChat: Käyttäjä %s tarjoaa tiedostoa (%s)" #: src/fe-gtk/plugin-tray.c:618 #, c-format msgid "XChat: %u file offers, latest from: %s (%s)" msgstr "XChat: %u tiedostoa tarjottu, vimeksi käyttäjältä %s (%s)" #: src/fe-gtk/plugingui.c:76 src/fe-gtk/textgui.c:424 msgid "Description" msgstr "Kuvaus" #: src/fe-gtk/plugingui.c:151 msgid "Select a Plugin or Script to load" msgstr "Valitse ladattava skripti tai liitännäinen" #: src/fe-gtk/plugingui.c:223 msgid "XChat: Plugins and Scripts" msgstr "XChat: Skriptit ja liitännäiset" #: src/fe-gtk/plugingui.c:229 msgid "_Load..." msgstr "_Lataa..." #: src/fe-gtk/plugingui.c:232 msgid "_UnLoad" msgstr "_Poista käytöstä" #: src/fe-gtk/plugingui.c:236 src/fe-gtk/search.c:144 msgid "_Close" msgstr "_Sulje" #: src/fe-gtk/rawlog.c:81 src/fe-gtk/rawlog.c:130 src/fe-gtk/textgui.c:438 #: src/fe-gtk/urlgrab.c:205 msgid "Save As..." msgstr "Tallenna..." #: src/fe-gtk/rawlog.c:97 #, c-format msgid "XChat: Rawlog (%s)" msgstr "XChat: Raakaloki (%s)" #: src/fe-gtk/rawlog.c:127 msgid "Clear rawlog" msgstr "Tyhjennä raakaloki" #: src/fe-gtk/search.c:57 msgid "The window you opened this Search for doesn't exist anymore." msgstr "Tätä hakua varten avaamaasi ikkunaa ei enää ole." #: src/fe-gtk/search.c:65 msgid "Search hit end, not found." msgstr "Hakutekstiä ei löytynyt" #: src/fe-gtk/search.c:109 msgid "XChat: Search" msgstr "XChat: Haku" #: src/fe-gtk/search.c:127 msgid "_Match case" msgstr "Huomioi kirjainten koko" #: src/fe-gtk/search.c:133 msgid "Search _backwards" msgstr "Etsi taaksepäin" #: src/fe-gtk/search.c:146 msgid "_Find" msgstr "Etsi" #: src/fe-gtk/servlistgui.c:170 src/fe-gtk/servlistgui.c:269 msgid "New Network" msgstr "Uusi verkko" #: src/fe-gtk/servlistgui.c:554 #, c-format msgid "Really remove network \"%s\" and all its servers?" msgstr "Haluatko todella poistaa verkon \"%s\" ja kaikki sen palvelimet?" #: src/fe-gtk/servlistgui.c:678 msgid "User name and Real name cannot be left blank." msgstr "Käyttäjätunnusta ja oikeaa nimeä ei voi jättää tyhjiksi." #: src/fe-gtk/servlistgui.c:978 #, c-format msgid "XChat: Edit %s" msgstr "XChat: Muokkaa %s-verkkoa" #: src/fe-gtk/servlistgui.c:997 #, c-format msgid "Servers for %s" msgstr "%s-verkon palvelimet" #: src/fe-gtk/servlistgui.c:1008 msgid "Connect to selected server only" msgstr "Yhdistä vain valittuun palvelimeen" #: src/fe-gtk/servlistgui.c:1009 msgid "Don't cycle through all the servers when the connection fails." msgstr "Älä yritä yhdistää muihin palvelimiin, jos valittuun palvelimeen ei saada yhteyttä." #: src/fe-gtk/servlistgui.c:1011 msgid "Your Details" msgstr "Käyttäjätiedot" #: src/fe-gtk/servlistgui.c:1017 msgid "Use global user information" msgstr "Käytä yleisiä käyttäjätietoja" #: src/fe-gtk/servlistgui.c:1020 src/fe-gtk/servlistgui.c:1252 msgid "_Nick name:" msgstr "Kutsumanimi:" #: src/fe-gtk/servlistgui.c:1024 src/fe-gtk/servlistgui.c:1259 msgid "Second choice:" msgstr "2. vaihtoehto:" #: src/fe-gtk/servlistgui.c:1028 src/fe-gtk/servlistgui.c:1273 msgid "_User name:" msgstr "Käyttäjätunnus:" #: src/fe-gtk/servlistgui.c:1032 src/fe-gtk/servlistgui.c:1280 msgid "Rea_l name:" msgstr "Oikea nimi:" #: src/fe-gtk/servlistgui.c:1035 msgid "Connecting" msgstr "Yhteyden muodostus" #: src/fe-gtk/servlistgui.c:1041 msgid "Auto connect to this network at startup" msgstr "Yhdistä valmiiksi, kun X-Chat käynnistyy" #: src/fe-gtk/servlistgui.c:1043 msgid "Use a proxy server" msgstr "Käytä välipalvelinta" #: src/fe-gtk/servlistgui.c:1045 msgid "Use SSL for all the servers on this network" msgstr "Käytä SSL-yhteyttä tässä verkossa" #: src/fe-gtk/servlistgui.c:1050 msgid "Accept invalid SSL certificate" msgstr "Hyväksy epäkelpo varmenne" #: src/fe-gtk/servlistgui.c:1056 msgid "C_hannels to join:" msgstr "Avattavat kanavat:" #: src/fe-gtk/servlistgui.c:1058 msgid "Channels to join, separated by commas, but not spaces!" msgstr "Näille kanaville liitytään automaattisesti. Erota kanavat toisistaan pilkuin (mutta ei välilyönnein!)." #: src/fe-gtk/servlistgui.c:1061 msgid "Connect command:" msgstr "Yhdistämiskomento:" #: src/fe-gtk/servlistgui.c:1063 msgid "Extra command to execute after connecting. If you need more than one, set this to LOAD -e <filename>, where <filename> is a text-file full of commands to execute." msgstr "Lisäkomento, joka suoritetaan yhteyden muodostuttua. Useita komentoja voi suorittaa laittamalla ne tiedostoon, ja kirjoittamalla tähän \"LOAD -e <tiedostonimi>\"." #: src/fe-gtk/servlistgui.c:1066 msgid "Nickserv password:" msgstr "Kutsumanimen salasana:" #: src/fe-gtk/servlistgui.c:1068 msgid "If your nickname requires a password, enter it here. Not all IRC networks support this." msgstr "Jos kutsumanimesi on suojattu NickServ-palvelun salasanalla, kirjoita se tähän. Huomaa että kaikki IRC-verkot eivät tue salasanasuojausta." #: src/fe-gtk/servlistgui.c:1072 msgid "Server password:" msgstr "Palvelimen salasana:" #: src/fe-gtk/servlistgui.c:1074 msgid "Password for the server, if in doubt, leave blank." msgstr "Palvelimelle tarvittava salasana. Jätä tyhjäksi, jos olet epävarma." #: src/fe-gtk/servlistgui.c:1077 msgid "Character set:" msgstr "Merkistö:" #: src/fe-gtk/servlistgui.c:1147 msgid "_Edit" msgstr "_Muokkaa" #: src/fe-gtk/servlistgui.c:1230 msgid "XChat: Network List" msgstr "XChat: Verkkoluettelo" #: src/fe-gtk/servlistgui.c:1242 msgid "User Information" msgstr "Käyttäjätiedot" #: src/fe-gtk/servlistgui.c:1266 msgid "Third choice:" msgstr "3. vaihtoehto:" #: src/fe-gtk/servlistgui.c:1326 msgid "Networks" msgstr "IRC-verkot" #: src/fe-gtk/servlistgui.c:1367 msgid "Skip network list on startup" msgstr "Aloita ilman verkkoluetteloa" #: src/fe-gtk/servlistgui.c:1399 msgid "_Edit..." msgstr "_Muokkaa..." #: src/fe-gtk/servlistgui.c:1406 msgid "_Sort" msgstr "Lajittele" #: src/fe-gtk/servlistgui.c:1407 msgid "Sorts the network list in alphabetical order. Use SHIFT-UP and SHIFT-DOWN keys to move a row." msgstr "Lajittelee verkkoluettelon aakkosjärjestykseen. Riviä voi siirtää näppäilemällä SHIFT-YLÖS ja SHIFT-ALAS." #: src/fe-gtk/servlistgui.c:1432 msgid "C_onnect" msgstr "_Yhdistä" #: src/fe-gtk/setup.c:102 msgid "Text Box Appearance" msgstr "Tekstilaatikon ulkonäkö" #: src/fe-gtk/setup.c:103 msgid "Font:" msgstr "Kirjasin:" #: src/fe-gtk/setup.c:104 msgid "Background image:" msgstr "Taustakuva:" #: src/fe-gtk/setup.c:105 msgid "Scrollback lines:" msgstr "Vieritettäviä rivejä:" #: src/fe-gtk/setup.c:106 msgid "Colored nick names" msgstr "Väritä kutsumanimet" #: src/fe-gtk/setup.c:107 msgid "Give each person on IRC a different color" msgstr "Anna kullekin käyttäjälle oma väri." #: src/fe-gtk/setup.c:108 msgid "Indent nick names" msgstr "Sisennä kutsumanimet" #: src/fe-gtk/setup.c:109 msgid "Make nick names right-justified" msgstr "Tasaa kutsumanimet oikealle." #: src/fe-gtk/setup.c:110 msgid "Transparent background" msgstr "Läpikuultava tausta" #: src/fe-gtk/setup.c:111 msgid "Show marker line" msgstr "Näytä lukumerkki" #: src/fe-gtk/setup.c:112 msgid "Insert a red line after the last read text." msgstr "Erottaa luetun ja lukemattoman tekstin punaisella viivalla." #: src/fe-gtk/setup.c:113 msgid "Transparency Settings" msgstr "Läpikuultavuuden säätö" #: src/fe-gtk/setup.c:114 msgid "Red:" msgstr "Punainen:" #: src/fe-gtk/setup.c:115 msgid "Green:" msgstr "Vihreä:" #: src/fe-gtk/setup.c:116 msgid "Blue:" msgstr "Sininen:" #: src/fe-gtk/setup.c:118 src/fe-gtk/setup.c:379 msgid "Time Stamps" msgstr "Aikaleimat" #: src/fe-gtk/setup.c:119 msgid "Enable time stamps" msgstr "Näytä aikaleimat" #: src/fe-gtk/setup.c:120 msgid "Time stamp format:" msgstr "Aikaleiman muoto:" #: src/fe-gtk/setup.c:121 src/fe-gtk/setup.c:382 msgid "See strftime manpage for details." msgstr "Katso yksityiskohtaiset ohjeet manuaalisivulta strftime(3)." #: src/fe-gtk/setup.c:128 src/fe-gtk/setup.c:168 msgid "A-Z" msgstr "A-Z" #: src/fe-gtk/setup.c:129 msgid "Last-spoke order" msgstr "Puhumisajankohdan mukaan" #: src/fe-gtk/setup.c:135 src/fe-gtk/setup.c:1657 msgid "Input box" msgstr "Syötekenttä" #: src/fe-gtk/setup.c:136 src/fe-gtk/setup.c:200 msgid "Use the Text box font and colors" msgstr "Käytä tekstilaatikon kirjasinta ja värejä" #: src/fe-gtk/setup.c:138 msgid "Spell checking" msgstr "Oikoluku" #: src/fe-gtk/setup.c:141 msgid "Nick Completion" msgstr "Kutsumanimien täydennys" #: src/fe-gtk/setup.c:142 msgid "Automatic nick completion (without TAB key)" msgstr "Automaattinen kutsumanimien täydennys (ilman tabulaattoria)" #: src/fe-gtk/setup.c:144 msgid "Nick completion suffix:" msgstr "Täydennyksen jälkiliite:" #: src/fe-gtk/setup.c:145 msgid "Nick completion sorted:" msgstr "Kutsumanimitäydennys aakkosjärjestyksessä:" #: src/fe-gtk/setup.c:148 msgid "Input Box Codes" msgstr "Syötekentän koodit" #: src/fe-gtk/setup.c:149 #, c-format msgid "Interpret %nnn as an ASCII value" msgstr "Tulkitse %nnn ASCII-arvoksi" #: src/fe-gtk/setup.c:150 msgid "Interpret %C, %B as Color, Bold etc" msgstr "Tulkitse %C väriksi, %B lihavoinniksi, jne" #: src/fe-gtk/setup.c:167 msgid "A-Z, Ops first" msgstr "A-Z, opit ensimmäisinä" #: src/fe-gtk/setup.c:169 msgid "Z-A, Ops last" msgstr "Z-A, opit viimeisinä" #: src/fe-gtk/setup.c:170 msgid "Z-A" msgstr "Z-A" #: src/fe-gtk/setup.c:171 msgid "Unsorted" msgstr "Lajittelematon" #: src/fe-gtk/setup.c:177 src/fe-gtk/setup.c:189 msgid "Left (Upper)" msgstr "Vasemmalla (ylhäällä)" #: src/fe-gtk/setup.c:178 src/fe-gtk/setup.c:190 msgid "Left (Lower)" msgstr "Vasemmalla (alhaalla)" #: src/fe-gtk/setup.c:179 src/fe-gtk/setup.c:191 msgid "Right (Upper)" msgstr "Oikealla (ylhäällä)" #: src/fe-gtk/setup.c:180 src/fe-gtk/setup.c:192 msgid "Right (Lower)" msgstr "Oikealla (alhaalla)" #: src/fe-gtk/setup.c:181 msgid "Top" msgstr "Ylhäällä" #: src/fe-gtk/setup.c:182 msgid "Bottom" msgstr "Alhaalla" #: src/fe-gtk/setup.c:183 msgid "Hidden" msgstr "Piilotettu" #: src/fe-gtk/setup.c:198 msgid "User List" msgstr "Käyttäjäluettelo" #: src/fe-gtk/setup.c:199 msgid "Show hostnames in user list" msgstr "Näytä isäntänimet käyttäjäluettelossa" #: src/fe-gtk/setup.c:202 msgid "User list sorted by:" msgstr "Lajittelutapa:" #: src/fe-gtk/setup.c:203 msgid "Show user list at:" msgstr "Näytä käyttäjäluettelo:" #: src/fe-gtk/setup.c:205 msgid "Away tracking" msgstr "Poissaolojen seuranta" #: src/fe-gtk/setup.c:206 msgid "Track the Away status of users and mark them in a different color" msgstr "Seuraa poissaoloja ja näytä poissaolevat käyttäjät eri värillä," #: src/fe-gtk/setup.c:207 msgid "On channels smaller than:" msgstr "kun kanavalla on käyttäjiä alle:" #: src/fe-gtk/setup.c:209 msgid "Action Upon Double Click" msgstr "Kaksoisnapsautuksen toiminto" #: src/fe-gtk/setup.c:210 msgid "Execute command:" msgstr "Suorita komento:" #: src/fe-gtk/setup.c:221 msgid "Windows" msgstr "Ikkunat" #: src/fe-gtk/setup.c:222 msgid "Tabs" msgstr "Välilehdet" #: src/fe-gtk/setup.c:230 msgid "Always" msgstr "Aina" #: src/fe-gtk/setup.c:231 msgid "Only requested tabs" msgstr "Vain itse avatut" #: src/fe-gtk/setup.c:238 msgid "Channel Switcher" msgstr "Kanavavalitsin" #: src/fe-gtk/setup.c:239 msgid "Open an extra tab for server messages" msgstr "Palvelinviestit omaan välilehteensä" #: src/fe-gtk/setup.c:240 msgid "Open an extra tab for server notices" msgstr "Palvelintiedotteet omaan välilehteensä" #: src/fe-gtk/setup.c:241 msgid "Open a new tab when you receive a private message" msgstr "Avaa uusi välilehti yksityisviestin saapuessa" #: src/fe-gtk/setup.c:242 msgid "Sort tabs in alphabetical order" msgstr "Välilehdet aakkosjärjestykseen" #: src/fe-gtk/setup.c:243 msgid "Small tabs" msgstr "Pienet korvakkeet" #: src/fe-gtk/setup.c:245 msgid "Focus new tabs:" msgstr "Uudet välilehdet etualalle:" #: src/fe-gtk/setup.c:247 msgid "Show channel switcher at:" msgstr "Näytä kanavavalitsin:" #: src/fe-gtk/setup.c:248 msgid "Shorten tab labels to:" msgstr "Typistä välilehtien nimet:" #: src/fe-gtk/setup.c:248 msgid "letters." msgstr "merkin pituisiksi." #: src/fe-gtk/setup.c:250 msgid "Tabs or Windows" msgstr "Välilehti vai ikkuna" #: src/fe-gtk/setup.c:251 msgid "Open channels in:" msgstr "Kanavien avaamispaikka:" #: src/fe-gtk/setup.c:252 msgid "Open dialogs in:" msgstr "Keskusteluiden avaamispaikka:" #: src/fe-gtk/setup.c:253 msgid "Open utilities in:" msgstr "Apuvälineiden avaamispaikka:" #: src/fe-gtk/setup.c:253 msgid "Open DCC, Ignore, Notify etc, in tabs or windows?" msgstr "DCC:t, huomioimattomuudet, ilmoitukset jne." #: src/fe-gtk/setup.c:260 msgid "No" msgstr "Ei" #: src/fe-gtk/setup.c:261 msgid "Yes" msgstr "Kyllä" #: src/fe-gtk/setup.c:262 msgid "Browse for save folder every time" msgstr "Valitse tallennushakemisto joka kerta" #: src/fe-gtk/setup.c:268 msgid "Files and Directories" msgstr "Tiedostot ja hakemistot" #: src/fe-gtk/setup.c:269 msgid "Auto accept file offers:" msgstr "Hyväksy tarjotut tiedostot automaattisesti:" #: src/fe-gtk/setup.c:270 msgid "Download files to:" msgstr "Lataa hakemistoon:" #: src/fe-gtk/setup.c:271 msgid "Move completed files to:" msgstr "Siirrä valmiit tiedostot hakemistoon:" #: src/fe-gtk/setup.c:272 msgid "Save nick name in filenames" msgstr "Liitä lähettäjän kutsumanimi tiedostonimiin" #: src/fe-gtk/setup.c:274 msgid "Network Settings" msgstr "Verkkoasetukset" #: src/fe-gtk/setup.c:275 msgid "Get my address from the IRC server" msgstr "Hae IP-osoite IRC-palvelimelta" #: src/fe-gtk/setup.c:276 msgid "Asks the IRC server for your real address. Use this if you have a 192.168.*.* address!" msgstr "Tiedustelee osoittettasi IRC-palvelimelta. Rastita, mikäli osoitteesi on esimerkiksi muotoa 192.168.*.*!" #: src/fe-gtk/setup.c:277 msgid "DCC IP address:" msgstr "DCC:n IP-osoite:" #: src/fe-gtk/setup.c:278 msgid "Claim you are at this address when offering files." msgstr "Tiedostoja väitetään lähetettävän tästä osoitteesta." #: src/fe-gtk/setup.c:279 msgid "First DCC send port:" msgstr "Ensimmäinen DCC-lähetysportti" #: src/fe-gtk/setup.c:280 msgid "Last DCC send port:" msgstr "Viimeinen DCC-lähetysportti" #: src/fe-gtk/setup.c:281 msgid "!Leave ports at zero for full range." msgstr "Jätä nolliksi, jos haluat käyttöön kaikki portit." #: src/fe-gtk/setup.c:283 msgid "Maximum File Transfer Speeds (bytes per second)" msgstr "Siirtonopeuksien ylärajat (tavua sekunnissa)" #: src/fe-gtk/setup.c:284 msgid "One upload:" msgstr "Yksittäinen lähetys:" #: src/fe-gtk/setup.c:285 src/fe-gtk/setup.c:287 msgid "Maximum speed for one transfer" msgstr "Yksittäisen siirron suurin sallittu nopeus." #: src/fe-gtk/setup.c:286 msgid "One download:" msgstr "Yksittäinen lataus:" #: src/fe-gtk/setup.c:288 msgid "All uploads combined:" msgstr "Kaikki lähetykset yhteensä:" #: src/fe-gtk/setup.c:289 src/fe-gtk/setup.c:291 msgid "Maximum speed for all files" msgstr "Yhteenlaskettujen siirtojen suurin sallittu nopeus." #: src/fe-gtk/setup.c:290 msgid "All downloads combined:" msgstr "Kaikki lataukset yhteensä:" #: src/fe-gtk/setup.c:318 src/fe-gtk/setup.c:1663 msgid "Alerts" msgstr "Hälytykset" #: src/fe-gtk/setup.c:322 msgid "Show tray balloons on:" msgstr "Näytä puhekupla, kun tulee:" #: src/fe-gtk/setup.c:324 msgid "Blink tray icon on:" msgstr "Välkytä ilmoitusalueella, kun tulee:" #: src/fe-gtk/setup.c:325 msgid "Blink task bar on:" msgstr "Välkytä tehtäväpalkkia, kun tulee:" #: src/fe-gtk/setup.c:326 msgid "Make a beep sound on:" msgstr "Piipauta, kun tulee:" # Pilkku lopussa, koska lause jatkuu seuraavaan asetuskohtaan. #: src/fe-gtk/setup.c:328 msgid "Enable system tray icon" msgstr "Ota ilmoitusalueen kuvake käyttöön" #: src/fe-gtk/setup.c:330 msgid "Highlighted Messages" msgstr "Korostettu viesti" #: src/fe-gtk/setup.c:331 msgid "Highlighted messages are ones where your nickname is mentioned, but also:" msgstr "Viesti korostetaan, kun siinä mainitaan kutsumanimesi tai:" #: src/fe-gtk/setup.c:333 msgid "Extra words to highlight:" msgstr "Muut korostettavat sanat:" #: src/fe-gtk/setup.c:334 msgid "Nick names not to highlight:" msgstr "Älä korosta viestejä käyttäjiltä:" #: src/fe-gtk/setup.c:335 msgid "Nick names to always highlight:" msgstr "Korosta aina viestit käyttäjiltä:" #: src/fe-gtk/setup.c:336 msgid "Separate multiple words with commas." msgstr "Erota sanat toisistaan pilkuilla." #: src/fe-gtk/setup.c:342 msgid "Default Messages" msgstr "Oletusilmoitukset" #: src/fe-gtk/setup.c:343 msgid "Quit:" msgstr "Lopetus:" #: src/fe-gtk/setup.c:344 msgid "Leave channel:" msgstr "Kanavalta poistuminen:" #: src/fe-gtk/setup.c:345 msgid "Away:" msgstr "Poissaolo:" #: src/fe-gtk/setup.c:347 msgid "Away" msgstr "Poissaolo" #: src/fe-gtk/setup.c:348 msgid "Announce away messages" msgstr "Kuuluta poissaoloviestit" #: src/fe-gtk/setup.c:349 msgid "Announce your away messages to all channels" msgstr "Lähettää poissaoloviestit kaikille kanaville." #: src/fe-gtk/setup.c:350 msgid "Show away once" msgstr "Näytä poissaoloviestit kerran" #: src/fe-gtk/setup.c:350 msgid "Show identical away messages only once" msgstr "Näyttää identtiset poissaoloviestit vain kerran." #: src/fe-gtk/setup.c:351 msgid "Automatically unmark away" msgstr "Lopeta oma poissaolo automaattisesti" #: src/fe-gtk/setup.c:351 msgid "Unmark yourself as away before sending messages" msgstr "Merkitsee sinut läsnäolevaksi ennen viestien lähettämistä." #: src/fe-gtk/setup.c:358 msgid "Advanced Settings" msgstr "Lisäasetukset" #: src/fe-gtk/setup.c:359 msgid "Auto reconnect delay:" msgstr "Automaattisen yhdistämisen viive:" #: src/fe-gtk/setup.c:360 msgid "Display MODEs in raw form" msgstr "Näytä tilat raakamuodossa" #: src/fe-gtk/setup.c:361 msgid "Whois on notify" msgstr "Suorita whois ilmoituksen yhteydessä" #: src/fe-gtk/setup.c:361 msgid "Sends a /WHOIS when a user comes online in your notify list" msgstr "Lähettää /WHOIS-komennon, kun ilmoitusluettelossa oleva käyttäjä on tavoitettavissa" #: src/fe-gtk/setup.c:362 msgid "Hide join and part messages" msgstr "Piilota liittymis- ja poistumisviestit" #: src/fe-gtk/setup.c:362 msgid "Hide channel join/part messages by default" msgstr "Piilota liittymis- ja poistumisviestit oletuksena" #: src/fe-gtk/setup.c:363 msgid "Auto Open DCC Windows" msgstr "Avaa DCC-ikkunat automaattisesti" #: src/fe-gtk/setup.c:364 msgid "Send window" msgstr "Lähetysikkuna" #: src/fe-gtk/setup.c:365 msgid "Receive window" msgstr "Vastaanottoikkuna" #: src/fe-gtk/setup.c:366 msgid "Chat window" msgstr "Kanavaikkuna" #: src/fe-gtk/setup.c:374 src/fe-gtk/setup.c:1665 msgid "Logging" msgstr "Lokiasetukset" #: src/fe-gtk/setup.c:375 msgid "Enable logging of conversations" msgstr "Pidä keskusteluista lokia" #: src/fe-gtk/setup.c:376 msgid "Log filename:" msgstr "Lokitiedoston nimi:" #: src/fe-gtk/setup.c:377 #, c-format msgid "%s=Server %c=Channel %n=Network." msgstr "%s=palvelin %c=kanava %n=verkko." #: src/fe-gtk/setup.c:380 msgid "Insert timestamps in logs" msgstr "Lisää lokeihin aikaleimat" #: src/fe-gtk/setup.c:381 msgid "Log timestamp format:" msgstr "Lokitiedoston aikaleiman muoto:" #: src/fe-gtk/setup.c:389 msgid "(Disabled)" msgstr "(Pois käytöstä)" #: src/fe-gtk/setup.c:390 msgid "Wingate" msgstr "Wingate" #: src/fe-gtk/setup.c:391 msgid "Socks4" msgstr "Socks4" #: src/fe-gtk/setup.c:392 msgid "Socks5" msgstr "Socks5" #: src/fe-gtk/setup.c:393 msgid "HTTP" msgstr "HTTP" #: src/fe-gtk/setup.c:395 msgid "MS Proxy (ISA)" msgstr "MS Proxy (ISA)" #: src/fe-gtk/setup.c:402 msgid "All Connections" msgstr "Kaikille yhteyksille" #: src/fe-gtk/setup.c:403 msgid "IRC Server Only" msgstr "Vain IRC-palvelimille" #: src/fe-gtk/setup.c:404 msgid "DCC Get Only" msgstr "Vain DCC-siirroille" #: src/fe-gtk/setup.c:410 msgid "Your Address" msgstr "Oma IP-osoite" #: src/fe-gtk/setup.c:411 msgid "Bind to:" msgstr "Sido osoitteeseen:" #: src/fe-gtk/setup.c:412 msgid "Only useful for computers with multiple addresses." msgstr "Käyttökelpoinen vain, kun tietokoneessa on monta osoitetta." #: src/fe-gtk/setup.c:414 msgid "Proxy Server" msgstr "Välipalvelin" #: src/fe-gtk/setup.c:415 msgid "Hostname:" msgstr "Isäntänimi:" #: src/fe-gtk/setup.c:416 msgid "Port:" msgstr "Portti:" #: src/fe-gtk/setup.c:417 msgid "Type:" msgstr "Tyyppi:" #: src/fe-gtk/setup.c:418 msgid "Use proxy for:" msgstr "Käytä välipalvelinta:" #: src/fe-gtk/setup.c:420 msgid "Proxy Authentication" msgstr "Välipalvelimelle tunnistautuminen" #: src/fe-gtk/setup.c:422 msgid "Use Authentication (MS Proxy, HTTP or Socks5 only)" msgstr "Tunnistaudu välipalvelimelle (vain MS Proxy, HTTP ja Socks5)" #: src/fe-gtk/setup.c:424 msgid "Use Authentication (HTTP or Socks5 only)" msgstr "Tunnistaudu välipalvelimelle (vain HTTP ja Socks5)" #: src/fe-gtk/setup.c:426 msgid "Username:" msgstr "Käyttäjänimi:" #: src/fe-gtk/setup.c:427 msgid "Password:" msgstr "Salasana:" #: src/fe-gtk/setup.c:838 msgid "Select an Image File" msgstr "Valitse kuvatiedosto" #: src/fe-gtk/setup.c:862 msgid "Select Download Folder" msgstr "Valitse latauskansio" #: src/fe-gtk/setup.c:871 msgid "Select font" msgstr "Valitse kirjasin" #: src/fe-gtk/setup.c:968 msgid "Browse..." msgstr "Selaa..." #: src/fe-gtk/setup.c:1108 msgid "Mark identified users with:" msgstr "Merkitse tunnistetut käyttäjät seuraavasti:" #: src/fe-gtk/setup.c:1110 msgid "Mark not-identified users with:" msgstr "Merkitse tuntemattomat käyttäjät seuraavasti:" #: src/fe-gtk/setup.c:1117 msgid "Open Data Folder" msgstr "Avaa datakansio" #: src/fe-gtk/setup.c:1171 msgid "Select color" msgstr "Valitse väri" #: src/fe-gtk/setup.c:1251 msgid "Text Colors" msgstr "Tekstin värit" #: src/fe-gtk/setup.c:1253 msgid "mIRC colors:" msgstr "mIRC-värit:" #: src/fe-gtk/setup.c:1261 msgid "Local colors:" msgstr "Omat värit" #: src/fe-gtk/setup.c:1269 src/fe-gtk/setup.c:1274 msgid "Foreground:" msgstr "Edustaväri:" #: src/fe-gtk/setup.c:1270 src/fe-gtk/setup.c:1275 msgid "Background:" msgstr "Taustaväri:" #: src/fe-gtk/setup.c:1272 msgid "Marking Text" msgstr "Tekstin maalaus" #: src/fe-gtk/setup.c:1277 msgid "Interface Colors" msgstr "Käyttöliittymän värit" #: src/fe-gtk/setup.c:1279 msgid "New data:" msgstr "Uusi data:" #: src/fe-gtk/setup.c:1280 msgid "Marker line:" msgstr "Lukumerkkiviiva:" #: src/fe-gtk/setup.c:1281 msgid "New message:" msgstr "Uusi viesti:" #: src/fe-gtk/setup.c:1282 msgid "Away user:" msgstr "Poissaolijat:" #: src/fe-gtk/setup.c:1283 msgid "Highlight:" msgstr "Korostus:" #: src/fe-gtk/setup.c:1379 src/fe-gtk/textgui.c:389 msgid "Event" msgstr "Tapahtuma" #: src/fe-gtk/setup.c:1385 msgid "Sound file" msgstr "Äänitiedosto" #: src/fe-gtk/setup.c:1420 msgid "Select a sound file" msgstr "Valitse äänitiedosto" #: src/fe-gtk/setup.c:1492 msgid "Sound playing method:" msgstr "Äänensoittotapa:" #: src/fe-gtk/setup.c:1500 msgid "External sound playing _program:" msgstr "Ulkoinen soitto-ohjelma:" #: src/fe-gtk/setup.c:1518 msgid "_External program" msgstr "Ulkoisella ohjelmalla" #: src/fe-gtk/setup.c:1528 msgid "_Automatic" msgstr "Automaattinen" #: src/fe-gtk/setup.c:1541 msgid "Sound files _directory:" msgstr "Äänitiedostojen hakemisto:" #: src/fe-gtk/setup.c:1580 msgid "Sound file:" msgstr "Äänitiedosto: " #: src/fe-gtk/setup.c:1595 msgid "_Browse..." msgstr "Selaa..." #: src/fe-gtk/setup.c:1606 msgid "_Play" msgstr "Soita" #: src/fe-gtk/setup.c:1655 msgid "Interface" msgstr "Käyttöliittymä" #: src/fe-gtk/setup.c:1656 msgid "Text box" msgstr "Tekstilaatikko" #: src/fe-gtk/setup.c:1658 msgid "User list" msgstr "Käyttäjäluettelo" #: src/fe-gtk/setup.c:1659 msgid "Channel switcher" msgstr "Kanavavalitsin" #: src/fe-gtk/setup.c:1660 msgid "Colors" msgstr "Värit" #: src/fe-gtk/setup.c:1662 msgid "Chatting" msgstr "Keskustelu" #: src/fe-gtk/setup.c:1664 msgid "General" msgstr "Yleiset" #: src/fe-gtk/setup.c:1666 msgid "Sound" msgstr "Ääni" #: src/fe-gtk/setup.c:1670 msgid "Network setup" msgstr "Verkkoasetukset" #: src/fe-gtk/setup.c:1671 msgid "File transfers" msgstr "Tiedostonsiirrot" #: src/fe-gtk/setup.c:1779 msgid "Categories" msgstr "Asetusryhmät" #: src/fe-gtk/setup.c:1960 msgid "" "You cannot place the tree on the top or bottom!\n" "Please change to the <b>Tabs</b> layout in the <b>View</b> menu first." msgstr "" "Puuta ei voi laittaa ylös eikä alas!\n" "Muuta ensin välilehtiasettelua <b>Näytä</b>-valikosta." #: src/fe-gtk/setup.c:1970 msgid "Some settings were changed that require a restart to take full effect." msgstr "Osa muutoksista tulee voimaan vasta kun ohjelma käynnistetään uudestaan." #: src/fe-gtk/setup.c:1978 msgid "" "*WARNING*\n" "Auto accepting DCC to your home directory\n" "can be dangerous and is exploitable. Eg:\n" "Someone could send you a .bash_profile" msgstr "" "*VAROITUS*\n" "DCC-siirtojen automaattinen hyväksyminen\n" "kotihakemistoon voi olla vaarallista. Esim:\n" "Joku voi lähettää tiedoston .bash_profile." #: src/fe-gtk/setup.c:2011 msgid "XChat: Preferences" msgstr "XChat: Ominaisuudet" #: src/fe-gtk/textgui.c:180 msgid "There was an error parsing the string" msgstr "Virhe jäsennettäessä merkkijonoa" #: src/fe-gtk/textgui.c:188 #, c-format msgid "This signal is only passed %d args, $%d is invalid" msgstr "Tälle signaalille annetaan vain %d argumenttia, $%d on virheellinen" #: src/fe-gtk/textgui.c:304 src/fe-gtk/textgui.c:327 msgid "Print Texts File" msgstr "Tallenna tekstitiedosto" #: src/fe-gtk/textgui.c:372 msgid "Edit Events" msgstr "Muokkaa tapahtumatekstejä" #: src/fe-gtk/textgui.c:423 msgid "$ Number" msgstr "$ Numero" #: src/fe-gtk/textgui.c:440 msgid "Load From..." msgstr "Lataa..." #: src/fe-gtk/textgui.c:441 msgid "Test All" msgstr "Kokeile kaikki" #: src/fe-gtk/urlgrab.c:98 msgid "URL" msgstr "URL" #: src/fe-gtk/urlgrab.c:188 msgid "XChat: URL Grabber" msgstr "XChat: URL-kaappaaja" #: src/fe-gtk/urlgrab.c:201 msgid "Clear list" msgstr "Tyhjennä luettelo" #: src/fe-gtk/urlgrab.c:203 msgid "Copy selected URL" msgstr "Kopioi valittu URL" #: src/fe-gtk/urlgrab.c:203 msgid "Copy" msgstr "Kopioi" #: src/fe-gtk/urlgrab.c:205 msgid "Save list to a file" msgstr "Tallenna luettelo tiedostoon" #: src/fe-gtk/userlistgui.c:111 #, c-format msgid "%d ops, %d total" msgstr "%d oppia, %d yhteensä"