# HG changeset patch # User Ka-Hing Cheung # Date 1202268904 0 # Node ID 00eaff9396ec3ef97e5af288935285079c8b82a7 # Parent f182cf94145cf4b6d8428f2b5a93a898e6745d3d# Parent 7f7c89ff5cc70e28d782e08f250b3169d17e3104 propagate from branch 'im.pidgin.pidgin' (head e39a6e9be3df05b59a878001feb9276b9ceb66a9) to branch 'im.pidgin.pidgin.khc.msnp15' (head c5b8a906c26f5cb0fd8c7256852e3c1e346d7863) diff -r f182cf94145c -r 00eaff9396ec COPYRIGHT --- a/COPYRIGHT Sun Jan 13 00:29:56 2008 +0000 +++ b/COPYRIGHT Wed Feb 06 03:35:04 2008 +0000 @@ -151,6 +151,7 @@ Michael Golden Charlie Gordon Ryan C. Gordon +Konrad Gräfe Miah Gregory David Grohmann Christian Hammond @@ -167,6 +168,7 @@ Nick Hebner Mike Heffner Justin Heiner +Moos Heintzen Benjamin Herrenschmidt Fernando Herrera hjheins @@ -268,6 +270,7 @@ Padraig O'Briain Christopher O'Brien (siege) Jon Oberheide +Yusuke Odate Ruediger Oertel Gudmundur Bjarni Olafsson Bartosz Oler @@ -298,6 +301,7 @@ Jory A. Pratt Brent Priddy Justin Pryzby +Ignacio Casal Quinteiro Federicco Mena Quintero Yosef Radchenko David Raeman @@ -319,6 +323,7 @@ Jean-Francois Roy Peter Ruibal Sam S. +Thanumalayan S. Pradyumna Sampath Arvind Samptur Tom Samstag @@ -347,6 +352,7 @@ Scott Shedden Dossy Shiobara Michael Shkutkov +Shreevatsa R Ettore Simone John Silvestri Craig Slusher @@ -366,6 +372,7 @@ Richard Stellingwerff Charlie Stockman David Stoddard +Andreas Stührk Oleg Sukhodolsky Sun Microsystems Mårten Svantesson (fursten) @@ -414,12 +421,14 @@ Zsombor Welker Andrew Wellington Adam Wendt +Simon Wenner Dave West Zac West Daniel Westermann-Clark Andrew Whewell Simon Wilkinson Dan Willemsen +Justin Williams (Jaywalker) Jason Willis Matt Wilson Dan Winship diff -r f182cf94145c -r 00eaff9396ec ChangeLog --- a/ChangeLog Sun Jan 13 00:29:56 2008 +0000 +++ b/ChangeLog Wed Feb 06 03:35:04 2008 +0000 @@ -7,19 +7,43 @@ * Eliminated unmaintained Howl backend implementation for the Bonjour protocol. Avahi (or Apple's Bonjour runtime on win32) is now required to use Bonjour. + * Partial support for viewing ICQ status notes (Collin from + ComBOTS GmbH). + * Support for /notice on IRC. + * Support for Yahoo Messenger 7.0+ file transfer method (Thanumalayan S.) + * Support for retrieving full names and addresses from the address book + on Yahoo! Japan (Yusuke Odate) + * The AIM/ICQ server-side preference for "allow others to see me + as idle" is no longer unconditionally set to "yes" even when + your libpurple preference is "no." Pidgin: * Added the ability to theme conversation name colors (red and blue) through your GTK+ theme, and exposed those theme settings to the Pidgin GTK+ Theme Control plugin (Dustin Howett) + * Fixed having multiple alias edit areas in the infopane (Elliott Sales + de Andrade) + * Save the conversation "Enable Logging" option per-contact (Moos + Heintzen) Finch: * Color is used in the buddylist to indicate status, and the conversation window to indicate various message attributes. Look at the sample gntrc - file in the man-page for details. + file in the man page for details. * The default keybinding for dump-screen is now M-D and uses a file request dialog. M-d will properly delete-forward-word, and M-f has been fixed to imitate readline's behavior. + * New bindings alt+tab and alt+shift+tab to help navigating between the + higlighted windows (details on the man page). + * Recently signed on (or off) buddies blink in the buddy list. + * New action 'Room List' in the action list can be used to get the list of + available chat rooms for an online account. + * The 'Grouping' plugin can be used for alternate grouping in the + buddylist. The current options are 'Group Online/Offline' and 'No + Group'. + * Added a log viewer + * Added the ability to block/unblock buddies - see the buddy context menu + and the menu for the buddy list. version 2.3.1 (12/7/2007): http://developer.pidgin.im/query?status=closed&milestone=2.3.1 diff -r f182cf94145c -r 00eaff9396ec ChangeLog.API --- a/ChangeLog.API Sun Jan 13 00:29:56 2008 +0000 +++ b/ChangeLog.API Wed Feb 06 03:35:04 2008 +0000 @@ -8,6 +8,41 @@ * purple_major_version, purple_minor_version, purple_micro_version variables are exported by version.h, giving the version of libpurple in use at runtime. + * purple_util_set_current_song, purple_util_format_song_info + * Some accessor functions to the Roomlist API: + * purple_roomlist_get_fields + * purple_roomlist_room_get_type + * purple_roomlist_room_get_name + * purple_roomlist_room_get_parent + * purple_roomlist_room_get_fields + * purple_roomlist_field_get_type + * purple_roomlist_field_get_label + * purple_roomlist_field_get_hidden + * unlocalized_name field in PurpleAttentionType for UIs that need it. + * Some accessor and mutator functions for PurpleAttentionType: + * purple_attention_type_set_name + * purple_attention_type_set_incoming_desc + * purple_attention_type_set_outgoing_desc + * purple_attention_type_set_icon_name + * purple_attention_type_set_unlocalized_name + * purple_attention_type_get_name + * purple_attention_type_get_incoming_desc + * purple_attention_type_get_outgoing_desc + * purple_attention_type_get_icon_name + * purple_attention_type_get_unlocalized_name + * Add some PurpleBuddyListNode accessor functions: + * purple_blist_node_get_parent + * purple_blist_node_get_first_child + * purple_blist_node_get_sibling_next + * purple_blist_node_get_sibling_prev + * Added last_received to PurpleConnection, the time_t of the + last received packet. + * Added some more accessor functions: + * purple_chat_get_account + * purple_chat_get_components + * purple_connection_get_prpl + * purple_xfer_get_start_time + * purple_xfer_get_end_time Pidgin: Added: @@ -21,10 +56,28 @@ smileys in the text. (Florian 'goutnet' Delizy) * pidgin_auto_parent_window to make a window transient for a suitable parent window. - * pidgin_tooltip_setup_for_treeview, pidgin_tooltip_destroy and - pidgin_tooltip_show to simplify the process of drawing tooltips. + * pidgin_tooltip_setup_for_treeview, pidgin_tooltip_destroy, + pidgin_tooltip_show and pidgin_tooltip_setup_for_widget to simplify + the process of drawing tooltips. + * pidgin_add_widget_to_vbox to simplify adding a labeled widget to a + window. + + Deprecated: + * PIDGIN_DIALOG Finch: + * finch_roomlist_get_ui_ops and finch_roomlist_show_all + * finch_request_field_get_widget to get the widget for a request + field. + * finch_blist_get_tree to get the GntTree widget representing the + buddy list. + * FinchBlistManager structure to manage the buddylist view, and some + util functions finch_blist_install_manager, + finch_blist_uninstall_manager, finch_blist_manager_find and + finch_blist_manager_add_node. + * Added finch_log_show, finch_log_show_contact, finch_syslog_show, + finch_log_init, finch_log_get_handle, finch_log_uninit + libgnt: * Added gnt_tree_set_row_color to set the color for a row in a tree. * Added gnt_style_get_string_list @@ -33,6 +86,7 @@ string. * Added gnt_style_get_color to get a color pair from an entry in ~/.gntrc + * Added gnt_tree_get_parent_key to get the key for the parent row. version 2.3.0 (11/24/2007): libpurple: diff -r f182cf94145c -r 00eaff9396ec ChangeLog.win32 --- a/ChangeLog.win32 Sun Jan 13 00:29:56 2008 +0000 +++ b/ChangeLog.win32 Wed Feb 06 03:35:04 2008 +0000 @@ -1,3 +1,6 @@ +version 2.3.1 (12/7/2007): + * No changes + version 2.3.0 (11/24/2007): * Updated GTK+ to 2.12.1 (This was actually included in 2.2.2, but didn't get into the Changelog.) @@ -135,7 +138,7 @@ version 0.82 (08/26/2004): * Selecting away messages using the system tray icon works - (Thanks Fran?ois Gagn?) + (Thanks François Gagné) * Transparency plugin will save your settings again (Kevin Stange) * Updated gtk-wimp to 0.6.2 * Updated libpng to 1.2.6 (major security update) diff -r f182cf94145c -r 00eaff9396ec autogen.sh --- a/autogen.sh Sun Jan 13 00:29:56 2008 +0000 +++ b/autogen.sh Wed Feb 06 03:35:04 2008 +0000 @@ -9,42 +9,42 @@ echo; echo "You must have glib-gettextize installed to compile Pidgin."; echo; - exit; + exit 1; } (intltoolize --version) < /dev/null > /dev/null 2>&1 || { echo; echo "You must have intltool installed to compile Pidgin."; echo; - exit; + exit 1; } (libtoolize --version) < /dev/null > /dev/null 2>&1 || { echo; echo "You must have libtool installed to compile Pidgin."; echo; - exit; + exit 1; } (automake --version) < /dev/null > /dev/null 2>&1 || { echo; echo "You must have automake installed to compile Pidgin."; echo; - exit; + exit 1; } (autoconf --version) < /dev/null > /dev/null 2>&1 || { echo; echo "You must have autoconf installed to compile Pidgin."; echo; - exit; + exit 1; } echo "Generating configuration files for Pidgin, please wait...." echo; echo "Running libtoolize, please ignore non-fatal messages...." -echo n | libtoolize --copy --force || exit; +echo n | libtoolize --copy --force || exit 1; # Add other directories to this list if people continue to experience # brokennesses ... Obviously the real answer is for them to fix it @@ -60,11 +60,11 @@ libtoolize -c -f --automake glib-gettextize --force --copy intltoolize --force --copy -aclocal $ACLOCAL_FLAGS || exit; -autoheader || exit; +aclocal $ACLOCAL_FLAGS || exit 1; +autoheader || exit 1; automake --add-missing --copy; -autoconf || exit; -automake || exit; +autoconf || exit 1; +automake || exit 1; echo; echo "Running ./configure ${CONFIGURE_ARGS} $@" diff -r f182cf94145c -r 00eaff9396ec config.h.mingw --- a/config.h.mingw Sun Jan 13 00:29:56 2008 +0000 +++ b/config.h.mingw Wed Feb 06 03:35:04 2008 +0000 @@ -355,7 +355,7 @@ /* Loads static protocol plugin module initialization functions. */ #ifndef STATIC_PROTO_INIT -#define STATIC_PROTO_INIT static void static_proto_init() { } +#define STATIC_PROTO_INIT static void static_proto_init(void) { } #endif /* Define to 1 if you have the ANSI C header files. */ diff -r f182cf94145c -r 00eaff9396ec configure.ac --- a/configure.ac Sun Jan 13 00:29:56 2008 +0000 +++ b/configure.ac Wed Feb 06 03:35:04 2008 +0000 @@ -142,7 +142,7 @@ dnl If we don't have msgfmt, then po/ is going to fail -- ensure that dnl AM_GLIB_GNU_GETTEXT found it. -if test x$MSGFMT = xno -o x$MSGFMT$GMSGFMT = x +if test x$MSGFMT = xno -o x$MSGFMT$GMSGFMT$INTLTOOL_MSGFMT = x then AC_ERROR([ @@ -978,7 +978,7 @@ AM_CONDITIONAL(STATIC_YAHOO, test "x$static_yahoo" = "xyes") AM_CONDITIONAL(STATIC_ZEPHYR, test "x$static_zephyr" = "xyes") AC_SUBST(STATIC_LINK_LIBS) -AC_DEFINE_UNQUOTED(STATIC_PROTO_INIT, $extern_init static void static_proto_init() { $load_proto }, +AC_DEFINE_UNQUOTED(STATIC_PROTO_INIT, $extern_init static void static_proto_init(void) { $load_proto }, [Loads static protocol plugin module initialization functions.]) AC_ARG_WITH(dynamic_prpls, [AC_HELP_STRING([--with-dynamic-prpls], [specify which protocols to build dynamically])], [DYNAMIC_PRPLS=`echo $withval | $sedpath 's/,/ /g'`]) diff -r f182cf94145c -r 00eaff9396ec doc/finch.1.in --- a/doc/finch.1.in Sun Jan 13 00:29:56 2008 +0000 +++ b/doc/finch.1.in Wed Feb 06 03:35:04 2008 +0000 @@ -105,6 +105,12 @@ .B Alt \+ 1 2 ... 0 Jump to the 1st, 2nd ... 10th window. .TP +.B Alt \+ Tab +Jump to the next URGENT (highlighted) window. +.TP +.B Alt \+ Shift \+ Tab +Jump to the previous URGENT (highlighted) window. +.TP .B Ctrl \+ o Bring up the menu (if there is one) for a window. .TP @@ -460,6 +466,7 @@ .br # switch-window-n .br +# Other actions: window-next-urgent, window-prev-urgent # For the sample custom window manager .br diff -r f182cf94145c -r 00eaff9396ec finch/Makefile.am --- a/finch/Makefile.am Sun Jan 13 00:29:56 2008 +0000 +++ b/finch/Makefile.am Wed Feb 06 03:35:04 2008 +0000 @@ -25,11 +25,13 @@ gntft.c \ finch.c \ gntidle.c \ + gntlog.c \ gntnotify.c \ gntplugin.c \ gntpounce.c \ gntprefs.c \ gntrequest.c \ + gntroomlist.c \ gntsound.c \ gntstatus.c \ gntui.c @@ -44,11 +46,13 @@ gntft.h \ finch.h \ gntidle.h \ + gntlog.h \ gntnotify.h \ gntplugin.h \ gntpounce.h \ gntprefs.h \ gntrequest.h \ + gntroomlist.h \ gntsound.h \ gntstatus.h \ gntui.h diff -r f182cf94145c -r 00eaff9396ec finch/finch.c --- a/finch/finch.c Sun Jan 13 00:29:56 2008 +0000 +++ b/finch/finch.c Wed Feb 06 03:35:04 2008 +0000 @@ -49,14 +49,14 @@ #include "config.h" static void -debug_init() +debug_init(void) { finch_debug_init(); purple_debug_set_ui_ops(finch_debug_get_ui_ops()); } static GHashTable *ui_info = NULL; -static GHashTable *finch_ui_get_info() +static GHashTable *finch_ui_get_info(void) { if (ui_info == NULL) { ui_info = g_hash_table_new(g_str_hash, g_str_equal); @@ -91,7 +91,7 @@ }; static PurpleCoreUiOps * -gnt_core_get_ui_ops() +gnt_core_get_ui_ops(void) { return &core_ops; } diff -r f182cf94145c -r 00eaff9396ec finch/finch.h --- a/finch/finch.h Sun Jan 13 00:29:56 2008 +0000 +++ b/finch/finch.h Wed Feb 06 03:35:04 2008 +0000 @@ -29,3 +29,7 @@ #define FINCH_UI "gnt-purple" #define FINCH_PREFS_ROOT "/finch" + +#define FINCH_GET_DATA(obj) (obj)->ui_data +#define FINCH_SET_DATA(obj, data) (obj)->ui_data = data + diff -r f182cf94145c -r 00eaff9396ec finch/gntaccount.c --- a/finch/gntaccount.c Sun Jan 13 00:29:56 2008 +0000 +++ b/finch/gntaccount.c Wed Feb 06 03:35:04 2008 +0000 @@ -632,7 +632,8 @@ prompt = g_strdup_printf(_("Are you sure you want to delete %s?"), purple_account_get_username(account)); - purple_request_action(account, _("Delete Account"), prompt, NULL, 0, + purple_request_action(account, _("Delete Account"), prompt, NULL, + PURPLE_DEFAULT_ACTION_NONE, account, NULL, NULL, account, 2, _("Delete"), really_delete_account, _("Cancel"), NULL); @@ -686,7 +687,7 @@ } g_signal_connect(G_OBJECT(accounts.tree), "toggled", G_CALLBACK(account_toggled), NULL); - + gnt_tree_set_col_width(GNT_TREE(accounts.tree), 0, 40); gnt_tree_set_col_width(GNT_TREE(accounts.tree), 1, 10); gnt_box_add_widget(GNT_BOX(accounts.window), accounts.tree); @@ -708,11 +709,11 @@ gnt_box_add_widget(GNT_BOX(box), button); gnt_util_set_trigger_widget(GNT_WIDGET(accounts.tree), GNT_KEY_DEL, button); g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(delete_account_cb), accounts.tree); - + gnt_box_add_widget(GNT_BOX(accounts.window), box); g_signal_connect(G_OBJECT(accounts.window), "destroy", G_CALLBACK(reset_accounts_win), NULL); - + gnt_widget_show(accounts.window); } @@ -722,7 +723,7 @@ } static gpointer -finch_accounts_get_handle() +finch_accounts_get_handle(void) { static int handle; @@ -981,7 +982,7 @@ gnt_box_add_widget(GNT_BOX(uihandle), gnt_hline_new()); - widget = finch_retrieve_user_info(account->gc, remote_user); + widget = finch_retrieve_user_info(purple_account_get_connection(account), remote_user); for (iter = GNT_BOX(widget)->list; iter; iter = iter->next) { if (GNT_IS_BUTTON(iter->data)) { gnt_widget_destroy(iter->data); diff -r f182cf94145c -r 00eaff9396ec finch/gntblist.c --- a/finch/gntblist.c Sun Jan 13 00:29:56 2008 +0000 +++ b/finch/gntblist.c Wed Feb 06 03:35:04 2008 +0000 @@ -27,7 +27,9 @@ #include #include +#include #include +#include #include #include #include @@ -43,6 +45,7 @@ #include "gntft.h" #include "gntlabel.h" #include "gntline.h" +#include "gntlog.h" #include "gntmenu.h" #include "gntmenuitem.h" #include "gntmenuitemcheck.h" @@ -81,8 +84,17 @@ /* These are the menuitems that get regenerated */ GntMenuItem *accounts; GntMenuItem *plugins; + GntMenuItem *grouping; + + FinchBlistManager *manager; } FinchBlist; +typedef struct +{ + gpointer row; /* the row in the GntTree */ + guint signed_timer; /* used when 'recently' signed on/off */ +} FinchBlistNode; + typedef enum { STATUS_PRIMITIVE = 0, @@ -109,7 +121,12 @@ static void add_chat(PurpleChat *chat, FinchBlist *ggblist); static void add_node(PurpleBlistNode *node, FinchBlist *ggblist); static void node_update(PurpleBuddyList *list, PurpleBlistNode *node); +#if 0 +static gboolean is_contact_online(PurpleContact *contact); +static gboolean is_group_online(PurpleGroup *group); +#endif static void draw_tooltip(FinchBlist *ggblist); +static void tooltip_for_buddy(PurpleBuddy *buddy, GString *str, gboolean full); static gboolean remove_typing_cb(gpointer null); static void remove_peripherals(FinchBlist *ggblist); static const char * get_display_name(PurpleBlistNode *node); @@ -119,6 +136,7 @@ static void update_buddy_display(PurpleBuddy *buddy, FinchBlist *ggblist); static void account_signed_on_cb(PurpleConnection *pc, gpointer null); static void finch_request_add_buddy(PurpleAccount *account, const char *username, const char *grp, const char *alias); +static void menu_group_set_cb(GntMenuItem *item, gpointer null); /* Sort functions */ static int blist_node_compare_position(PurpleBlistNode *n1, PurpleBlistNode *n2); @@ -131,6 +149,195 @@ static int color_offline; static int color_idle; +/** + * Buddy List Manager functions. + */ + +static gboolean default_can_add_node(PurpleBlistNode *node) +{ + gboolean offline = purple_prefs_get_bool(PREF_ROOT "/showoffline"); + + if (PURPLE_BLIST_NODE_IS_BUDDY(node)) { + PurpleBuddy *buddy = (PurpleBuddy*)node; + FinchBlistNode *fnode = FINCH_GET_DATA(node); + if (!purple_buddy_get_contact(buddy)) + return FALSE; /* When a new buddy is added and show-offline is set */ + if (PURPLE_BUDDY_IS_ONLINE(buddy)) + return TRUE; /* The buddy is online */ + if (!purple_account_is_connected(purple_buddy_get_account(buddy))) + return FALSE; /* The account is disconnected. Do not show */ + if (offline) + return TRUE; /* We want to see offline buddies too */ + if (fnode && fnode->signed_timer) + return TRUE; /* Show if the buddy just signed off */ + if (purple_blist_node_get_bool(node, "show_offline")) + return TRUE; + } else if (PURPLE_BLIST_NODE_IS_CONTACT(node)) { + PurpleBlistNode *nd; + for (nd = purple_blist_node_get_first_child(node); + nd; nd = purple_blist_node_get_sibling_next(nd)) { + if (default_can_add_node(nd)) + return TRUE; + } + } else if (PURPLE_BLIST_NODE_IS_CHAT(node)) { + PurpleChat *chat = (PurpleChat*)node; + if (purple_account_is_connected(purple_chat_get_account(chat))) + return TRUE; /* Show whenever the account is online */ + } else if (PURPLE_BLIST_NODE_IS_GROUP(node)) { + PurpleBlistNode *nd; + gboolean empty = purple_prefs_get_bool(PREF_ROOT "/emptygroups"); + if (empty) + return TRUE; /* If we want to see empty groups, we can show any group */ + + for (nd = purple_blist_node_get_first_child(node); + nd; nd = purple_blist_node_get_sibling_next(nd)) { + if (default_can_add_node(nd)) + return TRUE; + } + } + + return FALSE; +} + +static gpointer default_find_parent(PurpleBlistNode *node) +{ + gpointer ret = NULL; + switch (purple_blist_node_get_type(node)) { + case PURPLE_BLIST_BUDDY_NODE: + case PURPLE_BLIST_CONTACT_NODE: + case PURPLE_BLIST_CHAT_NODE: + ret = purple_blist_node_get_parent(node); + break; + default: + break; + } + if (ret) + add_node(ret, ggblist); + return ret; +} + +static gboolean default_create_tooltip(gpointer selected_row, GString **body, char **tool_title) +{ + GString *str; + PurpleBlistNode *node = selected_row; + int lastseen = 0; + char *title; + + if (!node || + purple_blist_node_get_type(node) == PURPLE_BLIST_OTHER_NODE) + return FALSE; + + str = g_string_new(""); + + if (PURPLE_BLIST_NODE_IS_CONTACT(node)) { + PurpleBuddy *pr = purple_contact_get_priority_buddy((PurpleContact*)node); + gboolean offline = !PURPLE_BUDDY_IS_ONLINE(pr); + gboolean showoffline = purple_prefs_get_bool(PREF_ROOT "/showoffline"); + const char *name = purple_buddy_get_name(pr); + + title = g_strdup(name); + tooltip_for_buddy(pr, str, TRUE); + for (node = purple_blist_node_get_first_child(node); node; node = purple_blist_node_get_sibling_next(node)) { + PurpleBuddy *buddy = (PurpleBuddy*)node; + if (offline) { + int value = purple_blist_node_get_int(node, "last_seen"); + if (value > lastseen) + lastseen = value; + } + if (node == (PurpleBlistNode*)pr) + continue; + if (!purple_account_is_connected(purple_buddy_get_account(buddy))) + continue; + if (!showoffline && !PURPLE_BUDDY_IS_ONLINE(buddy)) + continue; + str = g_string_append(str, "\n----------\n"); + tooltip_for_buddy(buddy, str, FALSE); + } + } else if (PURPLE_BLIST_NODE_IS_BUDDY(node)) { + PurpleBuddy *buddy = (PurpleBuddy *)node; + tooltip_for_buddy(buddy, str, TRUE); + title = g_strdup(purple_buddy_get_name(buddy)); + if (!PURPLE_BUDDY_IS_ONLINE((PurpleBuddy*)node)) + lastseen = purple_blist_node_get_int(node, "last_seen"); + } else if (PURPLE_BLIST_NODE_IS_GROUP(node)) { + PurpleGroup *group = (PurpleGroup *)node; + + g_string_append_printf(str, _("Online: %d\nTotal: %d"), + purple_blist_get_group_online_count(group), + purple_blist_get_group_size(group, FALSE)); + + title = g_strdup(purple_group_get_name(group)); + } else if (PURPLE_BLIST_NODE_IS_CHAT(node)) { + PurpleChat *chat = (PurpleChat *)node; + PurpleAccount *account = purple_chat_get_account(chat); + + g_string_append_printf(str, _("Account: %s (%s)"), + purple_account_get_username(account), + purple_account_get_protocol_name(account)); + + title = g_strdup(purple_chat_get_name(chat)); + } else { + g_string_free(str, TRUE); + return FALSE; + } + + if (lastseen > 0) { + char *tmp = purple_str_seconds_to_string(time(NULL) - lastseen); + g_string_append_printf(str, _("\nLast Seen: %s ago"), tmp); + g_free(tmp); + } + + if (tool_title) + *tool_title = title; + else + g_free(title); + + if (body) + *body = str; + else + g_string_free(str, TRUE); + + return TRUE; +} + +static FinchBlistManager default_manager = +{ + "default", + N_("Default"), + NULL, + NULL, + default_can_add_node, + default_find_parent, + default_create_tooltip, + {NULL, NULL, NULL, NULL} +}; +static GList *managers; + +static FinchBlistNode * +create_finch_blist_node(PurpleBlistNode *node, gpointer row) +{ + FinchBlistNode *fnode = FINCH_GET_DATA(node); + if (!fnode) { + fnode = g_new0(FinchBlistNode, 1); + fnode->signed_timer = 0; + FINCH_SET_DATA(node, fnode); + } + fnode->row = row; + return fnode; +} + +static void +reset_blist_node_ui_data(PurpleBlistNode *node) +{ + FinchBlistNode *fnode = FINCH_GET_DATA(node); + if (fnode == NULL) + return; + if (fnode->signed_timer) + purple_timeout_remove(fnode->signed_timer); + g_free(fnode); + FINCH_SET_DATA(node, NULL); +} + static int get_display_color(PurpleBlistNode *node) { @@ -157,12 +364,44 @@ return color; } +static GntTextFormatFlags +get_blist_node_flag(PurpleBlistNode *node) +{ + GntTextFormatFlags flag = 0; + FinchBlistNode *fnode = FINCH_GET_DATA(node); + + if (ggblist->tagged && g_list_find(ggblist->tagged, node)) + flag |= GNT_TEXT_FLAG_BOLD; + + if (fnode && fnode->signed_timer) + flag |= GNT_TEXT_FLAG_BLINK; + else if (PURPLE_BLIST_NODE_IS_CONTACT(node)) { + node = (PurpleBlistNode*)purple_contact_get_priority_buddy((PurpleContact *)node); + fnode = FINCH_GET_DATA(node); + if (fnode && fnode->signed_timer) + flag |= GNT_TEXT_FLAG_BLINK; + } + + return flag; +} + +static void +blist_update_row_flags(PurpleBlistNode *node) +{ + gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), node, get_blist_node_flag(node)); + gnt_tree_set_row_color(GNT_TREE(ggblist->tree), node, get_display_color(node)); +} + +#if 0 static gboolean is_contact_online(PurpleContact *contact) { PurpleBlistNode *node; - for (node = ((PurpleBlistNode*)contact)->child; node; node = node->next) { - if (PURPLE_BUDDY_IS_ONLINE((PurpleBuddy*)node)) + for (node = purple_blist_node_get_first_child(((PurpleBlistNode*)contact)); node; + node = purple_blist_node_get_sibling_next(node)) { + FinchBlistNode *fnode = FINCH_GET_DATA(node); + if (PURPLE_BUDDY_IS_ONLINE((PurpleBuddy*)node) || + (fnode && fnode->signed_timer)) return TRUE; } return FALSE; @@ -172,7 +411,8 @@ is_group_online(PurpleGroup *group) { PurpleBlistNode *node; - for (node = ((PurpleBlistNode*)group)->child; node; node = node->next) { + for (node = purple_blist_node_get_first_child(((PurpleBlistNode*)group)); node; + node = purple_blist_node_get_sibling_next(node)) { if (PURPLE_BLIST_NODE_IS_CHAT(node) && purple_account_is_connected(((PurpleChat *)node)->account)) return TRUE; @@ -181,14 +421,22 @@ } return FALSE; } +#endif static void new_node(PurpleBlistNode *node) { } -static void add_node(PurpleBlistNode *node, FinchBlist *ggblist) +static void +add_node(PurpleBlistNode *node, FinchBlist *ggblist) { + if (FINCH_GET_DATA(node)) + return; + + if (!ggblist->manager->can_add_node(node)) + return; + if (PURPLE_BLIST_NODE_IS_BUDDY(node)) add_buddy((PurpleBuddy*)node, ggblist); else if (PURPLE_BLIST_NODE_IS_CONTACT(node)) @@ -197,9 +445,15 @@ add_group((PurpleGroup*)node, ggblist); else if (PURPLE_BLIST_NODE_IS_CHAT(node)) add_chat((PurpleChat *)node, ggblist); + draw_tooltip(ggblist); } +void finch_blist_manager_add_node(PurpleBlistNode *node) +{ + add_node(node, ggblist); +} + static void remove_tooltip(FinchBlist *ggblist) { @@ -211,33 +465,27 @@ static void node_remove(PurpleBuddyList *list, PurpleBlistNode *node) { - FinchBlist *ggblist = list->ui_data; - - if (ggblist == NULL || node->ui_data == NULL) + FinchBlist *ggblist = FINCH_GET_DATA(list); + PurpleBlistNode *parent; + + if (ggblist == NULL || FINCH_GET_DATA(node)== NULL) return; gnt_tree_remove(GNT_TREE(ggblist->tree), node); - node->ui_data = NULL; + reset_blist_node_ui_data(node); if (ggblist->tagged) ggblist->tagged = g_list_remove(ggblist->tagged, node); - if (PURPLE_BLIST_NODE_IS_BUDDY(node)) { - PurpleContact *contact = (PurpleContact*)node->parent; - if ((!purple_prefs_get_bool(PREF_ROOT "/showoffline") && !is_contact_online(contact)) || - contact->currentsize < 1) - node_remove(list, (PurpleBlistNode*)contact); + parent = purple_blist_node_get_parent(node); + for (node = purple_blist_node_get_first_child(node); node; + node = purple_blist_node_get_sibling_next(node)) + node_remove(list, node); + + if (parent) { + if (!ggblist->manager->can_add_node(parent)) + node_remove(list, parent); else - node_update(list, (PurpleBlistNode*)contact); - } else if (!PURPLE_BLIST_NODE_IS_GROUP(node)) { - PurpleGroup *group = (PurpleGroup*)node->parent; - if ((group->currentsize < 1 && !purple_prefs_get_bool(PREF_ROOT "/emptygroups")) || - (!purple_prefs_get_bool(PREF_ROOT "/showoffline") && !is_group_online(group))) - node_remove(list, node->parent); - for (node = node->child; node; node = node->next) - node->ui_data = NULL; - } else { - for (node = node->child; node; node = node->next) - node_remove(list, node); + node_update(list, parent); } draw_tooltip(ggblist); @@ -251,50 +499,39 @@ happens, so maybe someone will figure it out. */ g_return_if_fail(node != NULL); - if (list->ui_data == NULL) + if (FINCH_GET_DATA(list)== NULL) return; /* XXX: this is probably the place to auto-join chats */ if (ggblist->window == NULL) return; - if (node->ui_data != NULL) { + if (FINCH_GET_DATA(node)!= NULL) { gnt_tree_change_text(GNT_TREE(ggblist->tree), node, 0, get_display_name(node)); gnt_tree_sort_row(GNT_TREE(ggblist->tree), node); - gnt_tree_set_row_color(GNT_TREE(ggblist->tree), node, get_display_color(node)); + blist_update_row_flags(node); + if (gnt_tree_get_parent_key(GNT_TREE(ggblist->tree), node) != + ggblist->manager->find_parent(node)) + node_remove(list, node); } if (PURPLE_BLIST_NODE_IS_BUDDY(node)) { PurpleBuddy *buddy = (PurpleBuddy*)node; - if (purple_account_is_connected(buddy->account) && - (PURPLE_BUDDY_IS_ONLINE(buddy) || purple_prefs_get_bool(PREF_ROOT "/showoffline"))) - add_node((PurpleBlistNode*)buddy, list->ui_data); - else - node_remove(purple_get_blist(), node); - - node_update(list, node->parent); + add_node((PurpleBlistNode*)buddy, FINCH_GET_DATA(list)); + node_update(list, purple_blist_node_get_parent(node)); } else if (PURPLE_BLIST_NODE_IS_CHAT(node)) { - add_chat((PurpleChat *)node, list->ui_data); + add_node(node, FINCH_GET_DATA(list)); } else if (PURPLE_BLIST_NODE_IS_CONTACT(node)) { - PurpleContact *contact = (PurpleContact*)node; - if ((!purple_prefs_get_bool(PREF_ROOT "/showoffline") && !is_contact_online(contact)) || - contact->currentsize < 1) - node_remove(purple_get_blist(), node); - else { - if (node->ui_data == NULL) { - /* The core seems to expect the UI to add the buddies. */ - for (node = node->child; node; node = node->next) - add_node(node, list->ui_data); - } + if (FINCH_GET_DATA(node)== NULL) { + /* The core seems to expect the UI to add the buddies. */ + for (node = purple_blist_node_get_first_child(node); node; node = purple_blist_node_get_sibling_next(node)) + add_node(node, FINCH_GET_DATA(list)); } } else if (PURPLE_BLIST_NODE_IS_GROUP(node)) { - PurpleGroup *group = (PurpleGroup*)node; - if (!purple_prefs_get_bool(PREF_ROOT "/emptygroups") && - ((!purple_prefs_get_bool(PREF_ROOT "/showoffline") && !is_group_online(group)) || - group->currentsize < 1)) + if (!ggblist->manager->can_add_node(node)) node_remove(list, node); else - add_node(node, list->ui_data); + add_node(node, FINCH_GET_DATA(list)); } } @@ -305,7 +542,10 @@ return; ggblist = g_new0(FinchBlist, 1); - list->ui_data = ggblist; + FINCH_SET_DATA(list, ggblist); + ggblist->manager = finch_blist_manager_find(purple_prefs_get_string(PREF_ROOT "/grouping")); + if (!ggblist->manager) + ggblist->manager = &default_manager; } static void @@ -342,6 +582,8 @@ purple_blist_add_group(grp, NULL); } + /* XXX: Ask if there's already the same buddy in the same group (#4553) */ + buddy = purple_buddy_new(account, username, alias); purple_blist_add_buddy(buddy, NULL, grp, NULL); purple_account_add_buddy(account, buddy); @@ -390,6 +632,7 @@ GHashTable *hash = NULL; PurpleConnection *gc; gboolean autojoin; + PurplePluginProtocolInfo *info; account = purple_request_fields_get_account(allfields, "account"); name = purple_request_fields_get_string(allfields, "name"); @@ -399,15 +642,15 @@ if (!purple_account_is_connected(account) || !name || !*name) return; - + if (!group || !*group) group = _("Chats"); gc = purple_account_get_connection(account); - - if (PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults != NULL) - hash = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults(gc, name); - + info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc)); + if (info->chat_info_defaults != NULL) + hash = info->chat_info_defaults(gc, name); + chat = purple_chat_new(account, name, hash); if (chat != NULL) { @@ -419,7 +662,7 @@ purple_blist_alias_chat(chat, alias); purple_blist_node_set_bool((PurpleBlistNode*)chat, "gnt-autojoin", autojoin); if (autojoin) - serv_join_chat(chat->account->gc, chat->components); + serv_join_chat(purple_account_get_connection(purple_chat_get_account(chat)), purple_chat_get_components(chat)); } } @@ -444,7 +687,7 @@ field = purple_request_field_string_new("alias", _("Alias"), alias, FALSE); purple_request_field_group_add_field(group, field); - field = purple_request_field_string_new("group", _("Group"), grp ? grp->name : NULL, FALSE); + field = purple_request_field_string_new("group", _("Group"), grp ? purple_group_get_name(grp) : NULL, FALSE); purple_request_field_group_add_field(group, field); field = purple_request_field_bool_new("autojoin", _("Auto-join"), FALSE); @@ -483,7 +726,7 @@ } static void -finch_request_add_group() +finch_request_add_group(void) { purple_request_input(NULL, _("Add Group"), NULL, _("Enter the name of the group"), NULL, FALSE, FALSE, NULL, @@ -511,7 +754,7 @@ }; static gpointer -finch_blist_get_handle() +finch_blist_get_handle(void) { static int handle; @@ -521,11 +764,14 @@ static void add_group(PurpleGroup *group, FinchBlist *ggblist) { + gpointer parent; PurpleBlistNode *node = (PurpleBlistNode *)group; - if (node->ui_data) + if (FINCH_GET_DATA(node)) return; - node->ui_data = gnt_tree_add_row_after(GNT_TREE(ggblist->tree), group, - gnt_tree_create_row(GNT_TREE(ggblist->tree), get_display_name(node)), NULL, NULL); + parent = ggblist->manager->find_parent((PurpleBlistNode*)group); + create_finch_blist_node(node, gnt_tree_add_row_after(GNT_TREE(ggblist->tree), group, + gnt_tree_create_row(GNT_TREE(ggblist->tree), get_display_name(node)), + parent, NULL)); gnt_tree_set_expanded(GNT_TREE(ggblist->tree), node, !purple_blist_node_get_bool(node, "collapsed")); } @@ -539,7 +785,7 @@ if (PURPLE_BLIST_NODE_IS_CONTACT(node)) node = (PurpleBlistNode*)purple_contact_get_priority_buddy((PurpleContact*)node); /* XXX: this can return NULL?! */ - + if (node == NULL) return NULL; @@ -550,7 +796,7 @@ PurplePresence *presence; PurpleStatus *now; gboolean ascii = gnt_ascii_only(); - + presence = purple_buddy_get_presence(buddy); if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_MOBILE)) strncpy(status, ascii ? ":" : "☎", sizeof(status) - 1); @@ -581,7 +827,7 @@ strncpy(status, "~", sizeof(status) - 1); } else if (PURPLE_BLIST_NODE_IS_GROUP(node)) - return ((PurpleGroup*)node)->name; + return purple_group_get_name((PurpleGroup*)node); snprintf(text, sizeof(text) - 1, "%s %s", status, name); @@ -591,41 +837,39 @@ static void add_chat(PurpleChat *chat, FinchBlist *ggblist) { - PurpleGroup *group; + gpointer parent; PurpleBlistNode *node = (PurpleBlistNode *)chat; - if (node->ui_data) + if (FINCH_GET_DATA(node)) return; - if (!purple_account_is_connected(chat->account)) + if (!purple_account_is_connected(purple_chat_get_account(chat))) return; - group = purple_chat_get_group(chat); - add_node((PurpleBlistNode*)group, ggblist); - - node->ui_data = gnt_tree_add_row_after(GNT_TREE(ggblist->tree), chat, + parent = ggblist->manager->find_parent((PurpleBlistNode*)chat); + + create_finch_blist_node(node, gnt_tree_add_row_after(GNT_TREE(ggblist->tree), chat, gnt_tree_create_row(GNT_TREE(ggblist->tree), get_display_name(node)), - group, NULL); + parent, NULL)); } static void add_contact(PurpleContact *contact, FinchBlist *ggblist) { - PurpleGroup *group; + gpointer parent; PurpleBlistNode *node = (PurpleBlistNode*)contact; const char *name; - if (node->ui_data) + if (FINCH_GET_DATA(node)) return; name = get_display_name(node); if (name == NULL) return; - group = (PurpleGroup*)node->parent; - add_node((PurpleBlistNode*)group, ggblist); - - node->ui_data = gnt_tree_add_row_after(GNT_TREE(ggblist->tree), contact, + parent = ggblist->manager->find_parent((PurpleBlistNode*)contact); + + create_finch_blist_node(node, gnt_tree_add_row_after(GNT_TREE(ggblist->tree), contact, gnt_tree_create_row(GNT_TREE(ggblist->tree), name), - group, NULL); + parent, NULL)); gnt_tree_set_expanded(GNT_TREE(ggblist->tree), contact, FALSE); } @@ -633,28 +877,23 @@ static void add_buddy(PurpleBuddy *buddy, FinchBlist *ggblist) { - PurpleContact *contact; + gpointer parent; PurpleBlistNode *node = (PurpleBlistNode *)buddy; - int color = 0; - if (node->ui_data) - return; - - if (!purple_account_is_connected(buddy->account)) + PurpleContact *contact; + + if (FINCH_GET_DATA(node)) return; - contact = (PurpleContact*)node->parent; - if (!contact) /* When a new buddy is added and show-offline is set */ - return; - add_node((PurpleBlistNode*)contact, ggblist); - - node->ui_data = gnt_tree_add_row_after(GNT_TREE(ggblist->tree), buddy, + contact = purple_buddy_get_contact(buddy); + parent = ggblist->manager->find_parent((PurpleBlistNode*)buddy); + + create_finch_blist_node(node, gnt_tree_add_row_after(GNT_TREE(ggblist->tree), buddy, gnt_tree_create_row(GNT_TREE(ggblist->tree), get_display_name(node)), - contact, NULL); - - color = get_display_color((PurpleBlistNode*)buddy); - gnt_tree_set_row_color(GNT_TREE(ggblist->tree), buddy, color); + parent, NULL)); + + blist_update_row_flags((PurpleBlistNode*)buddy); if (buddy == purple_contact_get_priority_buddy(contact)) - gnt_tree_set_row_color(GNT_TREE(ggblist->tree), contact, color); + blist_update_row_flags((PurpleBlistNode*)contact); } #if 0 @@ -700,7 +939,7 @@ purple_buddy_get_account(buddy), purple_buddy_get_name(buddy)); } else { - FinchConv *ggconv = conv->ui_data; + FinchConv *ggconv = FINCH_GET_DATA(conv); gnt_window_present(ggconv->window); } finch_conversation_set_active(conv); @@ -708,7 +947,7 @@ else if (PURPLE_BLIST_NODE_IS_CHAT(node)) { PurpleChat *chat = (PurpleChat*)node; - serv_join_chat(chat->account->gc, chat->components); + serv_join_chat(purple_account_get_connection(purple_chat_get_account(chat)), purple_chat_get_components(chat)); } } @@ -753,7 +992,7 @@ append_proto_menu(GntMenu *menu, PurpleConnection *gc, PurpleBlistNode *node) { GList *list; - PurplePluginProtocolInfo *prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); + PurplePluginProtocolInfo *prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc)); if(!prpl_info || !prpl_info->blist_node_menu) return; @@ -795,7 +1034,7 @@ else val = g_strdup(purple_request_field_string_get_value(field)); - g_hash_table_replace(chat->components, g_strdup(id), val); /* val should not be free'd */ + g_hash_table_replace(purple_chat_get_components(chat), g_strdup(id), val); /* val should not be free'd */ } } } @@ -808,22 +1047,24 @@ PurpleRequestField *field; GList *parts, *iter; struct proto_chat_entry *pce; + PurpleConnection *gc; purple_request_fields_add_group(fields, group); - parts = PURPLE_PLUGIN_PROTOCOL_INFO(chat->account->gc->prpl)->chat_info(chat->account->gc); + gc = purple_account_get_connection(purple_chat_get_account(chat)); + parts = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc))->chat_info(gc); for (iter = parts; iter; iter = iter->next) { pce = iter->data; if (pce->is_int) { int val; - const char *str = g_hash_table_lookup(chat->components, pce->identifier); + const char *str = g_hash_table_lookup(purple_chat_get_components(chat), pce->identifier); if (!str || sscanf(str, "%d", &val) != 1) val = pce->min; field = purple_request_field_int_new(pce->identifier, pce->label, val); } else { field = purple_request_field_string_new(pce->identifier, pce->label, - g_hash_table_lookup(chat->components, pce->identifier), FALSE); + g_hash_table_lookup(purple_chat_get_components(chat), pce->identifier), FALSE); } purple_request_field_group_add_field(group, field); @@ -864,7 +1105,7 @@ static void finch_add_buddy(PurpleBlistNode *selected, PurpleGroup *grp) { - purple_blist_request_add_buddy(NULL, NULL, grp ? grp->name : NULL, NULL); + purple_blist_request_add_buddy(NULL, NULL, grp ? purple_group_get_name(grp) : NULL, NULL); } static void @@ -905,13 +1146,13 @@ static void finch_blist_get_buddy_info_cb(PurpleBlistNode *selected, PurpleBuddy *buddy) { - finch_retrieve_user_info(buddy->account->gc, purple_buddy_get_name(buddy)); + finch_retrieve_user_info(purple_account_get_connection(purple_buddy_get_account(buddy)), purple_buddy_get_name(buddy)); } static void finch_blist_menu_send_file_cb(PurpleBlistNode *selected, PurpleBuddy *buddy) { - serv_send_file(buddy->account->gc, buddy->name, NULL); + serv_send_file(purple_account_get_connection(purple_buddy_get_account(buddy)), purple_buddy_get_name(buddy), NULL); } static void @@ -922,16 +1163,30 @@ b = purple_contact_get_priority_buddy((PurpleContact *)node); else b = (PurpleBuddy *)node; - finch_pounce_editor_show(b->account, b->name, NULL); + finch_pounce_editor_show(purple_buddy_get_account(b), purple_buddy_get_name(b), NULL); } +static void +toggle_block_buddy(GntMenuItem *item, gpointer buddy) +{ + gboolean block = gnt_menuitem_check_get_checked(GNT_MENU_ITEM_CHECK(item)); + PurpleAccount *account = purple_buddy_get_account(buddy); + const char *name = purple_buddy_get_name(buddy); + + block ? purple_privacy_deny(account, name, FALSE, FALSE) : + purple_privacy_allow(account, name, FALSE, FALSE); +} static void create_buddy_menu(GntMenu *menu, PurpleBuddy *buddy) { + PurpleAccount *account; + gboolean permitted; + GntMenuItem *item; PurplePluginProtocolInfo *prpl_info; - - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(buddy->account->gc->prpl); + PurpleConnection *gc = purple_account_get_connection(purple_buddy_get_account(buddy)); + + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc)); if (prpl_info && prpl_info->get_info) { add_custom_action(menu, _("Get Info"), @@ -944,10 +1199,19 @@ if (prpl_info && prpl_info->send_file) { if (!prpl_info->can_receive_file || - prpl_info->can_receive_file(buddy->account->gc, buddy->name)) + prpl_info->can_receive_file(gc, purple_buddy_get_name(buddy))) add_custom_action(menu, _("Send File"), PURPLE_CALLBACK(finch_blist_menu_send_file_cb), buddy); } + + account = purple_buddy_get_account(buddy); + permitted = purple_privacy_check(account, purple_buddy_get_name(buddy)); + + item = gnt_menuitem_check_new(_("Blocked")); + gnt_menuitem_check_set_checked(GNT_MENU_ITEM_CHECK(item), !permitted); + gnt_menuitem_set_callback(item, toggle_block_buddy, buddy); + gnt_menu_add_item(menu, item); + #if 0 add_custom_action(tree, _("View Log"), PURPLE_CALLBACK(finch_blist_view_log_cb)), buddy); @@ -979,11 +1243,12 @@ PurpleGroup *group; cnode = (PurpleBlistNode *)contact; - group = (PurpleGroup*)cnode->parent; - for (bnode = cnode->child; bnode; bnode = bnode->next) { + group = (PurpleGroup*)purple_blist_node_get_parent(cnode); + for (bnode = purple_blist_node_get_first_child(cnode); bnode; bnode = purple_blist_node_get_sibling_next(bnode)) { PurpleBuddy *buddy = (PurpleBuddy*)bnode; - if (purple_account_is_connected(buddy->account)) - purple_account_remove_buddy(buddy->account, buddy, group); + PurpleAccount *account = purple_buddy_get_account(buddy); + if (purple_account_is_connected(account)) + purple_account_remove_buddy(account, buddy, group); } purple_blist_remove_contact(contact); } @@ -1026,7 +1291,7 @@ else if (PURPLE_BLIST_NODE_IS_CHAT(node)) name = purple_chat_get_name((PurpleChat*)node); else if (PURPLE_BLIST_NODE_IS_GROUP(node)) - name = ((PurpleGroup*)node)->name; + name = purple_group_get_name((PurpleGroup*)node); else g_return_if_reached(); @@ -1042,38 +1307,77 @@ g_free(prompt); } + +static void showlog_cb(PurpleBlistNode *node) +{ + PurpleLogType type; + PurpleAccount *account; + char *name = NULL; + + if (PURPLE_BLIST_NODE_IS_BUDDY(node)) { + PurpleBuddy *b = (PurpleBuddy*) node; + type = PURPLE_LOG_IM; + name = g_strdup(b->name); + account = b->account; + } else if (PURPLE_BLIST_NODE_IS_CHAT(node)) { + PurpleChat *c = (PurpleChat*) node; + PurplePluginProtocolInfo *prpl_info = NULL; + type = PURPLE_LOG_CHAT; + account = c->account; + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_find_prpl(purple_account_get_protocol_id(account))); + if (prpl_info && prpl_info->get_chat_name) { + name = prpl_info->get_chat_name(c->components); + } + } else if (PURPLE_BLIST_NODE_IS_CONTACT(node)) { + finch_log_show_contact((PurpleContact *)node); + return; + } else { + /* This callback should not have been registered for a node + * that doesn't match the type of one of the blocks above. */ + g_return_if_reached(); + } + + if (name && account) { + finch_log_show(type, name, account); + g_free(name); + } +} + + /* Xeroxed from gtkdialogs.c:purple_gtkdialogs_remove_group_cb*/ static void remove_group(PurpleGroup *group) { PurpleBlistNode *cnode, *bnode; - cnode = ((PurpleBlistNode*)group)->child; + cnode = purple_blist_node_get_first_child(((PurpleBlistNode*)group)); while (cnode) { if (PURPLE_BLIST_NODE_IS_CONTACT(cnode)) { - bnode = cnode->child; - cnode = cnode->next; + bnode = purple_blist_node_get_first_child(cnode); + cnode = purple_blist_node_get_sibling_next(cnode); while (bnode) { PurpleBuddy *buddy; if (PURPLE_BLIST_NODE_IS_BUDDY(bnode)) { + PurpleAccount *account; buddy = (PurpleBuddy*)bnode; - bnode = bnode->next; - if (purple_account_is_connected(buddy->account)) { - purple_account_remove_buddy(buddy->account, buddy, group); + bnode = purple_blist_node_get_sibling_next(bnode); + account = purple_buddy_get_account(buddy); + if (purple_account_is_connected(account)) { + purple_account_remove_buddy(account, buddy, group); purple_blist_remove_buddy(buddy); } } else { - bnode = bnode->next; + bnode = purple_blist_node_get_sibling_next(bnode); } } } else if (PURPLE_BLIST_NODE_IS_CHAT(cnode)) { PurpleChat *chat = (PurpleChat *)cnode; - cnode = cnode->next; - if (purple_account_is_connected(chat->account)) + cnode = purple_blist_node_get_sibling_next(cnode); + if (purple_account_is_connected(purple_chat_get_account(chat))) purple_blist_remove_chat(chat); } else { - cnode = cnode->next; + cnode = purple_blist_node_get_sibling_next(cnode); } } @@ -1116,7 +1420,7 @@ } else if (PURPLE_BLIST_NODE_IS_CHAT(node)) { name = purple_chat_get_name((PurpleChat*)node); } else if (PURPLE_BLIST_NODE_IS_GROUP(node)) { - name = ((PurpleGroup*)node)->name; + name = purple_group_get_name((PurpleGroup*)node); sec = _("Removing this group will also remove all the buddies in the group"); } else @@ -1160,18 +1464,19 @@ PurpleGroup *tg = NULL; PurpleContact *tc = NULL; - if (target == NULL) + if (target == NULL || + purple_blist_node_get_type(target) == PURPLE_BLIST_OTHER_NODE) return; if (PURPLE_BLIST_NODE_IS_GROUP(target)) tg = (PurpleGroup*)target; else if (PURPLE_BLIST_NODE_IS_BUDDY(target)) { - tc = (PurpleContact*)target->parent; - tg = (PurpleGroup*)target->parent->parent; + tc = (PurpleContact*)purple_blist_node_get_parent(target); + tg = (PurpleGroup*)purple_blist_node_get_parent((PurpleBlistNode*)tc); } else { if (PURPLE_BLIST_NODE_IS_CONTACT(target)) tc = (PurpleContact*)target; - tg = (PurpleGroup*)target->parent; + tg = (PurpleGroup*)purple_blist_node_get_parent(target); } if (ggblist->tagged) { @@ -1244,6 +1549,8 @@ tree = GNT_TREE(ggblist->tree); node = gnt_tree_get_selection_data(tree); + if (node && purple_blist_node_get_type(node) == PURPLE_BLIST_OTHER_NODE) + return; if (ggblist->tooltip) remove_tooltip(ggblist); @@ -1272,7 +1579,7 @@ } else if (PURPLE_BLIST_NODE_IS_GROUP(node)) { PurpleGroup *group = (PurpleGroup *)node; create_group_menu(GNT_MENU(context), group); - title = g_strdup(group->name); + title = g_strdup(purple_group_get_name(group)); } append_extended_menu(GNT_MENU(context), node); @@ -1295,6 +1602,10 @@ add_custom_action(GNT_MENU(context), _("Toggle Tag"), PURPLE_CALLBACK(finch_blist_toggle_tag_buddy), node); } + if (!PURPLE_BLIST_NODE_IS_GROUP(node)) { + add_custom_action(GNT_MENU(context), _("View Log"), + PURPLE_CALLBACK(showlog_cb), node); + } } /* Set the position for the popup */ @@ -1337,7 +1648,7 @@ purple_account_get_protocol_name(account)); purple_notify_user_info_add_pair(user_info, _("Account"), tmp); g_free(tmp); - + prpl = purple_find_prpl(purple_account_get_protocol_id(account)); prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); if (prpl_info && prpl_info->tooltip_text) { @@ -1386,16 +1697,15 @@ { PurpleBlistNode *node; int x, y, top, width, w, h; - GString *str; + GString *str = NULL; GntTree *tree; GntWidget *widget, *box, *tv; char *title = NULL; - int lastseen = 0; widget = ggblist->tree; tree = GNT_TREE(widget); - if (!gnt_widget_has_focus(ggblist->tree) || + if (!gnt_widget_has_focus(ggblist->tree) || (ggblist->context && !GNT_WIDGET_IS_FLAG_SET(ggblist->context, GNT_WIDGET_INVISIBLE))) return FALSE; @@ -1410,65 +1720,8 @@ if (!node) return FALSE; - str = g_string_new(""); - - if (PURPLE_BLIST_NODE_IS_CONTACT(node)) { - PurpleBuddy *pr = purple_contact_get_priority_buddy((PurpleContact*)node); - gboolean offline = !PURPLE_BUDDY_IS_ONLINE(pr); - gboolean showoffline = purple_prefs_get_bool(PREF_ROOT "/showoffline"); - const char *name = purple_buddy_get_name(pr); - - title = g_strdup(name); - tooltip_for_buddy(pr, str, TRUE); - for (node = node->child; node; node = node->next) { - PurpleBuddy *buddy = (PurpleBuddy*)node; - if (offline) { - int value = purple_blist_node_get_int(node, "last_seen"); - if (value > lastseen) - lastseen = value; - } - if (node == (PurpleBlistNode*)pr) - continue; - if (!purple_account_is_connected(buddy->account)) - continue; - if (!showoffline && !PURPLE_BUDDY_IS_ONLINE(buddy)) - continue; - str = g_string_append(str, "\n----------\n"); - tooltip_for_buddy(buddy, str, FALSE); - } - } else if (PURPLE_BLIST_NODE_IS_BUDDY(node)) { - PurpleBuddy *buddy = (PurpleBuddy *)node; - tooltip_for_buddy(buddy, str, TRUE); - title = g_strdup(purple_buddy_get_name(buddy)); - if (!PURPLE_BUDDY_IS_ONLINE((PurpleBuddy*)node)) - lastseen = purple_blist_node_get_int(node, "last_seen"); - } else if (PURPLE_BLIST_NODE_IS_GROUP(node)) { - PurpleGroup *group = (PurpleGroup *)node; - - g_string_append_printf(str, _("Online: %d\nTotal: %d"), - purple_blist_get_group_online_count(group), - purple_blist_get_group_size(group, FALSE)); - - title = g_strdup(group->name); - } else if (PURPLE_BLIST_NODE_IS_CHAT(node)) { - PurpleChat *chat = (PurpleChat *)node; - PurpleAccount *account = chat->account; - - g_string_append_printf(str, _("Account: %s (%s)"), - purple_account_get_username(account), - purple_account_get_protocol_name(account)); - - title = g_strdup(purple_chat_get_name(chat)); - } else { - g_string_free(str, TRUE); + if (!ggblist->manager->create_tooltip(node, &str, &title)) return FALSE; - } - - if (lastseen > 0) { - char *tmp = purple_str_seconds_to_string(time(NULL) - lastseen); - g_string_append_printf(str, _("\nLast Seen: %s ago"), tmp); - g_free(tmp); - } gnt_widget_get_position(widget, &x, &y); gnt_widget_get_size(widget, &width, NULL); @@ -1564,9 +1817,7 @@ static void update_node_display(PurpleBlistNode *node, FinchBlist *ggblist) { - GntTextFormatFlags flag = 0; - if (ggblist->tagged && g_list_find(ggblist->tagged, node)) - flag |= GNT_TEXT_FLAG_BOLD; + GntTextFormatFlags flag = get_blist_node_flag(node); gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), node, flag); } @@ -1574,33 +1825,18 @@ update_buddy_display(PurpleBuddy *buddy, FinchBlist *ggblist) { PurpleContact *contact; - GntTextFormatFlags bflag = 0, cflag = 0; - int color = 0; contact = purple_buddy_get_contact(buddy); gnt_tree_change_text(GNT_TREE(ggblist->tree), buddy, 0, get_display_name((PurpleBlistNode*)buddy)); gnt_tree_change_text(GNT_TREE(ggblist->tree), contact, 0, get_display_name((PurpleBlistNode*)contact)); - if (ggblist->tagged && g_list_find(ggblist->tagged, buddy)) - bflag |= GNT_TEXT_FLAG_BOLD; - if (ggblist->tagged && g_list_find(ggblist->tagged, contact)) - cflag |= GNT_TEXT_FLAG_BOLD; + blist_update_row_flags((PurpleBlistNode *)buddy); + if (buddy == purple_contact_get_priority_buddy(contact)) + blist_update_row_flags((PurpleBlistNode *)contact); if (ggblist->tnode == (PurpleBlistNode*)buddy) draw_tooltip(ggblist); - - color = get_display_color((PurpleBlistNode*)buddy); - gnt_tree_set_row_color(GNT_TREE(ggblist->tree), buddy, color); - if (buddy == purple_contact_get_priority_buddy(contact)) - gnt_tree_set_row_color(GNT_TREE(ggblist->tree), contact, color); - - gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), buddy, bflag); - if (buddy == purple_contact_get_priority_buddy(contact)) - gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), contact, cflag); - - if (buddy != purple_contact_get_priority_buddy(contact)) - update_buddy_display(purple_contact_get_priority_buddy(contact), ggblist); } static void @@ -1645,11 +1881,11 @@ { PurpleBlistNode *node; purple_signals_disconnect_by_handle(finch_blist_get_handle()); - purple_get_blist()->ui_data = NULL; + FINCH_SET_DATA(purple_get_blist(), NULL); node = purple_blist_get_root(); while (node) { - node->ui_data = NULL; + reset_blist_node_ui_data(node); node = purple_blist_node_next(node, TRUE); } @@ -1663,11 +1899,14 @@ } static void -populate_buddylist() +populate_buddylist(void) { PurpleBlistNode *node; PurpleBuddyList *list; + if (ggblist->manager->init) + ggblist->manager->init(); + if (strcmp(purple_prefs_get_string(PREF_ROOT "/sort_type"), "text") == 0) { gnt_tree_set_compare_func(GNT_TREE(ggblist->tree), (GCompareFunc)blist_node_compare_text); @@ -1696,7 +1935,7 @@ } static void -populate_status_dropdown() +populate_status_dropdown(void) { int i; GList *iter; @@ -1755,14 +1994,36 @@ redraw_blist(const char *name, PurplePrefType type, gconstpointer val, gpointer data) { PurpleBlistNode *node, *sel; - if (ggblist == NULL || ggblist->window == NULL) + FinchBlistManager *manager; + + if (ggblist == NULL) + return; + + manager = finch_blist_manager_find(purple_prefs_get_string(PREF_ROOT "/grouping")); + if (manager == NULL) + manager = &default_manager; + if (ggblist->manager != manager) { + if (ggblist->manager->uninit) + ggblist->manager->uninit(); + + ggblist->manager = manager; + if (manager->can_add_node == NULL) + manager->can_add_node = default_can_add_node; + if (manager->find_parent == NULL) + manager->find_parent = default_find_parent; + if (manager->create_tooltip == NULL) + manager->create_tooltip = default_create_tooltip; + } + + if (ggblist->window == NULL) return; sel = gnt_tree_get_selection_data(GNT_TREE(ggblist->tree)); gnt_tree_remove_all(GNT_TREE(ggblist->tree)); + node = purple_blist_get_root(); for (; node; node = purple_blist_node_next(node, TRUE)) - node->ui_data = NULL; + reset_blist_node_ui_data(node); populate_buddylist(); gnt_tree_set_selected(GNT_TREE(ggblist->tree), sel); draw_tooltip(ggblist); @@ -1794,6 +2055,7 @@ purple_prefs_add_bool(PREF_ROOT "/showoffline", FALSE); purple_prefs_add_bool(PREF_ROOT "/emptygroups", FALSE); purple_prefs_add_string(PREF_ROOT "/sort_type", "text"); + purple_prefs_add_string(PREF_ROOT "/grouping", "default"); purple_prefs_connect_callback(finch_blist_get_handle(), PREF_ROOT "/emptygroups", redraw_blist, NULL); @@ -1801,9 +2063,14 @@ PREF_ROOT "/showoffline", redraw_blist, NULL); purple_prefs_connect_callback(finch_blist_get_handle(), PREF_ROOT "/sort_type", redraw_blist, NULL); + purple_prefs_connect_callback(finch_blist_get_handle(), + PREF_ROOT "/grouping", redraw_blist, NULL); purple_signal_connect(purple_connections_get_handle(), "signed-on", purple_blist_get_handle(), G_CALLBACK(account_signed_on_cb), NULL); + + finch_blist_install_manager(&default_manager); + return; } @@ -1964,7 +2231,7 @@ static int blist_node_compare_position(PurpleBlistNode *n1, PurpleBlistNode *n2) { - while ((n1 = n1->prev) != NULL) + while ((n1 = purple_blist_node_get_sibling_prev(n1)) != NULL) if (n1 == n2) return 1; return -1; @@ -1977,10 +2244,10 @@ char *us1, *us2; int ret; - if (n1->type != n2->type) + if (purple_blist_node_get_type(n1) != purple_blist_node_get_type(n2)) return blist_node_compare_position(n1, n2); - switch (n1->type) + switch (purple_blist_node_get_type(n1)) { case PURPLE_BLIST_CHAT_NODE: s1 = purple_chat_get_name((PurpleChat*)n1); @@ -2012,10 +2279,10 @@ { int ret; - if (n1->type != n2->type) + if (purple_blist_node_get_type(n1) != purple_blist_node_get_type(n2)) return blist_node_compare_position(n1, n2); - switch (n1->type) { + switch (purple_blist_node_get_type(n1)) { case PURPLE_BLIST_CONTACT_NODE: n1 = (PurpleBlistNode*)purple_contact_get_priority_buddy((PurpleContact*)n1); n2 = (PurpleBlistNode*)purple_contact_get_priority_buddy((PurpleContact*)n2); @@ -2043,9 +2310,10 @@ int log = 0; PurpleBlistNode *node; - for (node = c->child; node; node = node->next) { + for (node = purple_blist_node_get_first_child(c); node; node = purple_blist_node_get_sibling_next(node)) { PurpleBuddy *b = (PurpleBuddy*)node; - log += purple_log_get_total_size(PURPLE_LOG_IM, b->name, b->account); + log += purple_log_get_total_size(PURPLE_LOG_IM, purple_buddy_get_name(b), + purple_buddy_get_account(b)); } return log; @@ -2057,15 +2325,15 @@ int ret; PurpleBuddy *b1, *b2; - if (n1->type != n2->type) + if (purple_blist_node_get_type(n1) != purple_blist_node_get_type(n2)) return blist_node_compare_position(n1, n2); - switch (n1->type) { + switch (purple_blist_node_get_type(n1)) { case PURPLE_BLIST_BUDDY_NODE: b1 = (PurpleBuddy*)n1; b2 = (PurpleBuddy*)n2; - ret = purple_log_get_total_size(PURPLE_LOG_IM, b2->name, b2->account) - - purple_log_get_total_size(PURPLE_LOG_IM, b1->name, b1->account); + ret = purple_log_get_total_size(PURPLE_LOG_IM, purple_buddy_get_name(b2), purple_buddy_get_account(b2)) - + purple_log_get_total_size(PURPLE_LOG_IM, purple_buddy_get_name(b1), purple_buddy_get_account(b1)); if (ret != 0) return ret; break; @@ -2122,8 +2390,51 @@ } } +static gboolean +buddy_recent_signed_on_off(gpointer data) +{ + PurpleBlistNode *node = data; + FinchBlistNode *fnode = FINCH_GET_DATA(node); + + purple_timeout_remove(fnode->signed_timer); + fnode->signed_timer = 0; + + if (!ggblist->manager->can_add_node(node)) { + node_remove(purple_get_blist(), node); + } else { + update_node_display(node, ggblist); + if (purple_blist_node_get_parent(node) && PURPLE_BLIST_NODE_IS_CONTACT(purple_blist_node_get_parent(node))) + update_node_display(purple_blist_node_get_parent(node), ggblist); + } + + return FALSE; +} + +static gboolean +buddy_signed_on_off_cb(gpointer data) +{ + PurpleBlistNode *node = data; + FinchBlistNode *fnode = FINCH_GET_DATA(node); + if (!ggblist || !fnode) + return FALSE; + + if (fnode->signed_timer) + purple_timeout_remove(fnode->signed_timer); + fnode->signed_timer = purple_timeout_add_seconds(6, (GSourceFunc)buddy_recent_signed_on_off, data); + update_node_display(node, ggblist); + if (purple_blist_node_get_parent(node) && PURPLE_BLIST_NODE_IS_CONTACT(purple_blist_node_get_parent(node))) + update_node_display(purple_blist_node_get_parent(node), ggblist); + return FALSE; +} + static void -reconstruct_plugins_menu() +buddy_signed_on_off(PurpleBuddy* buddy, gpointer null) +{ + g_idle_add(buddy_signed_on_off_cb, buddy); +} + +static void +reconstruct_plugins_menu(void) { GntWidget *sub; GntMenuItem *plg; @@ -2155,7 +2466,7 @@ } static void -reconstruct_accounts_menu() +reconstruct_accounts_menu(void) { GntWidget *sub; GntMenuItem *acc, *item; @@ -2176,10 +2487,10 @@ PurpleAccount *account = iter->data; PurpleConnection *gc = purple_account_get_connection(account); PurplePlugin *prpl; - + if (!gc || !PURPLE_CONNECTION_IS_CONNECTED(gc)) continue; - prpl = gc->prpl; + prpl = purple_connection_get_prpl(gc); if (PURPLE_PLUGIN_HAS_ACTIONS(prpl)) { item = gnt_menuitem_new(purple_account_get_username(account)); @@ -2189,6 +2500,30 @@ } } +static void +reconstruct_grouping_menu(void) +{ + GList *iter; + GntWidget *subsub; + + if (!ggblist || !ggblist->grouping) + return; + + subsub = gnt_menu_new(GNT_MENU_POPUP); + gnt_menuitem_set_submenu(ggblist->grouping, GNT_MENU(subsub)); + + for (iter = managers; iter; iter = iter->next) { + char menuid[128]; + FinchBlistManager *manager = iter->data; + GntMenuItem *item = gnt_menuitem_new(_(manager->name)); + snprintf(menuid, sizeof(menuid), "grouping-%s", manager->id); + gnt_menuitem_set_id(GNT_MENU_ITEM(item), menuid); + gnt_menu_add_item(GNT_MENU(subsub), item); + g_object_set_data_full(G_OBJECT(item), "grouping-id", g_strdup(manager->id), g_free); + gnt_menuitem_set_callback(item, menu_group_set_cb, NULL); + } +} + static gboolean auto_join_chats(gpointer data) { @@ -2200,9 +2535,9 @@ node = purple_blist_node_next(node, FALSE)) { if (PURPLE_BLIST_NODE_IS_CHAT(node)) { PurpleChat *chat = (PurpleChat*)node; - if (chat->account == account && + if (purple_chat_get_account(chat) == account && purple_blist_node_get_bool(node, "gnt-autojoin")) - serv_join_chat(purple_account_get_connection(chat->account), chat->components); + serv_join_chat(purple_account_get_connection(account), purple_chat_get_components(chat)); } } return FALSE; @@ -2224,6 +2559,61 @@ purple_prefs_set_string(PREF_ROOT "/sort_type", n); } +static void +block_select_cb(gpointer data, PurpleRequestFields *fields) +{ + PurpleAccount *account = purple_request_fields_get_account(fields, "account"); + const char *name = purple_request_fields_get_string(fields, "screenname"); + if (account && name && *name != '\0') { + if (purple_request_fields_get_choice(fields, "block") == 1) { + purple_privacy_deny(account, name, FALSE, FALSE); + } else { + purple_privacy_allow(account, name, FALSE, FALSE); + } + } +} + +static void +block_select(GntMenuItem *item, gpointer n) +{ + PurpleRequestFields *fields; + PurpleRequestFieldGroup *group; + PurpleRequestField *field; + + fields = purple_request_fields_new(); + + group = purple_request_field_group_new(NULL); + purple_request_fields_add_group(fields, group); + + field = purple_request_field_string_new("screenname", _("Name"), NULL, FALSE); + purple_request_field_set_type_hint(field, "screenname"); + purple_request_field_set_required(field, TRUE); + purple_request_field_group_add_field(group, field); + + field = purple_request_field_account_new("account", _("Account"), NULL); + purple_request_field_set_type_hint(field, "account"); + purple_request_field_set_visible(field, + (purple_connections_get_all() != NULL && + purple_connections_get_all()->next != NULL)); + purple_request_field_set_required(field, TRUE); + purple_request_field_group_add_field(group, field); + + field = purple_request_field_choice_new("block", _("Block/Unblock"), 1); + purple_request_field_choice_add(field, _("Block")); + purple_request_field_choice_add(field, _("Unblock")); + purple_request_field_group_add_field(group, field); + + purple_request_fields(purple_get_blist(), _("Block/Unblock"), + NULL, + _("Please enter the screen name or alias of the person " + "you would like to Block/Unblock."), + fields, + _("OK"), G_CALLBACK(block_select_cb), + _("Cancel"), NULL, + NULL, NULL, NULL, + NULL); +} + /* send_im_select* -- Xerox */ static void send_im_select_cb(gpointer data, PurpleRequestFields *fields) @@ -2288,14 +2678,15 @@ if (!purple_account_is_connected(account)) return; - gc = purple_account_get_connection(account); + gc = purple_account_get_connection(account); purple_conversation_new(PURPLE_CONV_TYPE_CHAT, account, name); chat = purple_blist_find_chat(account, name); if (chat == NULL) { - if (PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults != NULL) - hash = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults(gc, name); + PurplePluginProtocolInfo *info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc)); + if (info->chat_info_defaults != NULL) + hash = info->chat_info_defaults(gc, name); } else { - hash = chat->components; + hash = purple_chat_get_components(chat); } serv_join_chat(gc, hash); if (chat == NULL && hash != NULL) @@ -2355,7 +2746,14 @@ } static void -create_menu() +menu_group_set_cb(GntMenuItem *item, gpointer null) +{ + const char *id = g_object_get_data(G_OBJECT(item), "grouping-id"); + purple_prefs_set_string(PREF_ROOT "/grouping", id); +} + +static void +create_menu(void) { GntWidget *menu, *sub, *subsub; GntMenuItem *item; @@ -2379,6 +2777,11 @@ gnt_menu_add_item(GNT_MENU(sub), item); gnt_menuitem_set_callback(GNT_MENU_ITEM(item), send_im_select, NULL); + item = gnt_menuitem_new(_("Block/Unblock...")); + gnt_menuitem_set_id(GNT_MENU_ITEM(item), "block-unblock"); + gnt_menu_add_item(GNT_MENU(sub), item); + gnt_menuitem_set_callback(GNT_MENU_ITEM(item), block_select, NULL); + item = gnt_menuitem_new(_("Join Chat...")); gnt_menuitem_set_id(GNT_MENU_ITEM(item), "join-chat"); gnt_menu_add_item(GNT_MENU(sub), item); @@ -2395,7 +2798,7 @@ purple_prefs_get_bool(PREF_ROOT "/emptygroups")); gnt_menu_add_item(GNT_MENU(subsub), item); gnt_menuitem_set_callback(GNT_MENU_ITEM(item), toggle_pref_cb, PREF_ROOT "/emptygroups"); - + item = gnt_menuitem_check_new(_("Offline buddies")); gnt_menuitem_set_id(GNT_MENU_ITEM(item), "show-offline-buddies"); gnt_menuitem_check_set_checked(GNT_MENU_ITEM_CHECK(item), @@ -2429,21 +2832,25 @@ subsub = gnt_menu_new(GNT_MENU_POPUP); gnt_menuitem_set_submenu(item, GNT_MENU(subsub)); - item = gnt_menuitem_new("Buddy"); + item = gnt_menuitem_new(_("Buddy")); gnt_menuitem_set_id(GNT_MENU_ITEM(item), "add-buddy"); gnt_menu_add_item(GNT_MENU(subsub), item); gnt_menuitem_set_callback(item, menu_add_buddy_cb, NULL); - item = gnt_menuitem_new("Chat"); + item = gnt_menuitem_new(_("Chat")); gnt_menuitem_set_id(GNT_MENU_ITEM(item), "add-chat"); gnt_menu_add_item(GNT_MENU(subsub), item); gnt_menuitem_set_callback(item, menu_add_chat_cb, NULL); - item = gnt_menuitem_new("Group"); + item = gnt_menuitem_new(_("Group")); gnt_menuitem_set_id(GNT_MENU_ITEM(item), "add-group"); gnt_menu_add_item(GNT_MENU(subsub), item); gnt_menuitem_set_callback(item, menu_add_group_cb, NULL); + ggblist->grouping = item = gnt_menuitem_new(_("Grouping")); + gnt_menu_add_item(GNT_MENU(sub), item); + reconstruct_grouping_menu(); + reconstruct_accounts_menu(); gnt_menu_add_item(GNT_MENU(menu), ggblist->accounts); @@ -2513,12 +2920,12 @@ purple_signal_connect(purple_plugins_get_handle(), "plugin-unload", finch_blist_get_handle(), PURPLE_CALLBACK(reconstruct_plugins_menu), NULL); + purple_signal_connect(purple_blist_get_handle(), "buddy-signed-on", finch_blist_get_handle(), + PURPLE_CALLBACK(buddy_signed_on_off), ggblist); + purple_signal_connect(purple_blist_get_handle(), "buddy-signed-off", finch_blist_get_handle(), + PURPLE_CALLBACK(buddy_signed_on_off), ggblist); + #if 0 - purple_signal_connect(purple_blist_get_handle(), "buddy-signed-on", finch_blist_get_handle(), - PURPLE_CALLBACK(buddy_signed_on), ggblist); - purple_signal_connect(purple_blist_get_handle(), "buddy-signed-off", finch_blist_get_handle(), - PURPLE_CALLBACK(buddy_signed_off), ggblist); - /* These I plan to use to indicate unread-messages etc. */ purple_signal_connect(purple_conversations_get_handle(), "received-im-msg", finch_blist_get_handle(), PURPLE_CALLBACK(received_im_msg), list); @@ -2595,3 +3002,43 @@ { gnt_widget_set_size(ggblist->window, width, height); } + +void finch_blist_install_manager(const FinchBlistManager *manager) +{ + if (!g_list_find(managers, manager)) { + managers = g_list_append(managers, (gpointer)manager); + reconstruct_grouping_menu(); + if (strcmp(manager->id, purple_prefs_get_string(PREF_ROOT "/grouping")) == 0) + purple_prefs_trigger_callback(PREF_ROOT "/grouping"); + } +} + +void finch_blist_uninstall_manager(const FinchBlistManager *manager) +{ + if (g_list_find(managers, manager)) { + managers = g_list_remove(managers, manager); + reconstruct_grouping_menu(); + if (strcmp(manager->id, purple_prefs_get_string(PREF_ROOT "/grouping")) == 0) + purple_prefs_trigger_callback(PREF_ROOT "/grouping"); + } +} + +FinchBlistManager * finch_blist_manager_find(const char *id) +{ + GList *iter = managers; + if (!id) + return NULL; + + for (; iter; iter = iter->next) { + FinchBlistManager *m = iter->data; + if (strcmp(id, m->id) == 0) + return m; + } + return NULL; +} + +GntTree * finch_blist_get_tree(void) +{ + return ggblist ? GNT_TREE(ggblist->tree) : NULL; +} + diff -r f182cf94145c -r 00eaff9396ec finch/gntblist.h --- a/finch/gntblist.h Sun Jan 13 00:29:56 2008 +0000 +++ b/finch/gntblist.h Wed Feb 06 03:35:04 2008 +0000 @@ -27,12 +27,25 @@ #define _GNT_BLIST_H #include "blist.h" +#include "gnttree.h" /********************************************************************** * @name GNT BuddyList API **********************************************************************/ /*@{*/ +typedef struct +{ + const char *id; /**< An identifier for the manager. */ + const char *name; /**< Displayable name for the manager. */ + gboolean (*init)(void); /**< Called right before it's being used. */ + gboolean (*uninit)(void); /**< Called right after it's not being used any more. */ + gboolean (*can_add_node)(PurpleBlistNode *node); /**< Whether a node should be added to the view. */ + gpointer (*find_parent)(PurpleBlistNode *node); /**< Find the parent row for a node. */ + gboolean (*create_tooltip)(gpointer selected_row, GString **body, char **title); /**< Create tooltip for a selected row. */ + gpointer reserved[4]; +} FinchBlistManager; + /** * Get the ui-functions. * @@ -103,6 +116,47 @@ */ gpointer finch_retrieve_user_info(PurpleConnection *conn, const char *name); +/** + * Get the tree list of the buddy list. + * @return The GntTree widget. + * @since 2.4.0 + */ +GntTree * finch_blist_get_tree(void); + +/** + * Add an alternate buddy list manager. + * + * @param manager The alternate buddylist manager. + * @since 2.4.0 + */ +void finch_blist_install_manager(const FinchBlistManager *manager); + +/** + * Remove an alternate buddy list manager. + * + * @param manager The buddy list manager to remove. + * @since 2.4.0 + */ +void finch_blist_uninstall_manager(const FinchBlistManager *manager); + +/** + * Find a buddy list manager. + * + * @param id The identifier for the desired buddy list manager. + * + * @return The manager with the requested identifier, if available. @c NULL otherwise. + * @since 2.4.0 + */ +FinchBlistManager * finch_blist_manager_find(const char *id); + +/** + * Request the active buddy list manager to add a node. + * + * @param node The node to add + * @since 2.4.0 + */ +void finch_blist_manager_add_node(PurpleBlistNode *node); + /*@}*/ #endif diff -r f182cf94145c -r 00eaff9396ec finch/gntcertmgr.c --- a/finch/gntcertmgr.c Sun Jan 13 00:29:56 2008 +0000 +++ b/finch/gntcertmgr.c Wed Feb 06 03:35:04 2008 +0000 @@ -25,14 +25,13 @@ * */ -#include "internal.h" +#include "finch.h" #include "certificate.h" #include "debug.h" #include "notify.h" #include "request.h" -#include "finch.h" #include "gntcertmgr.h" #include "gntbutton.h" @@ -235,7 +234,7 @@ purple_request_close_with_handle((void *)key); purple_request_yes_no((void *)key, _("Confirm certificate delete"), primary, NULL, - 2, + 0, NULL, NULL, NULL, g_strdup(key), tls_peers_mgmt_delete_confirm_cb, @@ -246,7 +245,7 @@ /* populate the list */ static void -populate_cert_list() +populate_cert_list(void) { GList *idlist, *l; diff -r f182cf94145c -r 00eaff9396ec finch/gntconn.c --- a/finch/gntconn.c Sun Jan 13 00:29:56 2008 +0000 +++ b/finch/gntconn.c Wed Feb 06 03:35:04 2008 +0000 @@ -101,13 +101,14 @@ } static void -finch_connection_report_disconnect(PurpleConnection *gc, const char *text) +finch_connection_report_disconnect(PurpleConnection *gc, PurpleConnectionError reason, + const char *text) { FinchAutoRecon *info; PurpleAccount *account = purple_connection_get_account(gc); GList *list; - if (!gc->wants_to_die) { + if (!purple_connection_error_is_fatal(reason)) { info = g_hash_table_lookup(hash, account); if (info == NULL) { @@ -148,7 +149,7 @@ while (list) { PurpleConversation *conv = list->data; list = list->next; - if (conv->account != account || + if (purple_conversation_get_account(conv) != account || purple_conv_chat_has_left(PURPLE_CONV_CHAT(conv))) continue; purple_conversation_set_data(conv, "want-to-rejoin", GINT_TO_POINTER(TRUE)); @@ -179,10 +180,10 @@ NULL, /* connected */ NULL, /* disconnected */ NULL, /* notice */ - finch_connection_report_disconnect, + NULL, NULL, /* network_connected */ NULL, /* network_disconnected */ - NULL, + finch_connection_report_disconnect, NULL, NULL, NULL diff -r f182cf94145c -r 00eaff9396ec finch/gntconv.c --- a/finch/gntconv.c Sun Jan 13 00:29:56 2008 +0000 +++ b/finch/gntconv.c Wed Feb 06 03:35:04 2008 +0000 @@ -36,6 +36,7 @@ #include "gntblist.h" #include "gntconv.h" #include "gntdebug.h" +#include "gntlog.h" #include "gntplugin.h" #include "gntprefs.h" #include "gntsound.h" @@ -71,6 +72,20 @@ static int color_message_action; static int color_timestamp; +static PurpleBuddy * +find_buddy_for_conversation(PurpleConversation *conv) +{ + return purple_find_buddy(purple_conversation_get_account(conv), + purple_conversation_get_name(conv)); +} + +static PurpleChat * +find_chat_for_conversation(PurpleConversation *conv) +{ + return purple_blist_find_chat(purple_conversation_get_account(conv), + purple_conversation_get_name(conv)); +} + static PurpleBlistNode * get_conversation_blist_node(PurpleConversation *conv) { @@ -78,11 +93,11 @@ switch (purple_conversation_get_type(conv)) { case PURPLE_CONV_TYPE_IM: - node = (PurpleBlistNode*)purple_find_buddy(conv->account, conv->name); - node = node ? node->parent : NULL; + node = (PurpleBlistNode*)find_buddy_for_conversation(conv); + node = node ? purple_blist_node_get_parent(node) : NULL; break; case PURPLE_CONV_TYPE_CHAT: - node = (PurpleBlistNode*)purple_blist_find_chat(conv->account, conv->name); + node = (PurpleBlistNode*)find_chat_for_conversation(conv); break; default: break; @@ -168,7 +183,7 @@ } g_free(error); } - else if (!purple_account_is_connected(ggconv->active_conv->account)) + else if (!purple_account_is_connected(purple_conversation_get_account(ggconv->active_conv))) { purple_conversation_write(ggconv->active_conv, "", _("Message was not sent, because you are not signed on."), PURPLE_MESSAGE_ERROR | PURPLE_MESSAGE_NO_LOG, time(NULL)); @@ -236,11 +251,12 @@ if (!buddy) return NULL; - for (node = ((PurpleBlistNode*)buddy)->parent->child; node; node = node->next) { + for (node = purple_blist_node_get_first_child(purple_blist_node_get_parent((PurpleBlistNode*)buddy)); + node; node = purple_blist_node_get_sibling_next(node)) { if (node == (PurpleBlistNode*)buddy) continue; if ((ret = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, - ((PurpleBuddy*)node)->name, ((PurpleBuddy*)node)->account)) != NULL) + purple_buddy_get_name((PurpleBuddy*)node), purple_buddy_get_account((PurpleBuddy*)node))) != NULL) break; } return ret; @@ -267,7 +283,7 @@ return; im = PURPLE_CONV_IM(conv); - ggc = conv->ui_data; + ggc = FINCH_GET_DATA(conv); if (purple_conv_im_get_typing_state(im) == PURPLE_TYPING) { int scroll; @@ -303,10 +319,10 @@ static void buddy_signed_on_off(PurpleBuddy *buddy, gpointer null) { - PurpleConversation *conv = find_conv_with_contact(buddy->account, buddy->name); + PurpleConversation *conv = find_conv_with_contact(purple_buddy_get_account(buddy), purple_buddy_get_name(buddy)); if (conv == NULL) return; - generate_send_to_menu(conv->ui_data); + generate_send_to_menu(FINCH_GET_DATA(conv)); } static void @@ -315,9 +331,10 @@ GList *list = purple_get_ims(); while (list) { PurpleConversation *conv = list->data; - PurpleConversation *cc = find_conv_with_contact(conv->account, conv->name); + PurpleConversation *cc = find_conv_with_contact( + purple_conversation_get_account(conv), purple_conversation_get_name(conv)); if (cc) - generate_send_to_menu(cc->ui_data); + generate_send_to_menu(FINCH_GET_DATA(cc)); list = list->next; } @@ -331,16 +348,17 @@ GHashTable *comps = NULL; list = list->next; - if (conv->account != gc->account || + if (purple_conversation_get_account(conv) != purple_connection_get_account(gc) || !purple_conversation_get_data(conv, "want-to-rejoin")) continue; - chat = purple_blist_find_chat(conv->account, conv->name); + chat = find_chat_for_conversation(conv); if (chat == NULL) { - if (PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults != NULL) - comps = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults(gc, conv->name); + PurplePluginProtocolInfo *info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc)); + if (info->chat_info_defaults != NULL) + comps = info->chat_info_defaults(gc, purple_conversation_get_name(conv)); } else { - comps = chat->components; + comps = purple_chat_get_components(chat); } serv_join_chat(gc, comps); if (chat == NULL && comps != NULL) @@ -350,7 +368,7 @@ } static gpointer -finch_conv_get_handle() +finch_conv_get_handle(void) { static int handle; return &handle; @@ -413,15 +431,11 @@ purple_conversation_write(conv, NULL, _("Logging started. Future messages in this conversation will be logged."), - conv->logs ? (PURPLE_MESSAGE_SYSTEM) : - (PURPLE_MESSAGE_SYSTEM | PURPLE_MESSAGE_NO_LOG), - time(NULL)); + PURPLE_MESSAGE_SYSTEM, time(NULL)); } else { purple_conversation_write(conv, NULL, _("Logging stopped. Future messages in this conversation will not be logged."), - conv->logs ? (PURPLE_MESSAGE_SYSTEM) : - (PURPLE_MESSAGE_SYSTEM | PURPLE_MESSAGE_NO_LOG), - time(NULL)); + PURPLE_MESSAGE_SYSTEM, time(NULL)); /* Disable the logging second, so that the above message can be logged. */ purple_conversation_set_logging(conv, FALSE); @@ -455,6 +469,44 @@ } static void +view_log_cb(GntMenuItem *n, gpointer ggc) +{ + FinchConv *fc; + PurpleConversation *conv; + PurpleLogType type; + const char *name; + PurpleAccount *account; + GSList *buddies; + GSList *cur; + + fc = ggc; + conv = fc->active_conv; + + if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) + type = PURPLE_LOG_IM; + else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) + type = PURPLE_LOG_CHAT; + else + return; + + name = purple_conversation_get_name(conv); + account = purple_conversation_get_account(conv); + + buddies = purple_find_buddies(account, name); + for (cur = buddies; cur != NULL; cur = cur->next) { + PurpleBlistNode *node = cur->data; + if ((node != NULL) && ((node->prev != NULL) || (node->next != NULL))) { + finch_log_show_contact((PurpleContact *)node->parent); + g_slist_free(buddies); + return; + } + } + g_slist_free(buddies); + + finch_log_show(type, name, account); +} + +static void generate_send_to_menu(FinchConv *ggc) { GntWidget *sub, *menu = ggc->menu; @@ -462,7 +514,8 @@ GSList *buds; GList *list = NULL; - buds = purple_find_buddies(ggc->active_conv->account, ggc->active_conv->name); + buds = purple_find_buddies(purple_conversation_get_account(ggc->active_conv), + purple_conversation_get_name(ggc->active_conv)); if (!buds) return; @@ -476,7 +529,8 @@ for (; buds; buds = g_slist_delete_link(buds, buds)) { PurpleBlistNode *node = (PurpleBlistNode *)purple_buddy_get_contact((PurpleBuddy *)buds->data); - for (node = node->child; node != NULL; node = node->next) { + for (node = purple_blist_node_get_first_child(node); node != NULL; + node = purple_blist_node_get_sibling_next(node)) { PurpleBuddy *buddy = (PurpleBuddy *)node; PurpleAccount *account = purple_buddy_get_account(buddy); if (purple_account_is_connected(account)) { @@ -529,7 +583,9 @@ if (purple_conversation_get_type(ggc->active_conv) == PURPLE_CONV_TYPE_IM) { PurpleAccount *account = purple_conversation_get_account(ggc->active_conv); - PurplePluginProtocolInfo *pinfo = account->gc ? PURPLE_PLUGIN_PROTOCOL_INFO(account->gc->prpl) : NULL; + PurpleConnection *gc = purple_account_get_connection(account); + PurplePluginProtocolInfo *pinfo = + gc ? PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc)) : NULL; if (pinfo && pinfo->get_info) { item = gnt_menuitem_new(_("Get Info")); @@ -543,7 +599,7 @@ if (pinfo && pinfo->send_file && (!pinfo->can_receive_file || - pinfo->can_receive_file(account->gc, purple_conversation_get_name(ggc->active_conv)))) { + pinfo->can_receive_file(gc, purple_conversation_get_name(ggc->active_conv)))) { item = gnt_menuitem_new(_("Send File")); gnt_menu_add_item(GNT_MENU(sub), item); gnt_menuitem_set_callback(item, send_file_cb, ggc); @@ -552,6 +608,10 @@ generate_send_to_menu(ggc); } + item = gnt_menuitem_new(_("View Log...")); + gnt_menu_add_item(GNT_MENU(sub), item); + gnt_menuitem_set_callback(item, view_log_cb, ggc); + item = gnt_menuitem_check_new(_("Enable Logging")); gnt_menuitem_check_set_checked(GNT_MENU_ITEM_CHECK(item), purple_conversation_is_logging(ggc->active_conv)); @@ -593,7 +653,7 @@ static void finch_create_conversation(PurpleConversation *conv) { - FinchConv *ggc = conv->ui_data; + FinchConv *ggc = FINCH_GET_DATA(conv); char *title; PurpleConversationType type; PurpleConversation *cc; @@ -603,9 +663,10 @@ if (ggc) return; - cc = find_conv_with_contact(conv->account, conv->name); - if (cc && cc->ui_data) - ggc = cc->ui_data; + account = purple_conversation_get_account(conv); + cc = find_conv_with_contact(account, purple_conversation_get_name(conv)); + if (cc && FINCH_GET_DATA(cc)) + ggc = FINCH_GET_DATA(cc); else ggc = g_new0(FinchConv, 1); @@ -617,14 +678,13 @@ ggc->list = g_list_prepend(ggc->list, conv); ggc->active_conv = conv; - conv->ui_data = ggc; + FINCH_SET_DATA(conv, ggc); - if (cc && cc->ui_data) { + if (cc && FINCH_GET_DATA(cc)) { finch_conversation_set_active(conv); return; } - account = purple_conversation_get_account(conv); type = purple_conversation_get_type(conv); title = get_conversation_title(conv, account); @@ -633,7 +693,7 @@ gnt_box_set_toplevel(GNT_BOX(ggc->window), TRUE); gnt_box_set_pad(GNT_BOX(ggc->window), 0); - switch(conv->type){ + switch (purple_conversation_get_type(conv)) { case PURPLE_CONV_TYPE_UNKNOWN: gnt_widget_set_name(ggc->window, "conversation-window-unknown" ); break; @@ -721,7 +781,7 @@ finch_destroy_conversation(PurpleConversation *conv) { /* do stuff here */ - FinchConv *ggc = conv->ui_data; + FinchConv *ggc = FINCH_GET_DATA(conv); ggc->list = g_list_remove(ggc->list, conv); if (ggc->list && conv == ggc->active_conv) ggc->active_conv = ggc->list->data; @@ -738,7 +798,7 @@ finch_write_common(PurpleConversation *conv, const char *who, const char *message, PurpleMessageFlags flags, time_t mtime) { - FinchConv *ggconv = conv->ui_data; + FinchConv *ggconv = FINCH_GET_DATA(conv); char *strip, *newline; GntTextFormatFlags fl = 0; int pos; @@ -891,7 +951,7 @@ static void finch_chat_add_users(PurpleConversation *conv, GList *users, gboolean new_arrivals) { - FinchConv *ggc = conv->ui_data; + FinchConv *ggc = FINCH_GET_DATA(conv); GntEntry *entry = GNT_ENTRY(ggc->entry); if (!new_arrivals) @@ -930,7 +990,7 @@ finch_chat_rename_user(PurpleConversation *conv, const char *old, const char *new_n, const char *new_a) { /* Update the name for string completion */ - FinchConv *ggc = conv->ui_data; + FinchConv *ggc = FINCH_GET_DATA(conv); GntEntry *entry = GNT_ENTRY(ggc->entry); GntTree *tree = GNT_TREE(ggc->u.chat->userlist); PurpleConvChatBuddy *cb = purple_conv_chat_cb_find(PURPLE_CONV_CHAT(conv), new_n); @@ -948,7 +1008,7 @@ finch_chat_remove_users(PurpleConversation *conv, GList *list) { /* Remove the name from string completion */ - FinchConv *ggc = conv->ui_data; + FinchConv *ggc = FINCH_GET_DATA(conv); GntEntry *entry = GNT_ENTRY(ggc->entry); for (; list; list = list->next) { GntTree *tree = GNT_TREE(ggc->u.chat->userlist); @@ -961,7 +1021,7 @@ finch_chat_update_user(PurpleConversation *conv, const char *user) { PurpleConvChatBuddy *cb = purple_conv_chat_cb_find(PURPLE_CONV_CHAT(conv), user); - FinchConv *ggc = conv->ui_data; + FinchConv *ggc = FINCH_GET_DATA(conv); gnt_tree_change_text(GNT_TREE(ggc->u.chat->userlist), (gpointer)user, 0, chat_flag_text(cb->flags)); } @@ -1070,7 +1130,7 @@ clear_command_cb(PurpleConversation *conv, const char *cmd, char **args, char **error, void *data) { - FinchConv *ggconv = conv->ui_data; + FinchConv *ggconv = FINCH_GET_DATA(conv); gnt_text_view_clear(GNT_TEXT_VIEW(ggconv->tv)); purple_conversation_clear_message_history(conv); return PURPLE_CMD_STATUS_OK; @@ -1119,7 +1179,7 @@ static PurpleCmdRet cmd_show_window(PurpleConversation *conv, const char *cmd, char **args, char **error, gpointer data) { - void (*callback)() = data; + void (*callback)(void) = data; callback(); return PURPLE_CMD_STATUS_OK; } @@ -1127,7 +1187,7 @@ static PurpleCmdRet users_command_cb(PurpleConversation *conv, const char *cmd, char **args, char **error, gpointer data) { - FinchConv *fc = conv->ui_data; + FinchConv *fc = FINCH_GET_DATA(conv); FinchConvChat *ch; if (!fc) return PURPLE_CMD_STATUS_FAILED; @@ -1231,7 +1291,7 @@ void finch_conversation_set_active(PurpleConversation *conv) { - FinchConv *ggconv = conv->ui_data; + FinchConv *ggconv = FINCH_GET_DATA(conv); PurpleAccount *account; char *title; @@ -1247,7 +1307,7 @@ void finch_conversation_set_info_widget(PurpleConversation *conv, GntWidget *widget) { - FinchConv *fc = conv->ui_data; + FinchConv *fc = FINCH_GET_DATA(conv); int height, width; gnt_box_remove_all(GNT_BOX(fc->info)); diff -r f182cf94145c -r 00eaff9396ec finch/gntft.c --- a/finch/gntft.c Sun Jan 13 00:29:56 2008 +0000 +++ b/finch/gntft.c Wed Feb 06 03:35:04 2008 +0000 @@ -23,13 +23,14 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */ +#include "finch.h" + #include #include #include #include #include #include -#include "internal.h" #include "debug.h" #include "notify.h" @@ -41,7 +42,7 @@ #include "prefs.h" #define FINCHXFER(xfer) \ - (PurpleGntXferUiData *)(xfer)->ui_data + (PurpleGntXferUiData *)FINCH_GET_DATA(xfer) typedef struct { @@ -65,6 +66,7 @@ gboolean in_list; char *name; + gboolean notified; /* Has the completion of the transfer been notified? */ } PurpleGntXferUiData; @@ -85,7 +87,7 @@ **************************************************************************/ static void -update_title_progress() +update_title_progress(void) { GList *list; int num_active_xfers = 0; @@ -142,15 +144,23 @@ xfer_dialog->auto_clear = !xfer_dialog->auto_clear; purple_prefs_set_bool("/finch/filetransfer/clear_finished", xfer_dialog->auto_clear); + if (xfer_dialog->auto_clear) { + GList *iter = purple_xfers_get_all(); + while (iter) { + PurpleXfer *xfer = iter->data; + iter = iter->next; + if (purple_xfer_is_completed(xfer) || purple_xfer_is_canceled(xfer)) + finch_xfer_dialog_remove_xfer(xfer); + } + } } static void remove_button_cb(GntButton *button) { PurpleXfer *selected_xfer = gnt_tree_get_selection_data(GNT_TREE(xfer_dialog->tree)); - if (selected_xfer && (selected_xfer->status == PURPLE_XFER_STATUS_CANCEL_LOCAL || - selected_xfer->status == PURPLE_XFER_STATUS_CANCEL_REMOTE || - selected_xfer->status == PURPLE_XFER_STATUS_DONE)) { + if (selected_xfer && (purple_xfer_is_completed(selected_xfer) || + purple_xfer_is_canceled(selected_xfer))) { finch_xfer_dialog_remove_xfer(selected_xfer); } } @@ -159,9 +169,15 @@ stop_button_cb(GntButton *button) { PurpleXfer *selected_xfer = gnt_tree_get_selection_data(GNT_TREE(xfer_dialog->tree)); - if (selected_xfer && selected_xfer->status != PURPLE_XFER_STATUS_CANCEL_LOCAL && - selected_xfer->status != PURPLE_XFER_STATUS_CANCEL_REMOTE && - selected_xfer->status != PURPLE_XFER_STATUS_DONE) + PurpleXferStatusType status; + + if (!selected_xfer) + return; + + status = purple_xfer_get_status(selected_xfer); + if (status != PURPLE_XFER_STATUS_CANCEL_LOCAL && + status != PURPLE_XFER_STATUS_CANCEL_REMOTE && + status != PURPLE_XFER_STATUS_DONE) purple_xfer_cancel_local(selected_xfer); } @@ -388,14 +404,12 @@ time_t elapsed, now; char *kbsec; - if (xfer->end_time != 0) - now = xfer->end_time; - else + if ((now = purple_xfer_get_end_time(xfer)) == 0) now = time(NULL); kb_sent = purple_xfer_get_bytes_sent(xfer) / 1024.0; kb_rem = purple_xfer_get_bytes_remaining(xfer) / 1024.0; - elapsed = (xfer->start_time > 0 ? now - xfer->start_time : 0); + elapsed = (purple_xfer_get_start_time(xfer) > 0 ? now - purple_xfer_get_start_time(xfer) : 0); kbps = (elapsed > 0 ? (kb_sent / elapsed) : 0); g_return_if_fail(xfer_dialog != NULL); @@ -404,7 +418,7 @@ if ((data = FINCHXFER(xfer)) == NULL) return; - if (data->in_list == FALSE) + if (data->in_list == FALSE || data->notified) return; current_time = time(NULL); @@ -433,6 +447,7 @@ gnt_tree_change_text(GNT_TREE(xfer_dialog->tree), xfer, COLUMN_REMAINING, _("Finished")); purple_xfer_conversation_write(xfer, msg, FALSE); g_free(msg); + data->notified = TRUE; } else { gnt_tree_change_text(GNT_TREE(xfer_dialog->tree), xfer, COLUMN_STATUS, _("Transferring")); } @@ -453,7 +468,7 @@ /* This is where we're setting xfer->ui_data for the first time. */ data = g_new0(PurpleGntXferUiData, 1); - xfer->ui_data = data; + FINCH_SET_DATA(xfer, data); } static void @@ -465,7 +480,7 @@ if (data) { g_free(data->name); g_free(data); - xfer->ui_data = NULL; + FINCH_SET_DATA(xfer, NULL); } } diff -r f182cf94145c -r 00eaff9396ec finch/gntft.h --- a/finch/gntft.h Sun Jan 13 00:29:56 2008 +0000 +++ b/finch/gntft.h Wed Feb 06 03:35:04 2008 +0000 @@ -55,7 +55,7 @@ /** * Hides the file transfer dialog. */ -void finch_xfer_dialog_hide(); +void finch_xfer_dialog_hide(void); /** * Adds a file transfer to the dialog. diff -r f182cf94145c -r 00eaff9396ec finch/gntidle.c --- a/finch/gntidle.c Sun Jan 13 00:29:56 2008 +0000 +++ b/finch/gntidle.c Wed Feb 06 03:35:04 2008 +0000 @@ -21,14 +21,14 @@ * */ -#include "internal.h" +#include "finch.h" #include "gntidle.h" #include "gntwm.h" #include "idle.h" static time_t -finch_get_idle_time() +finch_get_idle_time(void) { return gnt_wm_get_idle_time(); } diff -r f182cf94145c -r 00eaff9396ec finch/gntlog.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/finch/gntlog.c Wed Feb 06 03:35:04 2008 +0000 @@ -0,0 +1,504 @@ +/** + * @file gntlog.c GNT Log viewer + * @ingroup finch + */ + +/* finch + * + * Finch is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA + */ +#include "internal.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "account.h" +#include "debug.h" +#include "log.h" +#include "notify.h" +#include "request.h" +#include "util.h" + +#include "gntlog.h" + +static GHashTable *log_viewers = NULL; +static void populate_log_tree(FinchLogViewer *lv); +static FinchLogViewer *syslog_viewer = NULL; + +struct log_viewer_hash_t { + PurpleLogType type; + char *screenname; + PurpleAccount *account; + PurpleContact *contact; +}; + +static guint log_viewer_hash(gconstpointer data) +{ + const struct log_viewer_hash_t *viewer = data; + + if (viewer->contact != NULL) + return g_direct_hash(viewer->contact); + + return g_str_hash(viewer->screenname) + + g_str_hash(purple_account_get_username(viewer->account)); +} + +static gboolean log_viewer_equal(gconstpointer y, gconstpointer z) +{ + const struct log_viewer_hash_t *a, *b; + int ret; + char *normal; + + a = y; + b = z; + + if (a->contact != NULL) { + if (b->contact != NULL) + return (a->contact == b->contact); + else + return FALSE; + } else { + if (b->contact != NULL) + return FALSE; + } + + normal = g_strdup(purple_normalize(a->account, a->screenname)); + ret = (a->account == b->account) && + !strcmp(normal, purple_normalize(b->account, b->screenname)); + g_free(normal); + + return ret; +} + +static const char *log_get_date(PurpleLog *log) +{ + if (log->tm) + return purple_date_format_full(log->tm); + else + return purple_date_format_full(localtime(&log->time)); +} + +static void search_cb(GntWidget *button, FinchLogViewer *lv) +{ + const char *search_term = gnt_entry_get_text(GNT_ENTRY(lv->entry)); + GList *logs; + + if (!(*search_term)) { + /* reset the tree */ + gnt_tree_remove_all(GNT_TREE(lv->tree)); + g_free(lv->search); + lv->search = NULL; + populate_log_tree(lv); + return; + } + + if (lv->search != NULL && !strcmp(lv->search, search_term)) { + return; + } + + g_free(lv->search); + lv->search = g_strdup(search_term); + + gnt_tree_remove_all(GNT_TREE(lv->tree)); + gnt_text_view_clear(GNT_TEXT_VIEW(lv->text)); + + for (logs = lv->logs; logs != NULL; logs = logs->next) { + char *read = purple_log_read((PurpleLog*)logs->data, NULL); + if (read && *read && purple_strcasestr(read, search_term)) { + PurpleLog *log = logs->data; + + gnt_tree_add_row_last(GNT_TREE(lv->tree), + log, + gnt_tree_create_row(GNT_TREE(lv->tree), log_get_date(log)), + NULL); + } + g_free(read); + } + +} + +static void destroy_cb(GntWidget *w, struct log_viewer_hash_t *ht) { + FinchLogViewer *lv = syslog_viewer; + + if (ht != NULL) { + lv = g_hash_table_lookup(log_viewers, ht); + g_hash_table_remove(log_viewers, ht); + + g_free(ht->screenname); + g_free(ht); + } else + syslog_viewer = NULL; + + purple_request_close_with_handle(lv); + + g_list_foreach(lv->logs, (GFunc)purple_log_free, NULL); + g_list_free(lv->logs); + + g_free(lv->search); + g_free(lv); + + gnt_widget_destroy(w); +} + +static void log_select_cb(GntWidget *w, gpointer old, gpointer new, FinchLogViewer *viewer) { + GntTree *tree = GNT_TREE(w); + PurpleLog *log = NULL; + PurpleLogReadFlags flags; + char *read = NULL, *strip, *newline; + int h; + + if (!viewer->search && !gnt_tree_get_parent_key(tree, new)) + return; + + log = (PurpleLog *)new; + + if (log == NULL) + return; + + if (log->type != PURPLE_LOG_SYSTEM) { + char *title; + if (log->type == PURPLE_LOG_CHAT) + title = g_strdup_printf(_("Conversation in %s on %s"), + log->name, log_get_date(log)); + else + title = g_strdup_printf(_("Conversation with %s on %s"), + log->name, log_get_date(log)); + + gnt_label_set_text(GNT_LABEL(viewer->label), title); + g_free(title); + } + + read = purple_log_read(log, &flags); + if (flags != PURPLE_LOG_READ_NO_NEWLINE) { + newline = purple_strdup_withhtml(read); + strip = purple_markup_strip_html(newline); + g_free(newline); + } else { + strip = purple_markup_strip_html(read); + } + viewer->flags = flags; + + purple_signal_emit(finch_log_get_handle(), "log-displaying", viewer, log); + + gnt_text_view_clear(GNT_TEXT_VIEW(viewer->text)); + gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(viewer->text), strip, GNT_TEXT_FLAG_NORMAL); + gnt_widget_get_size(viewer->text, NULL, &h); + gnt_text_view_scroll(GNT_TEXT_VIEW(viewer->text), h - 2); + g_free(read); + g_free(strip); +} + +/* I want to make this smarter, but haven't come up with a cool algorithm to do so, yet. + * I want the tree to be divided into groups like "Today," "Yesterday," "Last week," + * "August," "2002," etc. based on how many conversation took place in each subdivision. + * + * For now, I'll just make it a flat list. + */ +static void populate_log_tree(FinchLogViewer *lv) + /* Logs are made from trees in real life. + This is a tree made from logs */ +{ + const char *pmonth; + char *month = NULL; + char prev_top_month[30] = ""; + GList *logs = lv->logs; + + while (logs != NULL) { + PurpleLog *log = logs->data; + + pmonth = purple_utf8_strftime(_("%B %Y"), + log->tm ? log->tm : localtime(&log->time)); + + if (strcmp(pmonth, prev_top_month) != 0) { + month = g_strdup(pmonth); + /* top level */ + gnt_tree_add_row_last(GNT_TREE(lv->tree), + month, + gnt_tree_create_row(GNT_TREE(lv->tree), month), + NULL); + gnt_tree_set_expanded(GNT_TREE(lv->tree), month, FALSE); + + strncpy(prev_top_month, month, sizeof(prev_top_month)); + } + + /* sub */ + gnt_tree_add_row_last(GNT_TREE(lv->tree), + log, + gnt_tree_create_row(GNT_TREE(lv->tree), log_get_date(log)), + month); + + logs = logs->next; + } +} + +static FinchLogViewer *display_log_viewer(struct log_viewer_hash_t *ht, GList *logs, + const char *title, int log_size) +{ + FinchLogViewer *lv; + char *text; + GntWidget *vbox, *hbox; + GntWidget *size_label; + + if (logs == NULL) + { + /* No logs were found. */ + const char *log_preferences = NULL; + + if (ht == NULL) { + if (!purple_prefs_get_bool("/purple/logging/log_system")) + log_preferences = _("System events will only be logged if the \"Log all status changes to system log\" preference is enabled."); + } else { + if (ht->type == PURPLE_LOG_IM) { + if (!purple_prefs_get_bool("/purple/logging/log_ims")) + log_preferences = _("Instant messages will only be logged if the \"Log all instant messages\" preference is enabled."); + } else if (ht->type == PURPLE_LOG_CHAT) { + if (!purple_prefs_get_bool("/purple/logging/log_chats")) + log_preferences = _("Chats will only be logged if the \"Log all chats\" preference is enabled."); + } + g_free(ht->screenname); + g_free(ht); + } + + purple_notify_info(NULL, title, _("No logs were found"), log_preferences); + return NULL; + } + + lv = g_new0(FinchLogViewer, 1); + lv->logs = logs; + + if (ht != NULL) + g_hash_table_insert(log_viewers, ht, lv); + + /* Window ***********/ + lv->window = gnt_vwindow_new(FALSE); + gnt_box_set_title(GNT_BOX(lv->window), title); + gnt_box_set_toplevel(GNT_BOX(lv->window), TRUE); + gnt_box_set_pad(GNT_BOX(lv->window), 0); + g_signal_connect(G_OBJECT(lv->window), "destroy", G_CALLBACK(destroy_cb), ht); + + vbox = gnt_vbox_new(FALSE); + gnt_box_add_widget(GNT_BOX(lv->window), vbox); + + /* Label ************/ + text = g_strdup_printf("%s", title); + lv->label = gnt_label_new(text); + g_free(text); + gnt_box_add_widget(GNT_BOX(vbox), lv->label); + + hbox = gnt_hbox_new(FALSE); + gnt_box_add_widget(GNT_BOX(vbox), hbox); + /* List *************/ + lv->tree = gnt_tree_new(); + gnt_widget_set_size(lv->tree, 30, 0); + populate_log_tree(lv); + g_signal_connect (G_OBJECT(lv->tree), "selection-changed", + G_CALLBACK (log_select_cb), + lv); + gnt_box_add_widget(GNT_BOX(hbox), lv->tree); + + /* Viewer ************/ + lv->text = gnt_text_view_new(); + gnt_box_add_widget(GNT_BOX(hbox), lv->text); + + hbox = gnt_hbox_new(FALSE); + gnt_box_add_widget(GNT_BOX(vbox), hbox); + /* Log size ************/ + if (log_size) { + char *sz_txt = purple_str_size_to_units(log_size); + text = g_strdup_printf("%s %s", _("Total log size:"), sz_txt); + size_label = gnt_label_new(text); + gnt_box_add_widget(GNT_BOX(hbox), size_label); + g_free(sz_txt); + g_free(text); + } + + /* Search box **********/ + gnt_box_add_widget(GNT_BOX(hbox), gnt_label_new(_("Scroll/Search: "))); + lv->entry = gnt_entry_new(""); + gnt_box_add_widget(GNT_BOX(hbox), lv->entry); + g_signal_connect(GNT_ENTRY(lv->entry), "activate", G_CALLBACK(search_cb), lv); + + gnt_text_view_attach_scroll_widget(GNT_TEXT_VIEW(lv->text), lv->entry); + gnt_text_view_attach_pager_widget(GNT_TEXT_VIEW(lv->text), lv->entry); + + gnt_widget_show(lv->window); + + return lv; +} + +void finch_log_show(PurpleLogType type, const char *screenname, PurpleAccount *account) { + struct log_viewer_hash_t *ht; + FinchLogViewer *lv = NULL; + const char *name = screenname; + char *title; + + g_return_if_fail(account != NULL); + g_return_if_fail(screenname != NULL); + + ht = g_new0(struct log_viewer_hash_t, 1); + + ht->type = type; + ht->screenname = g_strdup(screenname); + ht->account = account; + + if (log_viewers == NULL) { + log_viewers = g_hash_table_new(log_viewer_hash, log_viewer_equal); + } else if ((lv = g_hash_table_lookup(log_viewers, ht))) { + gnt_window_present(lv->window); + g_free(ht->screenname); + g_free(ht); + return; + } + + if (type == PURPLE_LOG_CHAT) { + PurpleChat *chat; + + chat = purple_blist_find_chat(account, screenname); + if (chat != NULL) + name = purple_chat_get_name(chat); + + title = g_strdup_printf(_("Conversations in %s"), name); + } else { + PurpleBuddy *buddy; + + buddy = purple_find_buddy(account, screenname); + if (buddy != NULL) + name = purple_buddy_get_contact_alias(buddy); + + title = g_strdup_printf(_("Conversations with %s"), name); + } + + display_log_viewer(ht, purple_log_get_logs(type, screenname, account), + title, purple_log_get_total_size(type, screenname, account)); + + g_free(title); +} + +void finch_log_show_contact(PurpleContact *contact) { + struct log_viewer_hash_t *ht; + PurpleBlistNode *child; + FinchLogViewer *lv = NULL; + GList *logs = NULL; + const char *name = NULL; + char *title; + int total_log_size = 0; + + g_return_if_fail(contact != NULL); + + ht = g_new0(struct log_viewer_hash_t, 1); + ht->type = PURPLE_LOG_IM; + ht->contact = contact; + + if (log_viewers == NULL) { + log_viewers = g_hash_table_new(log_viewer_hash, log_viewer_equal); + } else if ((lv = g_hash_table_lookup(log_viewers, ht))) { + gnt_window_present(lv->window); + g_free(ht); + return; + } + + for (child = contact->node.child ; child ; child = child->next) { + if (!PURPLE_BLIST_NODE_IS_BUDDY(child)) + continue; + + logs = g_list_concat(purple_log_get_logs(PURPLE_LOG_IM, ((PurpleBuddy *)child)->name, + ((PurpleBuddy *)child)->account), logs); + total_log_size += purple_log_get_total_size(PURPLE_LOG_IM, ((PurpleBuddy *)child)->name, ((PurpleBuddy *)child)->account); + } + logs = g_list_sort(logs, purple_log_compare); + + if (contact->alias != NULL) + name = contact->alias; + else if (contact->priority != NULL) + name = purple_buddy_get_contact_alias(contact->priority); + + /* This will happen if the contact doesn't have an alias, + * and none of the contact's buddies are online. + * There is probably a better way to deal with this. */ + if (name == NULL) { + if (contact->node.child != NULL && PURPLE_BLIST_NODE_IS_BUDDY(contact->node.child)) + name = purple_buddy_get_contact_alias((PurpleBuddy *) contact->node.child); + if (name == NULL) + name = ""; + } + + title = g_strdup_printf(_("Conversations with %s"), name); + display_log_viewer(ht, logs, title, total_log_size); + g_free(title); +} + +void finch_syslog_show() +{ + GList *accounts = NULL; + GList *logs = NULL; + + if (syslog_viewer != NULL) { + gnt_window_present(syslog_viewer->window); + return; + } + + for(accounts = purple_accounts_get_all(); accounts != NULL; accounts = accounts->next) { + + PurpleAccount *account = (PurpleAccount *)accounts->data; + if(purple_find_prpl(purple_account_get_protocol_id(account)) == NULL) + continue; + + logs = g_list_concat(purple_log_get_system_logs(account), logs); + } + logs = g_list_sort(logs, purple_log_compare); + + syslog_viewer = display_log_viewer(NULL, logs, _("System Log"), 0); +} + +/**************************************************************************** + * GNT LOG SUBSYSTEM ******************************************************* + ****************************************************************************/ + +void * +finch_log_get_handle(void) +{ + static int handle; + + return &handle; +} + +void finch_log_init(void) +{ + void *handle = finch_log_get_handle(); + + purple_signal_register(handle, "log-displaying", + purple_marshal_VOID__POINTER_POINTER, + NULL, 2, + purple_value_new(PURPLE_TYPE_BOXED, + "FinchLogViewer *"), + purple_value_new(PURPLE_TYPE_SUBTYPE, + PURPLE_SUBTYPE_LOG)); +} + +void +finch_log_uninit(void) +{ + purple_signals_unregister_by_instance(finch_log_get_handle()); +} diff -r f182cf94145c -r 00eaff9396ec finch/gntlog.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/finch/gntlog.h Wed Feb 06 03:35:04 2008 +0000 @@ -0,0 +1,83 @@ +/** + * @file gntlog.h GNT Log viewer + * @ingroup finch + * @see @ref gntlog-signals + */ + +/* finch + * + * Finch is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA + */ +#ifndef _FINCHLOG_H_ +#define _FINCHLOG_H_ + +#include "log.h" +#include "account.h" +#include "gntwidget.h" + +typedef struct _FinchLogViewer FinchLogViewer; + +/** + * A GNT Log Viewer. You can look at logs with it. + */ +struct _FinchLogViewer { + GList *logs; /**< The list of logs viewed in this viewer */ + + GntWidget *window; /**< The viewer's window */ + GntWidget *tree; /**< The tree representing said treestore */ + GntWidget *text; /**< The text to display said logs */ + GntWidget *entry; /**< The search entry, in which search terms + * are entered */ + GntWidget *label; + PurpleLogReadFlags flags; /**< The most recently used log flags */ + char *search; /**< The string currently being searched for */ +}; + + + +void finch_log_show(PurpleLogType type, const char *screenname, PurpleAccount *account); +void finch_log_show_contact(PurpleContact *contact); + +void finch_syslog_show(void); + +/**************************************************************************/ +/** @name GNT Log Subsystem */ +/**************************************************************************/ +/*@{*/ + +/** + * Initializes the GNT log subsystem. + */ +void finch_log_init(void); + +/** + * Returns the GNT log subsystem handle. + * + * @return The GNT log subsystem handle. + */ +void *finch_log_get_handle(void); + +/** + * Uninitializes the GNT log subsystem. + */ +void finch_log_uninit(void); + +/*@}*/ + +#endif diff -r f182cf94145c -r 00eaff9396ec finch/gntnotify.c --- a/finch/gntnotify.c Sun Jan 13 00:29:56 2008 +0000 +++ b/finch/gntnotify.c Wed Feb 06 03:35:04 2008 +0000 @@ -147,14 +147,14 @@ } static void -reset_email_dialog() +reset_email_dialog(void) { emaildialog.window = NULL; emaildialog.tree = NULL; } static void -setup_email_dialog() +setup_email_dialog(void) { GntWidget *box, *tree, *button; if (emaildialog.window) diff -r f182cf94145c -r 00eaff9396ec finch/gntplugin.c --- a/finch/gntplugin.c Sun Jan 13 00:29:56 2008 +0000 +++ b/finch/gntplugin.c Wed Feb 06 03:35:04 2008 +0000 @@ -171,7 +171,7 @@ } static void -confwin_init() +confwin_init(void) { confwins = g_hash_table_new(g_direct_hash, g_direct_equal); } diff -r f182cf94145c -r 00eaff9396ec finch/gntplugin.h --- a/finch/gntplugin.h Sun Jan 13 00:29:56 2008 +0000 +++ b/finch/gntplugin.h Wed Feb 06 03:35:04 2008 +0000 @@ -40,7 +40,7 @@ **********************************************************************/ /*@{*/ -typedef GntWidget* (*FinchPluginFrame) (); +typedef GntWidget* (*FinchPluginFrame) (void); /* Guess where these came from */ #define FINCH_PLUGIN_TYPE FINCH_UI diff -r f182cf94145c -r 00eaff9396ec finch/gntpounce.c --- a/finch/gntpounce.c Sun Jan 13 00:29:56 2008 +0000 +++ b/finch/gntpounce.c Wed Feb 06 03:35:04 2008 +0000 @@ -35,7 +35,6 @@ #include #include -#include "internal.h" #include "finch.h" #include "account.h" @@ -458,7 +457,7 @@ gnt_box_add_widget(GNT_BOX(window), gnt_line_new(FALSE)); gnt_box_add_widget(GNT_BOX(window), gnt_label_new_with_format(_("Options"), GNT_TEXT_FLAG_BOLD)); - dialog->on_away = gnt_check_box_new(_("Pounce only when my status is not available")); + dialog->on_away = gnt_check_box_new(_("Pounce only when my status is not Available")); gnt_box_add_widget(GNT_BOX(window), dialog->on_away); dialog->save_pounce = gnt_check_box_new(_("Recurring")); gnt_box_add_widget(GNT_BOX(window), dialog->save_pounce); @@ -808,39 +807,42 @@ if (purple_pounce_action_is_enabled(pounce, "popup-notify")) { - char *tmp; + char *tmp = NULL; const char *name_shown; const char *reason; + struct { + PurplePounceEvent event; + const char *format; + } messages[] = { + {PURPLE_POUNCE_TYPING, _("%s has started typing to you (%s)")}, + {PURPLE_POUNCE_TYPED, _("%s has paused while typing to you (%s)")}, + {PURPLE_POUNCE_SIGNON, _("%s has signed on (%s)")}, + {PURPLE_POUNCE_IDLE_RETURN, _("%s has returned from being idle (%s)")}, + {PURPLE_POUNCE_AWAY_RETURN, _("%s has returned from being away (%s)")}, + {PURPLE_POUNCE_TYPING_STOPPED, _("%s has stopped typing to you (%s)")}, + {PURPLE_POUNCE_SIGNOFF, _("%s has signed off (%s)")}, + {PURPLE_POUNCE_IDLE, _("%s has become idle (%s)")}, + {PURPLE_POUNCE_AWAY, _("%s has gone away. (%s)")}, + {PURPLE_POUNCE_MESSAGE_RECEIVED, _("%s has sent you a message. (%s)")}, + {0, NULL} + }; + int i; reason = purple_pounce_action_get_attribute(pounce, "popup-notify", - "reason"); + "reason"); /* * Here we place the protocol name in the pounce dialog to lessen * confusion about what protocol a pounce is for. */ - tmp = g_strdup_printf( - (events & PURPLE_POUNCE_TYPING) ? - _("%s has started typing to you (%s)") : - (events & PURPLE_POUNCE_TYPED) ? - _("%s has paused while typing to you (%s)") : - (events & PURPLE_POUNCE_SIGNON) ? - _("%s has signed on (%s)") : - (events & PURPLE_POUNCE_IDLE_RETURN) ? - _("%s has returned from being idle (%s)") : - (events & PURPLE_POUNCE_AWAY_RETURN) ? - _("%s has returned from being away (%s)") : - (events & PURPLE_POUNCE_TYPING_STOPPED) ? - _("%s has stopped typing to you (%s)") : - (events & PURPLE_POUNCE_SIGNOFF) ? - _("%s has signed off (%s)") : - (events & PURPLE_POUNCE_IDLE) ? - _("%s has become idle (%s)") : - (events & PURPLE_POUNCE_AWAY) ? - _("%s has gone away. (%s)") : - (events & PURPLE_POUNCE_MESSAGE_RECEIVED) ? - _("%s has sent you a message. (%s)") : - _("Unknown pounce event. Please report this!"), - alias, purple_account_get_protocol_name(account)); + for (i = 0; messages[i].format != NULL; i++) { + if (messages[i].event & events) { + tmp = g_strdup_printf(messages[i].format, alias, + purple_account_get_protocol_name(account)); + break; + } + } + if (tmp == NULL) + tmp = g_strdup(_("Unknown pounce event. Please report this!")); /* * Ok here is where I change the second argument, title, from @@ -880,7 +882,7 @@ purple_conversation_write(conv, NULL, message, PURPLE_MESSAGE_SEND, time(NULL)); - serv_send_im(account->gc, (char *)pouncee, (char *)message, 0); + serv_send_im(purple_account_get_connection(account), (char *)pouncee, (char *)message, 0); } } diff -r f182cf94145c -r 00eaff9396ec finch/gntprefs.c --- a/finch/gntprefs.c Sun Jan 13 00:29:56 2008 +0000 +++ b/finch/gntprefs.c Wed Feb 06 03:35:04 2008 +0000 @@ -76,17 +76,17 @@ PurplePrefType type; const char *pref; const char *label; - GList *(*lv)(); /* If the value is to be selected from a number of choices */ + GList *(*lv)(void); /* If the value is to be selected from a number of choices */ } Prefs; static GList * -get_log_options() +get_log_options(void) { return purple_log_logger_get_options(); } static GList * -get_idle_options() +get_idle_options(void) { GList *list = NULL; list = g_list_append(list, (char *)_("Based on keyboard use")); @@ -99,7 +99,7 @@ } static GList * -get_status_titles() +get_status_titles(void) { GList *list = NULL; GList *iter; @@ -212,7 +212,7 @@ }; static void -free_strings() +free_strings(void) { g_list_foreach(pref_request.freestrings, (GFunc)g_free, NULL); g_list_free(pref_request.freestrings); diff -r f182cf94145c -r 00eaff9396ec finch/gntrequest.c --- a/finch/gntrequest.c Sun Jan 13 00:29:56 2008 +0000 +++ b/finch/gntrequest.c Wed Feb 06 03:35:04 2008 +0000 @@ -36,6 +36,7 @@ #include "finch.h" #include "gntrequest.h" +#include "debug.h" #include "util.h" typedef struct @@ -252,7 +253,7 @@ void *user_data, size_t actioncount, va_list actions) { - GntWidget *window, *box, *button; + GntWidget *window, *box, *button, *focus = NULL; int i; window = setup_request_window(title, primary, secondary, PURPLE_REQUEST_ACTION); @@ -271,9 +272,14 @@ g_object_set_data(G_OBJECT(button), "activate-userdata", user_data); g_object_set_data(G_OBJECT(button), "activate-id", GINT_TO_POINTER(i)); g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(request_action_cb), window); + + if (i == default_value) + focus = button; } gnt_widget_show(window); + if (focus) + gnt_box_give_focus_to_child(GNT_BOX(window), focus); return window; } @@ -302,26 +308,26 @@ PurpleRequestFieldType type = purple_request_field_get_type(field); if (type == PURPLE_REQUEST_FIELD_BOOLEAN) { - GntWidget *check = field->ui_data; + GntWidget *check = FINCH_GET_DATA(field); gboolean value = gnt_check_box_get_checked(GNT_CHECK_BOX(check)); purple_request_field_bool_set_value(field, value); } else if (type == PURPLE_REQUEST_FIELD_STRING) { - GntWidget *entry = field->ui_data; + GntWidget *entry = FINCH_GET_DATA(field); const char *text = gnt_entry_get_text(GNT_ENTRY(entry)); purple_request_field_string_set_value(field, (text && *text) ? text : NULL); } else if (type == PURPLE_REQUEST_FIELD_INTEGER) { - GntWidget *entry = field->ui_data; + GntWidget *entry = FINCH_GET_DATA(field); const char *text = gnt_entry_get_text(GNT_ENTRY(entry)); int value = (text && *text) ? atoi(text) : 0; purple_request_field_int_set_value(field, value); } else if (type == PURPLE_REQUEST_FIELD_CHOICE) { - GntWidget *combo = field->ui_data; + GntWidget *combo = FINCH_GET_DATA(field); int id; id = GPOINTER_TO_INT(gnt_combo_box_get_selected_data(GNT_COMBO_BOX(combo))); purple_request_field_choice_set_value(field, id); @@ -332,7 +338,7 @@ if (purple_request_field_list_get_multi_select(field)) { GList *iter; - GntWidget *tree = field->ui_data; + GntWidget *tree = FINCH_GET_DATA(field); iter = purple_request_field_list_get_items(field); for (; iter; iter = iter->next) @@ -345,7 +351,7 @@ } else { - GntWidget *combo = field->ui_data; + GntWidget *combo = FINCH_GET_DATA(field); gpointer data = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(combo)); list = g_list_append(list, data); } @@ -355,7 +361,7 @@ } else if (type == PURPLE_REQUEST_FIELD_ACCOUNT) { - GntWidget *combo = field->ui_data; + GntWidget *combo = FINCH_GET_DATA(field); PurpleAccount *acc = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(combo)); purple_request_field_account_set_value(field, acc); } @@ -418,9 +424,10 @@ *screenname = entry; } else if (hint && !strcmp(hint, "group")) { PurpleBlistNode *node; - for (node = purple_blist_get_root(); node; node = node->next) { + for (node = purple_blist_get_root(); node; + node = purple_blist_node_get_sibling_next(node)) { if (PURPLE_BLIST_NODE_IS_GROUP(node)) - gnt_entry_add_suggest(GNT_ENTRY(entry), ((PurpleGroup *)node)->name); + gnt_entry_add_suggest(GNT_ENTRY(entry), purple_group_get_name((PurpleGroup *)node)); } } return entry; @@ -587,35 +594,35 @@ if (type == PURPLE_REQUEST_FIELD_BOOLEAN) { - field->ui_data = create_boolean_field(field); + FINCH_SET_DATA(field, create_boolean_field(field)); } else if (type == PURPLE_REQUEST_FIELD_STRING) { - field->ui_data = create_string_field(field, &screenname); + FINCH_SET_DATA(field, create_string_field(field, &screenname)); } else if (type == PURPLE_REQUEST_FIELD_INTEGER) { - field->ui_data = create_integer_field(field); + FINCH_SET_DATA(field, create_integer_field(field)); } else if (type == PURPLE_REQUEST_FIELD_CHOICE) { - field->ui_data = create_choice_field(field); + FINCH_SET_DATA(field, create_choice_field(field)); } else if (type == PURPLE_REQUEST_FIELD_LIST) { - field->ui_data = create_list_field(field); + FINCH_SET_DATA(field, create_list_field(field)); } else if (type == PURPLE_REQUEST_FIELD_ACCOUNT) { - accountlist = field->ui_data = create_account_field(field); + accountlist = FINCH_SET_DATA(field, create_account_field(field)); } else { - field->ui_data = gnt_label_new_with_format(_("Not implemented yet."), - GNT_TEXT_FLAG_BOLD); + FINCH_SET_DATA(field, gnt_label_new_with_format(_("Not implemented yet."), + GNT_TEXT_FLAG_BOLD)); } gnt_box_set_alignment(GNT_BOX(hbox), GNT_ALIGN_MID); - gnt_box_add_widget(GNT_BOX(hbox), GNT_WIDGET(field->ui_data)); + gnt_box_add_widget(GNT_BOX(hbox), GNT_WIDGET(FINCH_GET_DATA(field))); } if (grlist->next) gnt_box_add_widget(GNT_BOX(box), gnt_hline_new()); @@ -824,3 +831,32 @@ } } +GntWidget *finch_request_field_get_widget(PurpleRequestField *field) +{ + GntWidget *ret = NULL; + switch (purple_request_field_get_type(field)) { + case PURPLE_REQUEST_FIELD_BOOLEAN: + ret = create_boolean_field(field); + break; + case PURPLE_REQUEST_FIELD_STRING: + ret = create_string_field(field, NULL); + break; + case PURPLE_REQUEST_FIELD_INTEGER: + ret = create_integer_field(field); + break; + case PURPLE_REQUEST_FIELD_CHOICE: + ret = create_choice_field(field); + break; + case PURPLE_REQUEST_FIELD_LIST: + ret = create_list_field(field); + break; + case PURPLE_REQUEST_FIELD_ACCOUNT: + ret = create_account_field(field); + break; + default: + purple_debug_error("GntRequest", "Unimplemented request-field %d\n", purple_request_field_get_type(field)); + break; + } + return ret; +} + diff -r f182cf94145c -r 00eaff9396ec finch/gntrequest.h --- a/finch/gntrequest.h Sun Jan 13 00:29:56 2008 +0000 +++ b/finch/gntrequest.h Wed Feb 06 03:35:04 2008 +0000 @@ -27,6 +27,7 @@ #define _GNT_REQUEST_H #include "request.h" +#include "gnt.h" /********************************************************************** * @name GNT Request API @@ -56,6 +57,15 @@ */ void finch_request_save_in_prefs(gpointer null, PurpleRequestFields *fields); +/** + * Create a widget field for a request-field. + * + * @param field The request field. + * + * @return A GntWidget for the request field. + * @since 2.4.0 + */ +GntWidget *finch_request_field_get_widget(PurpleRequestField *field); /*@}*/ #endif diff -r f182cf94145c -r 00eaff9396ec finch/gntroomlist.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/finch/gntroomlist.c Wed Feb 06 03:35:04 2008 +0000 @@ -0,0 +1,420 @@ +/** + * @file gntroomlist.c GNT Room List API + * @ingroup finch + */ + +/* finch + * + * Finch is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA + */ + +#include "finch.h" + +#include "gntrequest.h" +#include "gntroomlist.h" + +#include "gntbox.h" +#include "gntbutton.h" +#include "gntcombobox.h" +#include "gnttextview.h" +#include "gnttree.h" +#include "gntwindow.h" + +#include "debug.h" + +#define PREF_ROOT "/finch/roomlist" + +/* Yes, just one roomlist at a time. Let's not get greedy. Aight? */ +struct _FinchRoomlist +{ + GntWidget *window; + + GntWidget *accounts; + GntWidget *tree; + GntWidget *details; + + GntWidget *getlist; + GntWidget *add; + GntWidget *join; + GntWidget *stop; + GntWidget *close; + + PurpleAccount *account; + PurpleRoomlist *roomlist; +} froomlist; + +typedef struct _FinchRoomlist FinchRoomlist; + +static void +unset_roomlist(gpointer null) +{ + froomlist.window = NULL; + if (froomlist.roomlist) { + purple_roomlist_unref(froomlist.roomlist); + froomlist.roomlist = NULL; + } + froomlist.account = NULL; + froomlist.tree = NULL; +} + +static void +update_roomlist(PurpleRoomlist *list) +{ + if (froomlist.roomlist == list) + return; + + if (froomlist.roomlist) + purple_roomlist_unref(froomlist.roomlist); + + if ((froomlist.roomlist = list) != NULL) + purple_roomlist_ref(list); +} + +static void fl_stop(GntWidget *button, gpointer null) +{ + if (froomlist.roomlist && + purple_roomlist_get_in_progress(froomlist.roomlist)) + purple_roomlist_cancel_get_list(froomlist.roomlist); +} + +static void fl_get_list(GntWidget *button, gpointer null) +{ + PurpleAccount *account = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(froomlist.accounts)); + PurpleConnection *gc = purple_account_get_connection(account); + + if (!gc) + return; + + update_roomlist(NULL); + froomlist.roomlist = purple_roomlist_get_list(gc); + gnt_box_give_focus_to_child(GNT_BOX(froomlist.window), froomlist.tree); +} + +static void fl_add_chat(GntWidget *button, gpointer null) +{ + char *name; + PurpleRoomlistRoom *room = gnt_tree_get_selection_data(GNT_TREE(froomlist.tree)); + PurpleConnection *gc = purple_account_get_connection(froomlist.account); + PurplePluginProtocolInfo *prpl_info = NULL; + + if (gc == NULL || room == NULL) + return; + + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc)); + + if(prpl_info != NULL && prpl_info->roomlist_room_serialize) + name = prpl_info->roomlist_room_serialize(room); + else + name = g_strdup(purple_roomlist_room_get_name(room)); + + purple_blist_request_add_chat(froomlist.account, NULL, NULL, name); + + g_free(name); +} + +static void fl_close(GntWidget *button, gpointer null) +{ + gnt_widget_destroy(froomlist.window); +} + +static void +roomlist_activated(GntWidget *widget) +{ + PurpleRoomlistRoom *room = gnt_tree_get_selection_data(GNT_TREE(widget)); + if (!room) + return; + + switch (purple_roomlist_room_get_type(room)) { + case PURPLE_ROOMLIST_ROOMTYPE_ROOM: + purple_roomlist_room_join(froomlist.roomlist, room); + break; + case PURPLE_ROOMLIST_ROOMTYPE_CATEGORY: + if (!room->expanded_once) { + purple_roomlist_expand_category(froomlist.roomlist, room); + room->expanded_once = TRUE; + } + break; + } + gnt_tree_set_expanded(GNT_TREE(widget), room, TRUE); +} + +static void +roomlist_selection_changed(GntWidget *widget, gpointer old, gpointer current, gpointer null) +{ + GList *iter, *field; + PurpleRoomlistRoom *room = current; + GntTextView *tv = GNT_TEXT_VIEW(froomlist.details); + gboolean first = TRUE; + + gnt_text_view_clear(tv); + + if (!room) + return; + + for (iter = purple_roomlist_room_get_fields(room), + field = purple_roomlist_get_fields(froomlist.roomlist); + iter && field; + iter = iter->next, field = field->next) { + PurpleRoomlistField *f = field->data; + char *label = NULL; + + if (purple_roomlist_field_get_hidden(f)) { + continue; + } + + if (!first) + gnt_text_view_append_text_with_flags(tv, "\n", GNT_TEXT_FLAG_NORMAL); + + gnt_text_view_append_text_with_flags(tv, + purple_roomlist_field_get_label(f), GNT_TEXT_FLAG_BOLD); + gnt_text_view_append_text_with_flags(tv, ": ", GNT_TEXT_FLAG_BOLD); + + switch (purple_roomlist_field_get_type(f)) { + case PURPLE_ROOMLIST_FIELD_BOOL: + label = g_strdup(iter->data ? "True" : "False"); + break; + case PURPLE_ROOMLIST_FIELD_INT: + label = g_strdup_printf("%d", (int)iter->data); + break; + case PURPLE_ROOMLIST_FIELD_STRING: + label = g_strdup(iter->data); + break; + } + gnt_text_view_append_text_with_flags(tv, label, GNT_TEXT_FLAG_NORMAL); + g_free(label); + first = FALSE; + } + + if (purple_roomlist_room_get_type(room) == PURPLE_ROOMLIST_ROOMTYPE_CATEGORY) { + if (!first) + gnt_text_view_append_text_with_flags(tv, "\n", GNT_TEXT_FLAG_NORMAL); + gnt_text_view_append_text_with_flags(tv, + _("Hit 'Enter' to find more rooms of this category."), + GNT_TEXT_FLAG_NORMAL); + } +} + +static void +roomlist_account_changed(GntWidget *widget, gpointer old, gpointer current, gpointer null) +{ + if (froomlist.account == current) { + return; + } + + froomlist.account = current; + if (froomlist.roomlist) { + if (purple_roomlist_get_in_progress(froomlist.roomlist)) + purple_roomlist_cancel_get_list(froomlist.roomlist); + update_roomlist(NULL); + } + + gnt_tree_remove_all(GNT_TREE(froomlist.tree)); + gnt_widget_draw(froomlist.tree); +} + +static void +reset_account_list(PurpleAccount *account) +{ + GList *list; + GntComboBox *accounts = GNT_COMBO_BOX(froomlist.accounts); + gnt_combo_box_remove_all(accounts); + for (list = purple_connections_get_all(); list; list = list->next) { + PurplePluginProtocolInfo *prpl_info = NULL; + PurpleConnection *gc = list->data; + + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc)); + if (prpl_info->roomlist_get_list != NULL) { + PurpleAccount *account = purple_connection_get_account(gc); + char *text = g_strdup_printf("%s (%s)", + purple_account_get_username(account), + purple_account_get_protocol_name(account)); + gnt_combo_box_add_data(accounts, account, text); + g_free(text); + } + } +} + +static void +size_changed_cb(GntWidget *widget, int oldw, int oldh) +{ + int w, h; + gnt_widget_get_size(widget, &w, &h); + purple_prefs_set_int(PREF_ROOT "/size/width", w); + purple_prefs_set_int(PREF_ROOT "/size/height", h); +} + +static void +setup_roomlist(PurpleAccount *account) +{ + GntWidget *window, *tree, *hbox, *accounts; + int iter; + struct { + const char *label; + GCallback callback; + GntWidget **widget; + } buttons[] = { + {_("Stop"), G_CALLBACK(fl_stop), &froomlist.stop}, + {_("Get"), G_CALLBACK(fl_get_list), &froomlist.getlist}, + {_("Add"), G_CALLBACK(fl_add_chat), &froomlist.add}, + {_("Close"), G_CALLBACK(fl_close), &froomlist.close}, + {NULL, NULL, NULL} + }; + + if (froomlist.window) + return; + + froomlist.window = window = gnt_window_new(); + g_object_set(G_OBJECT(window), "vertical", TRUE, NULL); + gnt_box_set_pad(GNT_BOX(window), 0); + gnt_box_set_title(GNT_BOX(window), _("Room List")); + gnt_box_set_alignment(GNT_BOX(window), GNT_ALIGN_MID); + + froomlist.accounts = accounts = gnt_combo_box_new(); + reset_account_list(account); + gnt_box_add_widget(GNT_BOX(window), accounts); + g_signal_connect(G_OBJECT(accounts), "selection-changed", + G_CALLBACK(roomlist_account_changed), NULL); + froomlist.account = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(accounts)); + + froomlist.tree = tree = gnt_tree_new_with_columns(2); + gnt_tree_set_show_title(GNT_TREE(tree), TRUE); + g_signal_connect(G_OBJECT(tree), "activate", G_CALLBACK(roomlist_activated), NULL); + gnt_tree_set_column_titles(GNT_TREE(tree), _("Name"), ""); + gnt_tree_set_show_separator(GNT_TREE(tree), FALSE); + gnt_tree_set_col_width(GNT_TREE(tree), 1, 1); + gnt_tree_set_column_resizable(GNT_TREE(tree), 1, FALSE); + gnt_tree_set_search_column(GNT_TREE(tree), 0); + + gnt_box_add_widget(GNT_BOX(window), tree); + + froomlist.details = gnt_text_view_new(); + gnt_text_view_set_flag(GNT_TEXT_VIEW(froomlist.details), GNT_TEXT_VIEW_TOP_ALIGN); + gnt_box_add_widget(GNT_BOX(window), froomlist.details); + gnt_widget_set_size(froomlist.details, -1, 8); + + hbox = gnt_hbox_new(FALSE); + gnt_box_add_widget(GNT_BOX(window), hbox); + + for (iter = 0; buttons[iter].label; iter++) { + GntWidget *button = gnt_button_new(buttons[iter].label); + gnt_box_add_widget(GNT_BOX(hbox), button); + g_signal_connect(G_OBJECT(button), "activate", buttons[iter].callback, NULL); + *buttons[iter].widget = button; + gnt_text_view_attach_scroll_widget(GNT_TEXT_VIEW(froomlist.details), button); + } + + g_signal_connect(G_OBJECT(tree), "selection-changed", G_CALLBACK(roomlist_selection_changed), NULL); + + g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(unset_roomlist), NULL); +} + +static void +fl_show_with_account(PurpleAccount *account) +{ + setup_roomlist(account); + g_signal_handlers_disconnect_matched(G_OBJECT(froomlist.window), G_SIGNAL_MATCH_FUNC, + 0, 0, NULL, G_CALLBACK(size_changed_cb), NULL); + gnt_widget_show(froomlist.window); + gnt_screen_resize_widget(froomlist.window, + purple_prefs_get_int(PREF_ROOT "/size/width"), + purple_prefs_get_int(PREF_ROOT "/size/height")); + g_signal_connect(G_OBJECT(froomlist.window), "size_changed", G_CALLBACK(size_changed_cb), NULL); + gnt_window_present(froomlist.window); +} + +static void +fl_create(PurpleRoomlist *list) +{ + FINCH_SET_DATA(list, &froomlist); + setup_roomlist(NULL); + update_roomlist(list); +} + +static void +fl_set_fields(PurpleRoomlist *list, GList *fields) +{ +} + +static void +fl_add_room(PurpleRoomlist *roomlist, PurpleRoomlistRoom *room) +{ + gboolean category; + if (froomlist.roomlist != roomlist) + return; + + category = (purple_roomlist_room_get_type(room) == PURPLE_ROOMLIST_ROOMTYPE_CATEGORY); + gnt_tree_remove(GNT_TREE(froomlist.tree), room); + gnt_tree_add_row_after(GNT_TREE(froomlist.tree), room, + gnt_tree_create_row(GNT_TREE(froomlist.tree), + purple_roomlist_room_get_name(room), + category ? "<" : ""), + purple_roomlist_room_get_parent(room), NULL); + gnt_tree_set_expanded(GNT_TREE(froomlist.tree), room, !category); +} + +static void +fl_destroy(PurpleRoomlist *list) +{ + if (!froomlist.window) + return; + + if (froomlist.roomlist == list) { + froomlist.roomlist = NULL; + gnt_tree_remove_all(GNT_TREE(froomlist.tree)); + gnt_widget_draw(froomlist.tree); + } +} + +static PurpleRoomlistUiOps ui_ops = +{ + fl_show_with_account, /* void (*show_with_account)(PurpleAccount *account); **< Force the ui to pop up a dialog and get the list */ + fl_create, /* void (*create)(PurpleRoomlist *list); **< A new list was created. */ + fl_set_fields, /* void (*set_fields)(PurpleRoomlist *list, GList *fields); **< Sets the columns. */ + fl_add_room, /* void (*add_room)(PurpleRoomlist *list, PurpleRoomlistRoom *room); **< Add a room to the list. */ + NULL, /* void (*in_progress)(PurpleRoomlist *list, gboolean flag); **< Are we fetching stuff still? */ + fl_destroy, /* void (*destroy)(PurpleRoomlist *list); **< We're destroying list. */ + + NULL, /* void (*_purple_reserved1)(void); */ + NULL, /* void (*_purple_reserved2)(void); */ + NULL, /* void (*_purple_reserved3)(void); */ + NULL /* void (*_purple_reserved4)(void); */ +}; + +PurpleRoomlistUiOps *finch_roomlist_get_ui_ops(void) +{ + return &ui_ops; +} + +void finch_roomlist_show_all(void) +{ + purple_roomlist_show_with_account(NULL); +} + +void finch_roomlist_init(void) +{ + purple_prefs_add_none(PREF_ROOT); + purple_prefs_add_none(PREF_ROOT "/size"); + purple_prefs_add_int(PREF_ROOT "/size/width", 60); + purple_prefs_add_int(PREF_ROOT "/size/height", 15); +} + +void finch_roomlist_uninit(void) +{ +} + diff -r f182cf94145c -r 00eaff9396ec finch/gntroomlist.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/finch/gntroomlist.h Wed Feb 06 03:35:04 2008 +0000 @@ -0,0 +1,61 @@ +/** + * @file gntroomlist.h GNT Room List API + * @ingroup finch + */ + +/* finch + * + * Finch is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA + */ +#ifndef _GNT_ROOMLIST_H +#define _GNT_ROOMLIST_H + +#include "roomlist.h" + +/********************************************************************** + * @name GNT Room List API + **********************************************************************/ +/*@{*/ + +/** + * Initialize the roomlist subsystem. + */ +void finch_roomlist_init(void); + +/** + * Get the ui-functions. + * + * @return The PurpleRoomlistUiOps structure populated with the appropriate functions. + */ +PurpleRoomlistUiOps *finch_roomlist_get_ui_ops(void); + +/** + * Show the roomlist dialog. + */ +void finch_roomlist_show_all(void); + +/** + * Uninitialize the roomlist subsystem. + */ +void finch_roomlist_uninit(void); + +/*@}*/ + +#endif + diff -r f182cf94145c -r 00eaff9396ec finch/gntsound.c --- a/finch/gntsound.c Sun Jan 13 00:29:56 2008 +0000 +++ b/finch/gntsound.c Wed Feb 06 03:35:04 2008 +0000 @@ -23,7 +23,6 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */ -#include "internal.h" #include "finch.h" #ifdef _WIN32 @@ -142,13 +141,15 @@ char *nick = NULL; char *name = NULL; gboolean ret = FALSE; + PurpleAccount *account; + chat = purple_conversation_get_chat_data(conv); - if (chat == NULL) return ret; - nick = g_strdup(purple_normalize(conv->account, chat->nick)); - name = g_strdup(purple_normalize(conv->account, aname)); + account = purple_conversation_get_account(conv); + nick = g_strdup(purple_normalize(account, chat->nick)); + name = g_strdup(purple_normalize(account, aname)); if (g_utf8_collate(nick, name) == 0) ret = TRUE; @@ -286,7 +287,7 @@ } static void * -finch_sound_get_handle() +finch_sound_get_handle(void) { static int handle; diff -r f182cf94145c -r 00eaff9396ec finch/gntui.c --- a/finch/gntui.c Sun Jan 13 00:29:56 2008 +0000 +++ b/finch/gntui.c Wed Feb 06 03:35:04 2008 +0000 @@ -19,7 +19,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */ -#include "internal.h" +#include "finch.h" #include "gntui.h" @@ -30,11 +30,13 @@ #include "gntconv.h" #include "gntdebug.h" #include "gntft.h" +#include "gntlog.h" #include "gntnotify.h" #include "gntplugin.h" #include "gntpounce.h" #include "gntprefs.h" #include "gntrequest.h" +#include "gntroomlist.h" #include "gntstatus.h" #include "gntsound.h" @@ -71,14 +73,24 @@ finch_notify_init(); purple_notify_set_ui_ops(finch_notify_get_ui_ops()); + /* Request */ finch_request_init(); purple_request_set_ui_ops(finch_request_get_ui_ops()); + /* Pounce */ finch_pounces_init(); + /* Log */ + finch_log_init(); + + /* File transfer */ finch_xfers_init(); purple_xfers_set_ui_ops(finch_xfers_get_ui_ops()); + /* Roomlist */ + finch_roomlist_init(); + purple_roomlist_set_ui_ops(finch_roomlist_get_ui_ops()); + gnt_register_action(_("Accounts"), finch_accounts_show_all); gnt_register_action(_("Buddy List"), finch_blist_show); gnt_register_action(_("Buddy Pounces"), finch_pounces_manager_show); @@ -86,6 +98,7 @@ gnt_register_action(_("Debug Window"), finch_debug_window_show); gnt_register_action(_("File Transfers"), finch_xfer_dialog_show); gnt_register_action(_("Plugins"), finch_plugins_show_all); + gnt_register_action(_("Room List"), finch_roomlist_show_all); gnt_register_action(_("Sounds"), finch_sounds_show_all); gnt_register_action(_("Preferences"), finch_prefs_show_all); gnt_register_action(_("Statuses"), finch_savedstatus_show_all); @@ -115,9 +128,14 @@ finch_pounces_uninit(); + finch_log_uninit(); + finch_xfers_uninit(); purple_xfers_set_ui_ops(NULL); + finch_roomlist_uninit(); + purple_roomlist_set_ui_ops(NULL); + gnt_quit(); #endif } diff -r f182cf94145c -r 00eaff9396ec finch/libgnt/gnt.h --- a/finch/libgnt/gnt.h Sun Jan 13 00:29:56 2008 +0000 +++ b/finch/libgnt/gnt.h Wed Feb 06 03:35:04 2008 +0000 @@ -141,7 +141,7 @@ * @param label The user-visible label for the action. * @param callback The callback function for the action. */ -void gnt_register_action(const char *label, void (*callback)()); +void gnt_register_action(const char *label, void (*callback)(void)); /** * Show a menu. diff -r f182cf94145c -r 00eaff9396ec finch/libgnt/gntbindable.c --- a/finch/libgnt/gntbindable.c Sun Jan 13 00:29:56 2008 +0000 +++ b/finch/libgnt/gntbindable.c Wed Feb 06 03:35:04 2008 +0000 @@ -45,7 +45,7 @@ } rebind_info; static void -gnt_bindable_free_rebind_info() +gnt_bindable_free_rebind_info(void) { g_free(rebind_info.name); g_free(rebind_info.keys); diff -r f182cf94145c -r 00eaff9396ec finch/libgnt/gntcolors.c --- a/finch/libgnt/gntcolors.c Sun Jan 13 00:29:56 2008 +0000 +++ b/finch/libgnt/gntcolors.c Wed Feb 06 03:35:04 2008 +0000 @@ -40,7 +40,7 @@ } colors[GNT_TOTAL_COLORS]; static void -backup_colors() +backup_colors(void) { short i; for (i = 0; i < GNT_TOTAL_COLORS; i++) @@ -51,13 +51,13 @@ } static gboolean -can_use_custom_color() +can_use_custom_color(void) { return (gnt_style_get_bool(GNT_STYLE_COLOR, FALSE) && can_change_color()); } static void -restore_colors() +restore_colors(void) { short i; for (i = 0; i < GNT_TOTAL_COLORS; i++) diff -r f182cf94145c -r 00eaff9396ec finch/libgnt/gntentry.c --- a/finch/libgnt/gntentry.c Sun Jan 13 00:29:56 2008 +0000 +++ b/finch/libgnt/gntentry.c Wed Feb 06 03:35:04 2008 +0000 @@ -916,7 +916,7 @@ } static GntEntryKillRing * -new_killring() +new_killring(void) { GntEntryKillRing *kr = g_new0(GntEntryKillRing, 1); kr->buffer = g_string_new(NULL); diff -r f182cf94145c -r 00eaff9396ec finch/libgnt/gntmain.c --- a/finch/libgnt/gntmain.c Sun Jan 13 00:29:56 2008 +0000 +++ b/finch/libgnt/gntmain.c Wed Feb 06 03:35:04 2008 +0000 @@ -72,7 +72,7 @@ static void setup_io(void); -static gboolean refresh_screen(); +static gboolean refresh_screen(void); static GntWM *wm; static GntClipboard *clipboard; @@ -326,7 +326,7 @@ } static gboolean -refresh_screen() +refresh_screen(void) { gnt_bindable_perform_action_named(GNT_BINDABLE(wm), "refresh-screen", NULL); return FALSE; @@ -363,7 +363,7 @@ } static void -ask_before_exit() +ask_before_exit(void) { static GntWidget *win = NULL; GntWidget *bbox, *button; @@ -412,7 +412,7 @@ #ifdef SIGWINCH case SIGWINCH: erase(); - g_idle_add(refresh_screen, NULL); + g_idle_add((GSourceFunc)refresh_screen, NULL); if (org_winch_handler) org_winch_handler(sig); signal(SIGWINCH, sighandler); @@ -430,7 +430,7 @@ } static void -init_wm() +init_wm(void) { const char *name = gnt_style_get(GNT_STYLE_WM); gpointer handle; @@ -614,7 +614,7 @@ gnt_wm_update_window(wm, widget); } -void gnt_register_action(const char *label, void (*callback)()) +void gnt_register_action(const char *label, void (*callback)(void)) { GntAction *action = g_new0(GntAction, 1); action->label = g_strdup(label); diff -r f182cf94145c -r 00eaff9396ec finch/libgnt/gnttextview.c --- a/finch/libgnt/gnttextview.c Sun Jan 13 00:29:56 2008 +0000 +++ b/finch/libgnt/gnttextview.c Wed Feb 06 03:35:04 2008 +0000 @@ -830,7 +830,7 @@ static void -cleanup_pageditor() +cleanup_pageditor(void) { unlink(pageditor.file); g_free(pageditor.file); diff -r f182cf94145c -r 00eaff9396ec finch/libgnt/gnttree.c --- a/finch/libgnt/gnttree.c Sun Jan 13 00:29:56 2008 +0000 +++ b/finch/libgnt/gnttree.c Wed Feb 06 03:35:04 2008 +0000 @@ -39,6 +39,7 @@ { PROP_0, PROP_COLUMNS, + PROP_EXPANDER, }; enum @@ -59,6 +60,7 @@ GCompareFunc compare; int lastvisible; + int expander_level; }; #define TAB_SIZE 3 @@ -338,7 +340,7 @@ row->isselected ? 'X' : ' '); fl = 4; } - else if (row->parent == NULL && row->child) + else if (find_depth(row) < tree->priv->expander_level && row->child) { if (row->collapsed) { @@ -682,7 +684,7 @@ GntTreeRow *row = tree->current; int dist; - if (!row->parent || SEARCHING(tree)) + if (!row || !row->parent || SEARCHING(tree)) return FALSE; tree->current = row->parent; @@ -951,6 +953,11 @@ case PROP_COLUMNS: _gnt_tree_init_internals(tree, g_value_get_int(value)); break; + case PROP_EXPANDER: + if (tree->priv->expander_level == g_value_get_int(value)) + break; + tree->priv->expander_level = g_value_get_int(value); + g_object_notify(obj, "expander-level"); default: break; } @@ -965,6 +972,9 @@ case PROP_COLUMNS: g_value_set_int(value, tree->ncol); break; + case PROP_EXPANDER: + g_value_set_int(value, tree->priv->expander_level); + break; default: break; } @@ -995,6 +1005,14 @@ G_PARAM_READWRITE|G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB ) ); + g_object_class_install_property(gclass, + PROP_EXPANDER, + g_param_spec_int("expander-level", "Expander level", + "Number of levels to show expander in the tree.", + 0, G_MAXINT, 1, + G_PARAM_READWRITE|G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB + ) + ); signals[SIG_SELECTION_CHANGED] = g_signal_new("selection-changed", @@ -1618,6 +1636,7 @@ { GntWidget *widget = g_object_new(GNT_TYPE_TREE, "columns", col, + "expander-level", 1, NULL); return widget; @@ -1841,3 +1860,9 @@ tree->priv->search_func = func; } +gpointer gnt_tree_get_parent_key(GntTree *tree, gpointer key) +{ + GntTreeRow *row = g_hash_table_lookup(tree->hash, key); + return (row && row->parent) ? row->parent->key : NULL; +} + diff -r f182cf94145c -r 00eaff9396ec finch/libgnt/gnttree.h --- a/finch/libgnt/gnttree.h Sun Jan 13 00:29:56 2008 +0000 +++ b/finch/libgnt/gnttree.h Wed Feb 06 03:35:04 2008 +0000 @@ -332,7 +332,7 @@ * @param color The color * @since 2.4.0 */ -void gnt_tree_set_row_color(GntTree *, void *, int); +void gnt_tree_set_row_color(GntTree *tree, void *key, int color); /** * Select a row. @@ -575,6 +575,17 @@ void gnt_tree_set_search_function(GntTree *tree, gboolean (*func)(GntTree *tree, gpointer key, const char *search, const char *current)); +/** + * Get the parent key for a row. + * + * @param tree The tree + * @param key The key for the row. + * + * @return The key of the parent row. + * @since 2.4.0 + */ +gpointer gnt_tree_get_parent_key(GntTree *tree, gpointer key); + G_END_DECLS #endif /* GNT_TREE_H */ diff -r f182cf94145c -r 00eaff9396ec finch/libgnt/gntwm.c --- a/finch/libgnt/gntwm.c Sun Jan 13 00:29:56 2008 +0000 +++ b/finch/libgnt/gntwm.c Wed Feb 06 03:35:04 2008 +0000 @@ -135,7 +135,7 @@ * to expose the entire character, it is not always redrawn. */ static void -work_around_for_ncurses_bug() +work_around_for_ncurses_bug(void) { #ifndef NO_WIDECHAR PANEL *panel = NULL; @@ -183,7 +183,7 @@ } static void -update_act_msg() +update_act_msg(void) { GntWidget *label; GList *iter; @@ -388,10 +388,10 @@ } static void -switch_window(GntWM *wm, int direction) +switch_window(GntWM *wm, int direction, gboolean urgent) { GntWidget *w = NULL, *wid = NULL; - int pos; + int pos, orgpos; if (wm->_list.window || wm->menu) return; @@ -404,15 +404,20 @@ } w = wm->cws->ordered->data; - pos = g_list_index(wm->cws->list, w); - pos += direction; + orgpos = pos = g_list_index(wm->cws->list, w); + + do { + pos += direction; - if (pos < 0) - wid = g_list_last(wm->cws->list)->data; - else if (pos >= g_list_length(wm->cws->list)) - wid = wm->cws->list->data; - else if (pos >= 0) - wid = g_list_nth_data(wm->cws->list, pos); + if (pos < 0) { + wid = g_list_last(wm->cws->list)->data; + pos = g_list_length(wm->cws->list) - 1; + } else if (pos >= g_list_length(wm->cws->list)) { + wid = wm->cws->list->data; + pos = 0; + } else + wid = g_list_nth_data(wm->cws->list, pos); + } while (urgent && !GNT_WIDGET_IS_FLAG_SET(wid, GNT_WIDGET_URGENT) && pos != orgpos); gnt_wm_raise_window(wm, wid); } @@ -421,7 +426,7 @@ window_next(GntBindable *bindable, GList *null) { GntWM *wm = GNT_WM(bindable); - switch_window(wm, 1); + switch_window(wm, 1, FALSE); return TRUE; } @@ -429,7 +434,7 @@ window_prev(GntBindable *bindable, GList *null) { GntWM *wm = GNT_WM(bindable); - switch_window(wm, -1); + switch_window(wm, -1, FALSE); return TRUE; } @@ -1202,6 +1207,22 @@ return ignore_keys ? !(ignore_keys = FALSE) : FALSE; } +static gboolean +window_next_urgent(GntBindable *bindable, GList *n) +{ + GntWM *wm = GNT_WM(bindable); + switch_window(wm, 1, TRUE); + return TRUE; +} + +static gboolean +window_prev_urgent(GntBindable *bindable, GList *n) +{ + GntWM *wm = GNT_WM(bindable); + switch_window(wm, -1, TRUE); + return TRUE; +} + #ifdef USE_PYTHON static void python_script_selected(GntFileSel *fs, const char *path, const char *f, gpointer n) @@ -1323,6 +1344,7 @@ { int i; GObjectClass *gclass = G_OBJECT_CLASS(klass); + char key[32]; gclass->dispose = gnt_wm_destroy; @@ -1482,10 +1504,15 @@ "\033" "\\", NULL); gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "help-for-window", help_for_window, "\033" "|", NULL); - gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "ignore-keys-start", ignore_keys_start, + gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "ignore-keys-start", ignore_keys_start, GNT_KEY_CTRL_G, NULL); - gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "ignore-keys-end", ignore_keys_end, + gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "ignore-keys-end", ignore_keys_end, "\033" GNT_KEY_CTRL_G, NULL); + gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "window-next-urgent", window_next_urgent, + "\033" "\t", NULL); + snprintf(key, sizeof(key), "\033%s", GNT_KEY_BACK_TAB); + gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "window-prev-urgent", window_prev_urgent, + key[1] ? key : NULL, NULL); #ifdef USE_PYTHON gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "run-python", run_python, GNT_KEY_F3, NULL); diff -r f182cf94145c -r 00eaff9396ec finch/libgnt/gntwm.h --- a/finch/libgnt/gntwm.h Sun Jan 13 00:29:56 2008 +0000 +++ b/finch/libgnt/gntwm.h Wed Feb 06 03:35:04 2008 +0000 @@ -73,7 +73,7 @@ typedef struct _GntAction { const char *label; - void (*callback)(); + void (*callback)(void); } GntAction; struct _GntWM diff -r f182cf94145c -r 00eaff9396ec finch/libgnt/pygnt/test.py --- a/finch/libgnt/pygnt/test.py Sun Jan 13 00:29:56 2008 +0000 +++ b/finch/libgnt/pygnt/test.py Wed Feb 06 03:35:04 2008 +0000 @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python import gobject import gnt diff -r f182cf94145c -r 00eaff9396ec finch/plugins/Makefile.am --- a/finch/plugins/Makefile.am Sun Jan 13 00:29:56 2008 +0000 +++ b/finch/plugins/Makefile.am Wed Feb 06 03:35:04 2008 +0000 @@ -1,7 +1,8 @@ gntclipboard_la_LDFLAGS = -module -avoid-version gntgf_la_LDFLAGS = -module -avoid-version gnthistory_la_LDFLAGS = -module -avoid-version -gntlastlog_la_LDFLAGS = -module -avoid-version +gntlastlog_la_LDFLAGS = -module -avoid-version +grouping_la_LDFLAGS = -module -avoid-version if PLUGINS @@ -9,7 +10,8 @@ gntclipboard.la \ gntgf.la \ gnthistory.la \ - gntlastlog.la + gntlastlog.la \ + grouping.la plugindir = $(libdir)/finch @@ -17,6 +19,7 @@ gntgf_la_SOURCES = gntgf.c gnthistory_la_SOURCES = gnthistory.c gntlastlog_la_SOURCES = lastlog.c +grouping_la_SOURCES = grouping.c gntclipboard_la_CFLAGS = $(X11_CFLAGS) gntgf_la_CFLAGS = $(X11_CFLAGS) @@ -25,6 +28,7 @@ gntgf_la_LIBADD = $(GLIB_LIBS) $(X11_LIBS) $(top_builddir)/finch/libgnt/libgnt.la gnthistory_la_LIBADD = $(GLIB_LIBS) gntlastlog_la_LIBADD = $(GLIB_LIBS) +grouping_la_LIBADD = $(GLIB_LIBS) $(top_builddir)/finch/libgnt/libgnt.la endif # PLUGINS diff -r f182cf94145c -r 00eaff9396ec finch/plugins/gntgf.c --- a/finch/plugins/gntgf.c Sun Jan 13 00:29:56 2008 +0000 +++ b/finch/plugins/gntgf.c Wed Feb 06 03:35:04 2008 +0000 @@ -122,7 +122,7 @@ } static void -urgent() +urgent(void) { /* This is from deryni/tuomov's urgent_test.c */ Display *dpy; @@ -322,7 +322,7 @@ } static GntWidget * -config_frame() +config_frame(void) { GntWidget *window, *tree, *check; int i; diff -r f182cf94145c -r 00eaff9396ec finch/plugins/gnthistory.c --- a/finch/plugins/gnthistory.c Sun Jan 13 00:29:56 2008 +0000 +++ b/finch/plugins/gnthistory.c Wed Feb 06 03:35:04 2008 +0000 @@ -51,8 +51,7 @@ PurpleMessageFlags mflag; convtype = purple_conversation_get_type(c); - if (convtype == PURPLE_CONV_TYPE_IM) - { + if (convtype == PURPLE_CONV_TYPE_IM) { GSList *buddies; GSList *cur; @@ -62,17 +61,17 @@ return; /* Find buddies for this conversation. */ - buddies = purple_find_buddies(account, name); + buddies = purple_find_buddies(account, name); /* If we found at least one buddy, save the first buddy's alias. */ if (buddies != NULL) alias = purple_buddy_get_contact_alias((PurpleBuddy *)buddies->data); - for (cur = buddies; cur != NULL; cur = cur->next) - { - PurpleBlistNode *node = cur->data; - if ((node != NULL) && ((node->prev != NULL) || (node->next != NULL))) - { + for (cur = buddies; cur != NULL; cur = cur->next) { + PurpleBlistNode *node = cur->data; + if ((node != NULL) && + ((purple_blist_node_get_sibling_prev(node) != NULL) || + (purple_blist_node_get_sibling_next(node) != NULL))) { PurpleBlistNode *node2; alias = purple_buddy_get_contact_alias((PurpleBuddy *)node); @@ -80,26 +79,24 @@ /* We've found a buddy that matches this conversation. It's part of a * PurpleContact with more than one PurpleBuddy. Loop through the PurpleBuddies * in the contact and get all the logs. */ - for (node2 = node->parent->child ; node2 != NULL ; node2 = node2->next) - { + for (node2 = purple_blist_node_get_first_child(purple_blist_node_get_parent(node)); + node2 != NULL ; node2 = purple_blist_node_get_sibling_next(node2)) { logs = g_list_concat( - purple_log_get_logs(PURPLE_LOG_IM, - purple_buddy_get_name((PurpleBuddy *)node2), - purple_buddy_get_account((PurpleBuddy *)node2)), - logs); + purple_log_get_logs(PURPLE_LOG_IM, + purple_buddy_get_name((PurpleBuddy *)node2), + purple_buddy_get_account((PurpleBuddy *)node2)), + logs); } break; - } - } - g_slist_free(buddies); + } + } + g_slist_free(buddies); if (logs == NULL) logs = purple_log_get_logs(PURPLE_LOG_IM, name, account); else logs = g_list_sort(logs, purple_log_compare); - } - else if (convtype == PURPLE_CONV_TYPE_CHAT) - { + } else if (convtype == PURPLE_CONV_TYPE_CHAT) { /* If we're not logging, don't show anything. * Otherwise, we might show a very old log. */ if (!purple_prefs_get_bool("/purple/logging/log_chats")) @@ -115,7 +112,7 @@ history = purple_log_read((PurpleLog*)logs->data, &flags); header = g_strdup_printf(_("Conversation with %s on %s:
"), alias, - purple_date_format_full(localtime(&((PurpleLog *)logs->data)->time))); + purple_date_format_full(localtime(&((PurpleLog *)logs->data)->time))); purple_conversation_write(c, "", header, mflag, time(NULL)); g_free(header); diff -r f182cf94145c -r 00eaff9396ec finch/plugins/grouping.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/finch/plugins/grouping.c Wed Feb 06 03:35:04 2008 +0000 @@ -0,0 +1,278 @@ +/** + * @file grouping.c Provides different grouping options. + * + * Copyright (C) 2008 Sadrul Habib Chowdhury + * + * 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 + */ + +#define PURPLE_PLUGIN + +#include "internal.h" +#include "purple.h" + +#include "gntblist.h" +#include "gntplugin.h" + +#include "gnttree.h" + +/** + * Online/Offline + */ +static PurpleBlistNode online = {.type = PURPLE_BLIST_OTHER_NODE}, + offline = {.type = PURPLE_BLIST_OTHER_NODE}; + +static gboolean on_offline_init() +{ + GntTree *tree = finch_blist_get_tree(); + + gnt_tree_add_row_after(tree, &online, + gnt_tree_create_row(tree, _("Online")), NULL, NULL); + gnt_tree_add_row_after(tree, &offline, + gnt_tree_create_row(tree, _("Offline")), NULL, &online); + + return TRUE; +} + +static gboolean on_offline_can_add_node(PurpleBlistNode *node) +{ + switch (purple_blist_node_get_type(node)) { + case PURPLE_BLIST_CONTACT_NODE: + { + PurpleContact *contact = (PurpleContact*)node; + if (contact->currentsize > 0) + return TRUE; + return FALSE; + } + break; + case PURPLE_BLIST_BUDDY_NODE: + { + PurpleBuddy *buddy = (PurpleBuddy*)node; + if (PURPLE_BUDDY_IS_ONLINE(buddy)) + return TRUE; + if (purple_prefs_get_bool("/finch/blist/showoffline") && + purple_account_is_connected(purple_buddy_get_account(buddy))) + return TRUE; + return FALSE; + } + break; + case PURPLE_BLIST_CHAT_NODE: + { + PurpleChat *chat = (PurpleChat*)node; + return purple_account_is_connected(purple_chat_get_account(chat)); + } + break; + default: + return FALSE; + } +} + +static gpointer on_offline_find_parent(PurpleBlistNode *node) +{ + gpointer ret = NULL; + + switch (purple_blist_node_get_type(node)) { + case PURPLE_BLIST_CONTACT_NODE: + node = (PurpleBlistNode*)purple_contact_get_priority_buddy((PurpleContact*)node); + ret = PURPLE_BUDDY_IS_ONLINE((PurpleBuddy*)node) ? &online : &offline; + break; + case PURPLE_BLIST_BUDDY_NODE: + ret = purple_blist_node_get_parent(node); + finch_blist_manager_add_node(ret); + break; + case PURPLE_BLIST_CHAT_NODE: + ret = &online; + break; + default: + break; + } + return ret; +} + +static gboolean on_offline_create_tooltip(gpointer selected_row, GString **body, char **tool_title) +{ + static FinchBlistManager *def = NULL; + PurpleBlistNode *node = selected_row; + + if (def == NULL) + def = finch_blist_manager_find("default"); + + if (purple_blist_node_get_type(node) == PURPLE_BLIST_OTHER_NODE) { + /* There should be some easy way of getting the total online count, + * or total number of chats. Doing a loop here will probably be pretty + * expensive. */ + if (body) + *body = g_string_new(node == &online ? _("Online Buddies") : _("Offline Buddies")); + return TRUE; + } else { + return def ? def->create_tooltip(selected_row, body, tool_title) : FALSE; + } +} + +static FinchBlistManager on_offline = +{ + "on-offline", + N_("Online/Offline"), + on_offline_init, + NULL, + on_offline_can_add_node, + on_offline_find_parent, + on_offline_create_tooltip, + {NULL, NULL, NULL, NULL} +}; + +/** + * Meebo-like Grouping. + */ +static PurpleBlistNode meebo = {.type = PURPLE_BLIST_OTHER_NODE}; +static gboolean meebo_init() +{ + GntTree *tree = finch_blist_get_tree(); + if (!g_list_find(gnt_tree_get_rows(tree), &meebo)) { + gnt_tree_add_row_last(tree, &meebo, + gnt_tree_create_row(tree, _("Offline")), NULL); + } + return TRUE; +} + +static gpointer meebo_find_parent(PurpleBlistNode *node) +{ + static FinchBlistManager *def = NULL; + if (def == NULL) + def = finch_blist_manager_find("default"); + + if (PURPLE_BLIST_NODE_IS_CONTACT(node)) { + PurpleBuddy *buddy = purple_contact_get_priority_buddy((PurpleContact*)node); + if (buddy && !PURPLE_BUDDY_IS_ONLINE(buddy)) { + return &meebo; + } + } + return def->find_parent(node); +} + +static FinchBlistManager meebo_group = +{ + "meebo", + N_("Meebo"), + meebo_init, + NULL, + NULL, + meebo_find_parent, + NULL, + {NULL, NULL, NULL, NULL} +}; + +/** + * No Grouping. + */ +static gboolean no_group_init() +{ + GntTree *tree = finch_blist_get_tree(); + g_object_set(G_OBJECT(tree), "expander-level", 0, NULL); + return TRUE; +} + +static gboolean no_group_uninit() +{ + GntTree *tree = finch_blist_get_tree(); + g_object_set(G_OBJECT(tree), "expander-level", 1, NULL); + return TRUE; +} + +static gboolean no_group_can_add_node(PurpleBlistNode *node) +{ + return on_offline_can_add_node(node); /* These happen to be the same */ +} + +static gpointer no_group_find_parent(PurpleBlistNode *node) +{ + gpointer ret = NULL; + + switch (purple_blist_node_get_type(node)) { + case PURPLE_BLIST_BUDDY_NODE: + ret = purple_blist_node_get_parent(node); + finch_blist_manager_add_node(ret); + break; + default: + break; + } + return ret; +} + +static FinchBlistManager no_group = +{ + "no-group", + N_("No Grouping"), + no_group_init, + no_group_uninit, + no_group_can_add_node, + no_group_find_parent, + NULL, + {NULL, NULL, NULL, NULL} +}; + +static gboolean +plugin_load(PurplePlugin *plugin) +{ + finch_blist_install_manager(&on_offline); + finch_blist_install_manager(&meebo_group); + finch_blist_install_manager(&no_group); + return TRUE; +} + +static gboolean +plugin_unload(PurplePlugin *plugin) +{ + finch_blist_uninstall_manager(&on_offline); + finch_blist_uninstall_manager(&meebo_group); + finch_blist_uninstall_manager(&no_group); + return TRUE; +} + +static PurplePluginInfo info = +{ + PURPLE_PLUGIN_MAGIC, + PURPLE_MAJOR_VERSION, + PURPLE_MINOR_VERSION, + PURPLE_PLUGIN_STANDARD, + FINCH_PLUGIN_TYPE, + 0, + NULL, + PURPLE_PRIORITY_DEFAULT, + "grouping", + N_("Grouping"), + VERSION, + N_("Provides alternate buddylist grouping options."), + N_("Provides alternate buddylist grouping options."), + "Sadrul H Chowdhury ", + PURPLE_WEBSITE, + plugin_load, + plugin_unload, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL,NULL,NULL,NULL +}; + +static void +init_plugin(PurplePlugin *plugin) +{ +} + +PURPLE_INIT_PLUGIN(ignore, init_plugin, info) + + diff -r f182cf94145c -r 00eaff9396ec libpurple/account.c --- a/libpurple/account.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/account.c Wed Feb 06 03:35:04 2008 +0000 @@ -467,7 +467,7 @@ } static void -schedule_accounts_save() +schedule_accounts_save(void) { if (save_timer == 0) save_timer = purple_timeout_add_seconds(5, save_cb, NULL); @@ -752,7 +752,7 @@ current_error = g_new0(PurpleConnectionErrorInfo, 1); current_error->type = type; - current_error->description = g_strdup(description); + current_error->description = description; set_current_error(account, current_error); } @@ -1219,7 +1219,11 @@ if (ops != NULL && ops->close_account_request != NULL) ops->close_account_request(info->ui_handle); + /* TODO: This will leak info->user_data, but there is no callback to just clean that up */ + + g_free(info->user); g_free(info); + } void @@ -1264,9 +1268,14 @@ request_auth_cb(void *data) { PurpleAccountRequestInfo *info = data; + + handles = g_list_remove(handles, info); + info->auth_cb(info->userdata); + purple_signal_emit(purple_accounts_get_handle(), "account-authorization-granted", info->account, info->user); + g_free(info->user); g_free(info); } @@ -1275,9 +1284,14 @@ request_deny_cb(void *data) { PurpleAccountRequestInfo *info = data; + + handles = g_list_remove(handles, info); + info->deny_cb(info->userdata); + purple_signal_emit(purple_accounts_get_handle(), "account-authorization-denied", info->account, info->user); + g_free(info->user); g_free(info); } @@ -2186,9 +2200,13 @@ { PurplePluginProtocolInfo *prpl_info = NULL; PurpleConnection *gc = purple_account_get_connection(account); - - if (gc != NULL && gc->prpl != NULL) - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); + PurplePlugin *prpl = NULL; + + if (gc != NULL) + prpl = purple_connection_get_prpl(gc); + + if (prpl != NULL) + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); if (prpl_info != NULL && prpl_info->add_buddy != NULL) prpl_info->add_buddy(gc, buddy, purple_buddy_get_group(buddy)); @@ -2199,10 +2217,14 @@ { PurplePluginProtocolInfo *prpl_info = NULL; PurpleConnection *gc = purple_account_get_connection(account); - - if (gc != NULL && gc->prpl != NULL) - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); - + PurplePlugin *prpl = NULL; + + if (gc != NULL) + prpl = purple_connection_get_prpl(gc); + + if (prpl != NULL) + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); + if (prpl_info) { GList *cur, *groups = NULL; @@ -2234,10 +2256,14 @@ { PurplePluginProtocolInfo *prpl_info = NULL; PurpleConnection *gc = purple_account_get_connection(account); - - if (gc != NULL && gc->prpl != NULL) - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); - + PurplePlugin *prpl = NULL; + + if (gc != NULL) + prpl = purple_connection_get_prpl(gc); + + if (prpl != NULL) + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); + if (prpl_info && prpl_info->remove_buddy) prpl_info->remove_buddy(gc, buddy, group); } @@ -2247,10 +2273,14 @@ { PurplePluginProtocolInfo *prpl_info = NULL; PurpleConnection *gc = purple_account_get_connection(account); - - if (gc != NULL && gc->prpl != NULL) - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); - + PurplePlugin *prpl = NULL; + + if (gc != NULL) + prpl = purple_connection_get_prpl(gc); + + if (prpl != NULL) + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); + if (prpl_info) { if (prpl_info->remove_buddies) prpl_info->remove_buddies(gc, buddies, groups); @@ -2271,9 +2301,13 @@ { PurplePluginProtocolInfo *prpl_info = NULL; PurpleConnection *gc = purple_account_get_connection(account); - - if (gc != NULL && gc->prpl != NULL) - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); + PurplePlugin *prpl = NULL; + + if (gc != NULL) + prpl = purple_connection_get_prpl(gc); + + if (prpl != NULL) + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); if (prpl_info && prpl_info->remove_group) prpl_info->remove_group(gc, group); @@ -2285,11 +2319,15 @@ { PurplePluginProtocolInfo *prpl_info = NULL; PurpleConnection *gc = purple_account_get_connection(account); - + PurplePlugin *prpl = NULL; + purple_account_set_password(account, new_pw); - - if (gc != NULL && gc->prpl != NULL) - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); + + if (gc != NULL) + prpl = purple_connection_get_prpl(gc); + + if (prpl != NULL) + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); if (prpl_info && prpl_info->change_passwd) prpl_info->change_passwd(gc, orig_pw, new_pw); @@ -2298,16 +2336,20 @@ gboolean purple_account_supports_offline_message(PurpleAccount *account, PurpleBuddy *buddy) { PurpleConnection *gc; - PurplePluginProtocolInfo *prpl_info; - + PurplePluginProtocolInfo *prpl_info = NULL; + PurplePlugin *prpl = NULL; + g_return_val_if_fail(account, FALSE); g_return_val_if_fail(buddy, FALSE); gc = purple_account_get_connection(account); if (gc == NULL) return FALSE; - - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); + + prpl = purple_connection_get_prpl(gc); + + if (prpl != NULL) + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); if (!prpl_info || !prpl_info->offline_message) return FALSE; diff -r f182cf94145c -r 00eaff9396ec libpurple/account.h --- a/libpurple/account.h Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/account.h Wed Feb 06 03:35:04 2008 +0000 @@ -410,37 +410,34 @@ void purple_account_set_status_types(PurpleAccount *account, GList *status_types); /** - * Activates or deactivates a status. All changes to the statuses of - * an account go through this function or purple_account_set_status_list. - * - * Only independent statuses can be deactivated with this. To deactivate - * an exclusive status, activate a different (and exclusive?) status. + * Variadic version of purple_account_set_status_list(); the variadic list + * replaces @a attrs, and should be NULL-terminated. * - * @param account The account. - * @param status_id The ID of the status. - * @param active The active state. - * @param ... Pairs of attributes for the new status passed in - * as a NULL-terminated list of id/value pairs. + * @copydoc purple_account_set_status_list() */ void purple_account_set_status(PurpleAccount *account, const char *status_id, - gboolean active, ...) G_GNUC_NULL_TERMINATED; + gboolean active, ...) G_GNUC_NULL_TERMINATED; /** * Activates or deactivates a status. All changes to the statuses of - * an account go through this function or purple_account_set_status. + * an account go through this function or purple_account_set_status(). * - * Only independent statuses can be deactivated with this. To deactivate - * an exclusive status, activate a different (and exclusive?) status. + * You can only deactivate an exclusive status by activating another exclusive + * status. So, if @a status_id is an exclusive status and @a active is @c + * FALSE, this function does nothing. * * @param account The account. * @param status_id The ID of the status. - * @param active The active state. - * @param attrs A list of attributes in key/value pairs + * @param active Whether @a status_id is to be activated (TRUE) or + * deactivated (FALSE). + * @param attrs A list of const char * attribute names followed by + * const char * attribute values for the status. + * (For example, one pair might be "message" followed + * by "hello, talk to me!".) */ void purple_account_set_status_list(PurpleAccount *account, - const char *status_id, - gboolean active, GList *attrs); + const char *status_id, gboolean active, GList *attrs); /** * Clears all protocol-specific settings on an account. diff -r f182cf94145c -r 00eaff9396ec libpurple/accountopt.h --- a/libpurple/accountopt.h Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/accountopt.h Wed Feb 06 03:35:04 2008 +0000 @@ -83,7 +83,10 @@ /*@{*/ /** - * Creates a new account option. + * Creates a new account option. If you know what @a type will be in advance, + * consider using purple_account_option_bool_new(), + * purple_account_option_int_new(), purple_account_option_string_new() or + * purple_account_option_list_new() (as appropriate) instead. * * @param type The type of option. * @param text The text of the option. @@ -91,8 +94,8 @@ * * @return The account option. */ -PurpleAccountOption *purple_account_option_new(PurplePrefType type, const char *text, - const char *pref_name); +PurpleAccountOption *purple_account_option_new(PurplePrefType type, + const char *text, const char *pref_name); /** * Creates a new boolean account option. @@ -104,8 +107,7 @@ * @return The account option. */ PurpleAccountOption *purple_account_option_bool_new(const char *text, - const char *pref_name, - gboolean default_value); + const char *pref_name, gboolean default_value); /** * Creates a new integer account option. @@ -117,8 +119,7 @@ * @return The account option. */ PurpleAccountOption *purple_account_option_int_new(const char *text, - const char *pref_name, - int default_value); + const char *pref_name, int default_value); /** * Creates a new string account option. @@ -130,8 +131,7 @@ * @return The account option. */ PurpleAccountOption *purple_account_option_string_new(const char *text, - const char *pref_name, - const char *default_value); + const char *pref_name, const char *default_value); /** * Creates a new list account option. @@ -140,7 +140,7 @@ * strings inside will be freed automatically. * * The list is a list of PurpleKeyValuePair items. The key is the ID stored and - * used internally, and the value is the label displayed. + * used internally, and the (const char *) value is the label displayed. * * @param text The text of the option. * @param pref_name The account preference name for the option. @@ -149,8 +149,7 @@ * @return The account option. */ PurpleAccountOption *purple_account_option_list_new(const char *text, - const char *pref_name, - GList *list); + const char *pref_name, GList *list); /** * Destroys an account option. @@ -240,11 +239,13 @@ const char *purple_account_option_get_text(const PurpleAccountOption *option); /** - * Returns the account setting for an account option. + * Returns the name of an account option. This corresponds to the @c pref_name + * parameter supplied to purple_account_option_new() or one of the + * type-specific constructors. * * @param option The account option. * - * @return The account setting. + * @return The option's name. */ const char *purple_account_option_get_setting(const PurpleAccountOption *option); diff -r f182cf94145c -r 00eaff9396ec libpurple/blist.c --- a/libpurple/blist.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/blist.c Wed Feb 06 03:35:04 2008 +0000 @@ -298,7 +298,7 @@ } static xmlnode * -blist_to_xmlnode() +blist_to_xmlnode(void) { xmlnode *node, *child, *grandchild; PurpleBlistNode *gnode; @@ -332,7 +332,7 @@ } static void -purple_blist_sync() +purple_blist_sync(void) { xmlnode *node; char *data; @@ -640,10 +640,10 @@ if (purple_account_is_connected(buddy->account)) { - int cmp; - - cmp = purple_presence_compare(purple_buddy_get_presence(new_priority), - purple_buddy_get_presence(buddy)); + int cmp = 1; + if (purple_account_is_connected(new_priority->account)) + cmp = purple_presence_compare(purple_buddy_get_presence(new_priority), + purple_buddy_get_presence(buddy)); if (cmp > 0 || (cmp == 0 && purple_prefs_get_bool("/purple/contact/last_match"))) @@ -753,6 +753,26 @@ return ret; } +PurpleBlistNode *purple_blist_node_get_parent(PurpleBlistNode *node) +{ + return node ? node->parent : NULL; +} + +PurpleBlistNode *purple_blist_node_get_first_child(PurpleBlistNode *node) +{ + return node ? node->child : NULL; +} + +PurpleBlistNode *purple_blist_node_get_sibling_next(PurpleBlistNode *node) +{ + return node? node->next : NULL; +} + +PurpleBlistNode *purple_blist_node_get_sibling_prev(PurpleBlistNode *node) +{ + return node? node->prev : NULL; +} + void purple_blist_update_buddy_status(PurpleBuddy *buddy, PurpleStatus *old_status) { @@ -1067,11 +1087,18 @@ if(old_name && source && strcmp(source->name, old_name)) { for (accts = purple_group_get_accounts(source); accts; accts = g_slist_remove(accts, accts->data)) { PurpleAccount *account = accts->data; + PurpleConnection *gc = NULL; + PurplePlugin *prpl = NULL; PurplePluginProtocolInfo *prpl_info = NULL; GList *l = NULL, *buddies = NULL; - if(account->gc && account->gc->prpl) - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(account->gc->prpl); + gc = purple_account_get_connection(account); + + if(gc) + prpl = purple_connection_get_prpl(gc); + + if(gc && prpl) + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); if(!prpl_info) continue; @@ -1084,7 +1111,7 @@ } if(prpl_info->rename_group) { - prpl_info->rename_group(account->gc, old_name, source, buddies); + prpl_info->rename_group(gc, old_name, source, buddies); } else { GList *cur, *groups = NULL; @@ -2232,6 +2259,22 @@ return (PurpleGroup *)(((PurpleBlistNode *)chat)->parent); } +PurpleAccount * +purple_chat_get_account(PurpleChat *chat) +{ + g_return_val_if_fail(chat != NULL, NULL); + + return chat->account; +} + +GHashTable * +purple_chat_get_components(PurpleChat *chat) +{ + g_return_val_if_fail(chat != NULL, NULL); + + return chat->components; +} + PurpleContact *purple_buddy_get_contact(PurpleBuddy *buddy) { g_return_val_if_fail(buddy != NULL, NULL); diff -r f182cf94145c -r 00eaff9396ec libpurple/blist.h --- a/libpurple/blist.h Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/blist.h Wed Feb 06 03:35:04 2008 +0000 @@ -53,13 +53,13 @@ } PurpleBlistNodeType; -#define PURPLE_BLIST_NODE_IS_CHAT(n) ((n)->type == PURPLE_BLIST_CHAT_NODE) -#define PURPLE_BLIST_NODE_IS_BUDDY(n) ((n)->type == PURPLE_BLIST_BUDDY_NODE) -#define PURPLE_BLIST_NODE_IS_CONTACT(n) ((n)->type == PURPLE_BLIST_CONTACT_NODE) -#define PURPLE_BLIST_NODE_IS_GROUP(n) ((n)->type == PURPLE_BLIST_GROUP_NODE) +#define PURPLE_BLIST_NODE_IS_CHAT(n) (purple_blist_node_get_type(n) == PURPLE_BLIST_CHAT_NODE) +#define PURPLE_BLIST_NODE_IS_BUDDY(n) (purple_blist_node_get_type(n) == PURPLE_BLIST_BUDDY_NODE) +#define PURPLE_BLIST_NODE_IS_CONTACT(n) (purple_blist_node_get_type(n) == PURPLE_BLIST_CONTACT_NODE) +#define PURPLE_BLIST_NODE_IS_GROUP(n) (purple_blist_node_get_type(n) == PURPLE_BLIST_GROUP_NODE) #define PURPLE_BUDDY_IS_ONLINE(b) \ - ((b) != NULL && purple_account_is_connected((b)->account) && \ + ((b) != NULL && purple_account_is_connected(purple_buddy_get_account(b)) && \ purple_presence_is_online(purple_buddy_get_presence(b))) typedef enum @@ -231,10 +231,66 @@ * @param node A node. * @param offline Whether to include nodes for offline accounts * @return The next node + * @see purple_blist_node_get_parent + * @see purple_blist_node_get_first_child + * @see purple_blist_node_get_sibling_next + * @see purple_blist_node_get_sibling_prev */ PurpleBlistNode *purple_blist_node_next(PurpleBlistNode *node, gboolean offline); /** + * Returns the parent node of a given node. + * + * @param node A node. + * @return The parent node. + * @since 2.4.0 + * @see purple_blist_node_get_first_child + * @see purple_blist_node_get_sibling_next + * @see purple_blist_node_get_sibling_prev + * @see purple_blist_node_next + */ +PurpleBlistNode *purple_blist_node_get_parent(PurpleBlistNode *node); + +/** + * Returns the the first child node of a given node. + * + * @param node A node. + * @return The child node. + * @since 2.4.0 + * @see purple_blist_node_get_parent + * @see purple_blist_node_get_sibling_next + * @see purple_blist_node_get_sibling_prev + * @see purple_blist_node_next + */ +PurpleBlistNode *purple_blist_node_get_first_child(PurpleBlistNode *node); + +/** + * Returns the sibling node of a given node. + * + * @param node A node. + * @return The sibling node. + * @since 2.4.0 + * @see purple_blist_node_get_parent + * @see purple_blist_node_get_first_child + * @see purple_blist_node_get_sibling_prev + * @see purple_blist_node_next + */ +PurpleBlistNode *purple_blist_node_get_sibling_next(PurpleBlistNode *node); + +/** + * Returns the previous sibling node of a given node. + * + * @param node A node. + * @return The sibling node. + * @since 2.4.0 + * @see purple_blist_node_get_parent + * @see purple_blist_node_get_first_child + * @see purple_blist_node_get_sibling_next + * @see purple_blist_node_next + */ +PurpleBlistNode *purple_blist_node_get_sibling_prev(PurpleBlistNode *node); + +/** * Shows the buddy list, creating a new one if necessary. */ void purple_blist_show(void); @@ -667,6 +723,26 @@ PurpleGroup *purple_chat_get_group(PurpleChat *chat); /** + * Returns the account the chat belongs to. + * + * @param chat The chat. + * + * @return The account the chat belongs to. + * @since 2.4.0 + */ +PurpleAccount *purple_chat_get_account(PurpleChat *chat); + +/** + * Get a hashtable containing information about a chat. + * + * @param chat The chat. + * + * @constreturn The hashtable. + * @since 2.4.0 + */ +GHashTable *purple_chat_get_components(PurpleChat *chat); + +/** * Returns the group of which the buddy is a member. * * @param buddy The buddy diff -r f182cf94145c -r 00eaff9396ec libpurple/buddyicon.c --- a/libpurple/buddyicon.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/buddyicon.c Wed Feb 06 03:35:04 2008 +0000 @@ -49,6 +49,8 @@ static GHashTable *icon_data_cache = NULL; static GHashTable *icon_file_cache = NULL; +static void delete_buddy_icon_settings(PurpleBlistNode *node, const char *setting_name); + /* This one is used for both custom buddy icons * on PurpleContacts and account icons. */ static GHashTable *pointer_icon_cache = NULL; @@ -124,7 +126,7 @@ purple_imgstore_get_size(img)); } else { purple_debug_error("buddyicon", "Unable to create file %s: %s\n", - path, g_strerror(errno)); + path, "File already exists."); } g_free(path); } @@ -614,13 +616,16 @@ checksum = purple_blist_node_get_string((PurpleBlistNode*)b, "icon_checksum"); purple_buddy_icon_set_data(icon, data, len, checksum); } + else + delete_buddy_icon_settings((PurpleBlistNode*)b, "buddy_icon"); + g_free(path); } purple_buddy_icons_set_caching(caching); } - return purple_buddy_icon_ref(icon); + return (icon ? purple_buddy_icon_ref(icon) : NULL); } gboolean @@ -696,18 +701,13 @@ } unref_filename(old_icon); - if (img) - g_hash_table_insert(pointer_icon_cache, account, img); - else - g_hash_table_remove(pointer_icon_cache, account); - if (purple_account_is_connected(account)) { PurpleConnection *gc; PurplePluginProtocolInfo *prpl_info; gc = purple_account_get_connection(account); - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc)); if (prpl_info && prpl_info->set_buddy_icon) prpl_info->set_buddy_icon(gc, img); @@ -724,6 +724,11 @@ } g_free(old_icon); + if (img) + g_hash_table_insert(pointer_icon_cache, account, img); + else + g_hash_table_remove(pointer_icon_cache, account); + return img; } @@ -1156,7 +1161,8 @@ g_free, NULL); pointer_icon_cache = g_hash_table_new(g_direct_hash, g_direct_equal); - cache_dir = g_build_filename(purple_user_dir(), "icons", NULL); + if (!cache_dir) + cache_dir = g_build_filename(purple_user_dir(), "icons", NULL); purple_signal_connect(purple_imgstore_get_handle(), "image-deleting", purple_buddy_icons_get_handle(), diff -r f182cf94145c -r 00eaff9396ec libpurple/certificate.c --- a/libpurple/certificate.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/certificate.c Wed Feb 06 03:35:04 2008 +0000 @@ -568,7 +568,7 @@ _("Single-use Certificate Verification"), primary, secondary, - 1, /* Accept by default */ + 0, /* Accept by default */ NULL, /* No account */ NULL, /* No other user */ NULL, /* No associated conversation */ @@ -1199,7 +1199,7 @@ _("SSL Certificate Verification"), primary, reason, - 2, /* Accept by default */ + 0, /* Accept by default */ NULL, /* No account */ NULL, /* No other user */ NULL, /* No associated conversation */ diff -r f182cf94145c -r 00eaff9396ec libpurple/certificate.h --- a/libpurple/certificate.h Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/certificate.h Wed Feb 06 03:35:04 2008 +0000 @@ -31,6 +31,8 @@ #ifndef _PURPLE_CERTIFICATE_H #define _PURPLE_CERTIFICATE_H +#include + #include #ifdef __cplusplus diff -r f182cf94145c -r 00eaff9396ec libpurple/cipher.c --- a/libpurple/cipher.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/cipher.c Wed Feb 06 03:35:04 2008 +0000 @@ -775,7 +775,7 @@ static void hmac_set_key(PurpleCipherContext *context, const guchar * key) { - hmac_set_key_with_len(context, key, strlen(key)); + hmac_set_key_with_len(context, key, strlen((char *)key)); } static size_t diff -r f182cf94145c -r 00eaff9396ec libpurple/connection.c --- a/libpurple/connection.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/connection.c Wed Feb 06 03:35:04 2008 +0000 @@ -52,8 +52,19 @@ PurpleConnection *gc = data; PurplePluginProtocolInfo *prpl_info = NULL; - if (gc != NULL && gc->prpl != NULL) - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); + if (gc == NULL) + return TRUE; + + /* Only send keep-alives if we haven't heard from the + * server in a while. + */ + if ((time(NULL) - gc->last_received) < KEEPALIVE_INTERVAL) + return TRUE; + + if (gc->prpl == NULL) + return TRUE; + + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); if (prpl_info && prpl_info->keepalive) prpl_info->keepalive(gc); @@ -413,6 +424,14 @@ return gc->account; } +PurplePlugin * +purple_connection_get_prpl(const PurpleConnection *gc) +{ + g_return_val_if_fail(gc != NULL, NULL); + + return gc->prpl; +} + const char * purple_connection_get_password(const PurpleConnection *gc) { @@ -542,8 +561,10 @@ switch (ssl_error) { case PURPLE_SSL_HANDSHAKE_FAILED: + reason = PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR; + break; case PURPLE_SSL_CONNECT_FAILED: - reason = PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR; + reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; break; case PURPLE_SSL_CERTIFICATE_INVALID: /* TODO: maybe PURPLE_SSL_* should be more specific? */ @@ -551,7 +572,7 @@ break; default: g_assert_not_reached (); - reason = PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR; + reason = PURPLE_CONNECTION_ERROR_CERT_OTHER_ERROR; } purple_connection_error_reason (gc, reason, @@ -564,12 +585,12 @@ switch (reason) { case PURPLE_CONNECTION_ERROR_NETWORK_ERROR: + case PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR: return FALSE; case PURPLE_CONNECTION_ERROR_INVALID_USERNAME: case PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED: case PURPLE_CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE: case PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT: - case PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR: case PURPLE_CONNECTION_ERROR_NAME_IN_USE: case PURPLE_CONNECTION_ERROR_INVALID_SETTINGS: case PURPLE_CONNECTION_ERROR_OTHER_ERROR: diff -r f182cf94145c -r 00eaff9396ec libpurple/connection.h --- a/libpurple/connection.h Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/connection.h Wed Feb 06 03:35:04 2008 +0000 @@ -196,11 +196,11 @@ * available; on Windows, it uses Win32's network change notification * infrastructure. */ - void (*network_connected)(); + void (*network_connected)(void); /** Called when libpurple discovers that the computer's network * connection has gone away. */ - void (*network_disconnected)(); + void (*network_disconnected)(void); /** Called when an error causes a connection to be disconnected. * Called before #disconnected. This op is intended to replace @@ -251,6 +251,8 @@ gboolean wants_to_die; guint disconnect_timeout; /**< Timer used for nasty stack tricks */ + time_t last_received; /**< When we last received a packet. Set by the + prpl to avoid sending unneeded keepalives */ }; #ifdef __cplusplus @@ -362,7 +364,7 @@ * @return TRUE if the account is connected, otherwise returns FALSE. */ #define PURPLE_CONNECTION_IS_CONNECTED(gc) \ - (gc->state == PURPLE_CONNECTED) + (purple_connection_get_state(gc) == PURPLE_CONNECTED) /** * Returns the connection's account. @@ -374,6 +376,16 @@ PurpleAccount *purple_connection_get_account(const PurpleConnection *gc); /** + * Returns the protocol plugin managing a connection. + * + * @param gc The connection. + * + * @return The protocol plugin. + * @since 2.4.0 + */ +PurplePlugin * purple_connection_get_prpl(const PurpleConnection *gc); + +/** * Returns the connection's password. * * @param gc The connection. diff -r f182cf94145c -r 00eaff9396ec libpurple/conversation.c --- a/libpurple/conversation.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/conversation.c Wed Feb 06 03:35:04 2008 +0000 @@ -295,10 +295,14 @@ /* Check if this conversation already exists. */ if ((conv = purple_find_conversation_with_account(type, name, account)) != NULL) { - if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT && + if (purple_conversation_get_type(conv) != PURPLE_CONV_TYPE_CHAT || purple_conv_chat_has_left(PURPLE_CONV_CHAT(conv))) - purple_conversation_chat_cleanup_for_rejoin(conv); - return conv; + { + if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) + purple_conversation_chat_cleanup_for_rejoin(conv); + + return conv; + } } gc = purple_account_get_connection(account); @@ -398,7 +402,7 @@ if (gc != NULL) { /* Still connected */ - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc)); if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { @@ -1451,7 +1455,7 @@ conv = purple_conv_chat_get_conversation(chat); gc = purple_conversation_get_gc(conv); account = purple_connection_get_account(gc); - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc)); /* Don't display this if the person who wrote it is ignored. */ if (purple_conv_chat_is_user_ignored(chat, who)) @@ -1570,7 +1574,7 @@ gc = purple_conversation_get_gc(conv); g_return_if_fail(gc != NULL); - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc)); g_return_if_fail(prpl_info != NULL); ul = users; @@ -1671,7 +1675,7 @@ gc = purple_conversation_get_gc(conv); g_return_if_fail(gc != NULL); - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc)); g_return_if_fail(prpl_info != NULL); if (!strcmp(chat->nick, purple_normalize(conv->account, old_user))) { @@ -1789,7 +1793,7 @@ gc = purple_conversation_get_gc(conv); g_return_if_fail(gc != NULL); - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc)); g_return_if_fail(prpl_info != NULL); ops = purple_conversation_get_ui_ops(conv); diff -r f182cf94145c -r 00eaff9396ec libpurple/conversation.h --- a/libpurple/conversation.h Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/conversation.h Wed Feb 06 03:35:04 2008 +0000 @@ -490,7 +490,8 @@ * * @param conv The conversation. * - * @return The conversation's name. + * @return The conversation's name. If the conversation is an IM with a PurpleBuddy, + * then it's the name of the PurpleBuddy. */ const char *purple_conversation_get_name(const PurpleConversation *conv); @@ -718,7 +719,7 @@ * * @param msg A PurpleConvMessage * - * @return The name of the sender of the message + * @return The message flags * * @since 2.2.0 */ @@ -729,7 +730,7 @@ * * @param msg A PurpleConvMessage * - * @return The name of the sender of the message + * @return The timestamp of the message * * @since 2.2.0 */ diff -r f182cf94145c -r 00eaff9396ec libpurple/core.h --- a/libpurple/core.h Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/core.h Wed Feb 06 03:35:04 2008 +0000 @@ -67,13 +67,14 @@ * Calls purple_core_quit(). This can be used as the function * passed to purple_timeout_add() when you want to shutdown Purple * in a specified amount of time. When shutting down Purple - * from a plugin, you must use this with a timeout value of 0: + * from a plugin, you must use this instead of purple_core_quit(); + * for an immediate exit, use a timeout value of 0: * purple_timeout_add(0, purple_core_quitcb, NULL); * This is ensures that code from your plugin is not being - * executed when purple_core_quit() is called. Otherwise you - * would get a core dump after purple_core_quit() executes and - * control returns to your plugin because purple_core_quit() frees - * all plugins. + * executed when purple_core_quit() is called. If the plugin + * called purple_core_quit() directly, you would get a core dump + * after purple_core_quit() executes and control returns to your + * plugin because purple_core_quit() frees all plugins. */ gboolean purple_core_quit_cb(gpointer unused); diff -r f182cf94145c -r 00eaff9396ec libpurple/dbus-analyze-functions.py --- a/libpurple/dbus-analyze-functions.py Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/dbus-analyze-functions.py Wed Feb 06 03:35:04 2008 +0000 @@ -525,9 +525,10 @@ try: self.processfunction(functiontext, paramtexts) except MyException: - sys.stderr.write(myline + "\n") +# sys.stderr.write(myline + "\n") + pass except: - sys.stderr.write(myline + "\n") +# sys.stderr.write(myline + "\n") raise self.flush() @@ -586,7 +587,7 @@ else: fprefix = "" -sys.stderr.write("%s: Functions not exported:\n" % sys.argv[0]) +#sys.stderr.write("%s: Functions not exported:\n" % sys.argv[0]) if "client" in options: bindings = ClientBindingSet(sys.stdin, fprefix, diff -r f182cf94145c -r 00eaff9396ec libpurple/dbus-server.c --- a/libpurple/dbus-server.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/dbus-server.c Wed Feb 06 03:35:04 2008 +0000 @@ -689,6 +689,7 @@ switch (purple_values[i]->type) { case PURPLE_TYPE_INT: + case PURPLE_TYPE_ENUM: xint = my_arg(gint); dbus_message_iter_append_basic(iter, DBUS_TYPE_INT32, &xint); break; @@ -729,7 +730,7 @@ if (id == 0 && val != NULL) error = TRUE; /* Some error happened. */ dbus_message_iter_append_basic(iter, - (sizeof(void *) == 4) ? DBUS_TYPE_UINT32 : DBUS_TYPE_UINT64, &id); + (sizeof(id) == sizeof(dbus_int32_t)) ? DBUS_TYPE_INT32 : DBUS_TYPE_INT64, &id); break; default: /* no conversion implemented */ g_return_val_if_reached(TRUE); diff -r f182cf94145c -r 00eaff9396ec libpurple/dnsquery.c --- a/libpurple/dnsquery.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/dnsquery.c Wed Feb 06 03:35:04 2008 +0000 @@ -142,7 +142,7 @@ */ #ifdef HAVE_SIGNAL_H G_GNUC_NORETURN static void -trap_gdb_bug() +trap_gdb_bug(int sig) { const char *message = "Purple's DNS child got a SIGTRAP signal.\n" @@ -159,6 +159,24 @@ } #endif +static void +write_to_parent(int fd, const void *buf, size_t count) +{ + ssize_t written; + + written = write(fd, buf, count); + if (written != count) { + if (written < 0) + fprintf(stderr, "dns[%d]: Error writing data to " + "parent: %s\n", getpid(), strerror(errno)); + else + fprintf(stderr, "dns[%d]: Error: Tried to write %" + G_GSIZE_FORMAT " bytes to parent but instead " + "wrote %" G_GSIZE_FORMAT " bytes\n", + getpid(), count, written); + } +} + G_GNUC_NORETURN static void purple_dnsquery_resolver_run(int child_out, int child_in, gboolean show_debug) { @@ -201,7 +219,8 @@ } rc = read(child_in, &dns_params, sizeof(dns_params_t)); if (rc < 0) { - perror("read()"); + fprintf(stderr, "dns[%d]: Error: Could not read dns_params: " + "%s\n", getpid(), strerror(errno)); break; } if (rc == 0) { @@ -210,11 +229,13 @@ _exit(0); } if (dns_params.hostname[0] == '\0') { - printf("dns[%d]: hostname = \"\" (port = %d)!!!\n", getpid(), dns_params.port); + fprintf(stderr, "dns[%d]: Error: Parent requested resolution " + "of an empty hostname (port = %d)!!!\n", getpid(), + dns_params.port); _exit(1); } /* Tell our parent that we read the data successfully */ - write(child_out, &ch, sizeof(ch)); + write_to_parent(child_out, &ch, sizeof(ch)); /* We have the hostname and port, now resolve the IP */ @@ -230,7 +251,7 @@ */ hints.ai_socktype = SOCK_STREAM; rc = getaddrinfo(dns_params.hostname, servname, &hints, &res); - write(child_out, &rc, sizeof(rc)); + write_to_parent(child_out, &rc, sizeof(rc)); if (rc != 0) { close(child_out); if (show_debug) @@ -242,17 +263,17 @@ tmp = res; while (res) { size_t ai_addrlen = res->ai_addrlen; - write(child_out, &ai_addrlen, sizeof(ai_addrlen)); - write(child_out, res->ai_addr, res->ai_addrlen); + write_to_parent(child_out, &ai_addrlen, sizeof(ai_addrlen)); + write_to_parent(child_out, res->ai_addr, res->ai_addrlen); res = res->ai_next; } freeaddrinfo(tmp); - write(child_out, &zero, sizeof(zero)); + write_to_parent(child_out, &zero, sizeof(zero)); #else if (!inet_aton(dns_params.hostname, &sin.sin_addr)) { struct hostent *hp; if (!(hp = gethostbyname(dns_params.hostname))) { - write(child_out, &h_errno, sizeof(int)); + write_to_parent(child_out, &h_errno, sizeof(int)); close(child_out); if (show_debug) printf("DNS Error: %d\n", h_errno); @@ -265,10 +286,10 @@ sin.sin_family = AF_INET; sin.sin_port = htons(dns_params.port); - write(child_out, &zero, sizeof(zero)); - write(child_out, &addrlen, sizeof(addrlen)); - write(child_out, &sin, addrlen); - write(child_out, &zero, sizeof(zero)); + write_to_parent(child_out, &zero, sizeof(zero)); + write_to_parent(child_out, &addrlen, sizeof(addrlen)); + write_to_parent(child_out, &sin, addrlen); + write_to_parent(child_out, &zero, sizeof(zero)); #endif dns_params.hostname[0] = '\0'; } @@ -286,7 +307,7 @@ * Begin the functions for dealing with the DNS child processes. */ static void -cope_with_gdb_brokenness() +cope_with_gdb_brokenness(void) { #ifdef __linux__ static gboolean already_done = FALSE; @@ -460,7 +481,7 @@ static void host_resolved(gpointer data, gint source, PurpleInputCondition cond); static void -handle_next_queued_request() +handle_next_queued_request(void) { PurpleDnsQueryData *query_data; PurpleDnsQueryResolverProcess *resolver; diff -r f182cf94145c -r 00eaff9396ec libpurple/dnssrv.c --- a/libpurple/dnssrv.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/dnssrv.c Wed Feb 06 03:35:04 2008 +0000 @@ -200,12 +200,20 @@ PurpleSrvCallback cb = query_data->cb; int status; - if (read(source, &size, sizeof(int)) > 0) + if (read(source, &size, sizeof(int)) == sizeof(int)) { + ssize_t red; purple_debug_info("dnssrv","found %d SRV entries\n", size); tmp = res = g_new0(PurpleSrvResponse, size); for (i = 0; i < size; i++) { - read(source, tmp++, sizeof(PurpleSrvResponse)); + red = read(source, tmp++, sizeof(PurpleSrvResponse)); + if (red != sizeof(PurpleSrvResponse)) { + purple_debug_error("dnssrv","unable to read srv " + "response: %s\n", g_strerror(errno)); + size = 0; + g_free(res); + res = NULL; + } } } else @@ -307,7 +315,7 @@ /* back to main thread */ /* Note: this should *not* be attached to query_data->handle - it will cause leakage */ - g_idle_add(res_main_thread_cb, query_data); + purple_timeout_add(0, res_main_thread_cb, query_data); g_thread_exit(NULL); return NULL; @@ -350,9 +358,12 @@ /* Child */ if (pid == 0) { + g_free(query); + close(out[0]); close(in[1]); resolve(in[0], out[1]); + /* resolve() does not return */ } close(out[1]); @@ -399,7 +410,7 @@ * Asynchronously call the callback since stuff may not expect * the callback to be called before this returns */ if (query_data->error_message != NULL) - query_data->handle = g_idle_add(res_main_thread_cb, query_data); + query_data->handle = purple_timeout_add(0, res_main_thread_cb, query_data); return query_data; #endif diff -r f182cf94145c -r 00eaff9396ec libpurple/example/Makefile.am --- a/libpurple/example/Makefile.am Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/example/Makefile.am Wed Feb 06 03:35:04 2008 +0000 @@ -17,7 +17,8 @@ -DLIBDIR=\"$(libdir)/purple-$(PURPLE_MAJOR_VERSION)/\" \ -DLOCALEDIR=\"$(datadir)/locale\" \ -DSYSCONFDIR=\"$(sysconfdir)\" \ - -I$(top_srcdir)/libpurple/ \ + -I$(top_builddir)/libpurple \ + -I$(top_srcdir)/libpurple \ -I$(top_srcdir) \ $(DEBUG_CFLAGS) \ $(GLIB_CFLAGS) \ diff -r f182cf94145c -r 00eaff9396ec libpurple/example/nullclient.c --- a/libpurple/example/nullclient.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/example/nullclient.c Wed Feb 06 03:35:04 2008 +0000 @@ -21,28 +21,11 @@ * */ -/* XXX: we probably shouldn't include internal.h in examples */ -#include "internal.h" - -#include "account.h" -#include "conversation.h" -#include "core.h" -#include "debug.h" -#include "eventloop.h" -#include "ft.h" -#include "log.h" -#include "notify.h" -#include "prefs.h" -#include "prpl.h" -#include "pounce.h" -#include "savedstatuses.h" -#include "sound.h" -#include "status.h" -#include "util.h" -#include "whiteboard.h" +#include "purple.h" #include +#include #include #include @@ -167,7 +150,7 @@ }; static void -null_ui_init() +null_ui_init(void) { /** * This should initialize the UI components for all the modules. Here we @@ -191,7 +174,7 @@ }; static void -init_libpurple() +init_libpurple(void) { /* Set a custom user directory (optional) */ purple_util_set_user_dir(CUSTOM_USER_DIRECTORY); @@ -250,14 +233,14 @@ } static void -connect_to_signals_for_demonstration_purposes_only() +connect_to_signals_for_demonstration_purposes_only(void) { static int handle; purple_signal_connect(purple_connections_get_handle(), "signed-on", &handle, PURPLE_CALLBACK(signed_on), NULL); } -int main() +int main(int argc, char *argv[]) { GList *iter; int i, num; @@ -268,6 +251,7 @@ GMainLoop *loop = g_main_loop_new(NULL, FALSE); PurpleAccount *account; PurpleSavedStatus *status; + char *res; /* libpurple's built-in DNS resolution forks processes to perform * blocking lookups without blocking the main process. It does not @@ -290,12 +274,20 @@ } } printf("Select the protocol [0-%d]: ", i-1); - fgets(name, sizeof(name), stdin); + res = fgets(name, sizeof(name), stdin); + if (!res) { + fprintf(stderr, "Failed to gets protocol selection."); + abort(); + } sscanf(name, "%d", &num); prpl = g_list_nth_data(names, num); printf("Username: "); - fgets(name, sizeof(name), stdin); + res = fgets(name, sizeof(name), stdin); + if (!res) { + fprintf(stderr, "Failed to read user name."); + abort(); + } name[strlen(name) - 1] = 0; /* strip the \n at the end */ /* Create the account */ diff -r f182cf94145c -r 00eaff9396ec libpurple/ft.c --- a/libpurple/ft.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/ft.c Wed Feb 06 03:35:04 2008 +0000 @@ -32,6 +32,7 @@ #include "proxy.h" #include "request.h" #include "util.h" +#include "debug.h" #define FT_INITIAL_BUFFER_SIZE 4096 #define FT_MAX_BUFFER_SIZE 65535 @@ -668,6 +669,22 @@ return xfer->remote_port; } +time_t +purple_xfer_get_start_time(const PurpleXfer *xfer) +{ + g_return_val_if_fail(xfer != NULL, 0); + + return xfer->start_time; +} + +time_t +purple_xfer_get_end_time(const PurpleXfer *xfer) +{ + g_return_val_if_fail(xfer != NULL, 0); + + return xfer->end_time; +} + void purple_xfer_set_completed(PurpleXfer *xfer, gboolean completed) { @@ -903,7 +920,12 @@ if (condition & PURPLE_INPUT_READ) { r = purple_xfer_read(xfer, &buffer); if (r > 0) { - fwrite(buffer, 1, r, xfer->dest_fp); + const size_t wc = fwrite(buffer, 1, r, xfer->dest_fp); + if (wc != r) { + purple_debug_error("filetransfer", "Unable to write whole buffer.\n"); + purple_xfer_cancel_remote(xfer); + return; + } } else if(r < 0) { purple_xfer_cancel_remote(xfer); return; @@ -911,6 +933,7 @@ } if (condition & PURPLE_INPUT_WRITE) { + size_t result; size_t s = MIN(purple_xfer_get_bytes_remaining(xfer), xfer->current_buffer_size); /* this is so the prpl can keep the connection open @@ -925,7 +948,13 @@ buffer = g_malloc0(s); - fread(buffer, 1, s, xfer->dest_fp); + result = fread(buffer, 1, s, xfer->dest_fp); + if (result != s) { + purple_debug_error("filetransfer", "Unable to read whole buffer.\n"); + purple_xfer_cancel_remote(xfer); + g_free(buffer); + return; + } /* Write as much as we're allowed to. */ r = purple_xfer_write(xfer, buffer, s); diff -r f182cf94145c -r 00eaff9396ec libpurple/ft.h --- a/libpurple/ft.h Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/ft.h Wed Feb 06 03:35:04 2008 +0000 @@ -358,6 +358,26 @@ unsigned int purple_xfer_get_remote_port(const PurpleXfer *xfer); /** + * Returns the time the transfer of a file started. + * + * @param xfer The file transfer. + * + * @return The time when the transfer started. + * @since 2.4.0 + */ +time_t purple_xfer_get_start_time(const PurpleXfer *xfer); + +/** + * Returns the time the transfer of a file ended. + * + * @param xfer The file transfer. + * + * @return The time when the transfer ended. + * @since 2.4.0 + */ +time_t purple_xfer_get_end_time(const PurpleXfer *xfer); + +/** * Sets the completed state for the file transfer. * * @param xfer The file transfer. diff -r f182cf94145c -r 00eaff9396ec libpurple/idle.c --- a/libpurple/idle.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/idle.c Wed Feb 06 03:35:04 2008 +0000 @@ -24,6 +24,7 @@ #include "connection.h" #include "debug.h" +#include "eventloop.h" #include "idle.h" #include "log.h" #include "prefs.h" @@ -215,8 +216,8 @@ /* * Check idle and set the timer to fire at the next idle-worth event */ -static gint -check_idleness_timer() +static gboolean +check_idleness_timer(void) { check_idleness(); if (time_until_next_idle_event == 0) @@ -225,7 +226,7 @@ { /* +1 for the boundary, * +1 more for g_timeout_add_seconds rounding. */ - idle_timer = purple_timeout_add_seconds(time_until_next_idle_event + 2, check_idleness_timer, NULL); + idle_timer = purple_timeout_add_seconds(time_until_next_idle_event + 2, (GSourceFunc)check_idleness_timer, NULL); } return FALSE; } @@ -295,7 +296,7 @@ } static void * -purple_idle_get_handle() +purple_idle_get_handle(void) { static int handle; @@ -307,7 +308,7 @@ int idle_poll_minutes = purple_prefs_get_int("/purple/away/mins_before_away"); /* +1 more for g_timeout_add_seconds rounding. */ - idle_timer = purple_timeout_add_seconds((idle_poll_minutes * 60) + 2, check_idleness_timer, NULL); + idle_timer = purple_timeout_add_seconds((idle_poll_minutes * 60) + 2, (GSourceFunc)check_idleness_timer, NULL); purple_idle_touch(); @@ -333,7 +334,7 @@ /* Initialize the idleness asynchronously so it doesn't check idleness, * and potentially try to change the status before the UI is initialized */ - g_idle_add(_do_purple_idle_touch_cb, NULL); + purple_timeout_add(0, _do_purple_idle_touch_cb, NULL); } diff -r f182cf94145c -r 00eaff9396ec libpurple/log.c --- a/libpurple/log.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/log.c Wed Feb 06 03:35:04 2008 +0000 @@ -1859,11 +1859,15 @@ static char * old_logger_read (PurpleLog *log, PurpleLogReadFlags *flags) { + size_t result; struct old_logger_data *data = log->logger_data; - FILE *file = g_fopen(purple_stringref_value(data->pathref), "rb"); + const char *path = purple_stringref_value(data->pathref); + FILE *file = g_fopen(path, "rb"); char *read = g_malloc(data->length + 1); fseek(file, data->offset, SEEK_SET); - fread(read, data->length, 1, file); + result = fread(read, data->length, 1, file); + if (result != 1) + purple_debug_error("log", "Unable to read from log file: %s\n", path); fclose(file); read[data->length] = '\0'; *flags = 0; diff -r f182cf94145c -r 00eaff9396ec libpurple/plugin.c --- a/libpurple/plugin.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/plugin.c Wed Feb 06 03:35:04 2008 +0000 @@ -667,7 +667,10 @@ } else { +#if 0 + /* This isn't necessary. This has already been done when unloading dep_plugin. */ plugin->dependent_plugins = g_list_delete_link(plugin->dependent_plugins, l); +#endif } } } diff -r f182cf94145c -r 00eaff9396ec libpurple/plugins/ciphertest.c --- a/libpurple/plugins/ciphertest.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/plugins/ciphertest.c Wed Feb 06 03:35:04 2008 +0000 @@ -61,7 +61,7 @@ }; static void -cipher_test_md5() { +cipher_test_md5(void) { PurpleCipher *cipher; PurpleCipherContext *context; gchar digest[33]; @@ -113,12 +113,12 @@ {"a", "86f7e437faa5a7fce15d1ddcb9eaeaea377667b8"}, {"abc", "a9993e364706816aba3e25717850c26c9cd0d89d"} , {"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", "84983e441c3bd26ebaae4aa1f95129e5e54670f1"} , - {NULL, "34aa973cd4c4daa4f61eeb2bdbad27316534016f"}, + {NULL, "34aa973cd4c4daa4f61eeb2bdbad27316534016f"}, {NULL, NULL} }; static void -cipher_test_sha1() { +cipher_test_sha1(void) { PurpleCipher *cipher; PurpleCipherContext *context; gchar digest[41]; @@ -176,7 +176,7 @@ } static void -cipher_test_digest() +cipher_test_digest(void) { const gchar *nonce = "dcd98b7102dd2f0e8b11d0f600bfb0c093"; const gchar *client_nonce = "0a4f113b"; diff -r f182cf94145c -r 00eaff9396ec libpurple/plugins/log_reader.c --- a/libpurple/plugins/log_reader.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/plugins/log_reader.c Wed Feb 06 03:35:04 2008 +0000 @@ -2426,7 +2426,7 @@ } -static void log_reader_init_prefs() { +static void log_reader_init_prefs(void) { char *path; #ifdef _WIN32 char *folder; diff -r f182cf94145c -r 00eaff9396ec libpurple/plugins/offlinemsg.c --- a/libpurple/plugins/offlinemsg.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/plugins/offlinemsg.c Wed Feb 06 03:35:04 2008 +0000 @@ -159,7 +159,7 @@ purple_request_action(handle, _("Offline Message"), ask, _("You can edit/delete the pounce from the `Buddy Pounces' dialog"), - 1, + 0, offline->account, offline->who, offline->conv, offline, 2, _("Yes"), record_pounce, diff -r f182cf94145c -r 00eaff9396ec libpurple/plugins/perl/common/fallback/const-c.inc --- a/libpurple/plugins/perl/common/fallback/const-c.inc Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/plugins/perl/common/fallback/const-c.inc Wed Feb 06 03:35:04 2008 +0000 @@ -33,7 +33,7 @@ Regenerate these constant functions by feeding this entire source file to perl -x -#!/usr/bin/perl -w +#!/usr/bin/env perl -w use ExtUtils::Constant qw (constant_types C_constant XS_constant); my $types = {map {($_, 1)} qw(IV)}; diff -r f182cf94145c -r 00eaff9396ec libpurple/plugins/ssl/ssl-nss.c --- a/libpurple/plugins/ssl/ssl-nss.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/plugins/ssl/ssl-nss.c Wed Feb 06 03:35:04 2008 +0000 @@ -109,7 +109,7 @@ } } -static gchar *get_error_text() +static gchar *get_error_text(void) { PRInt32 len = PR_GetErrorTextLength(); gchar *ret = NULL; diff -r f182cf94145c -r 00eaff9396ec libpurple/plugins/tcl/tcl.c --- a/libpurple/plugins/tcl/tcl.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/plugins/tcl/tcl.c Wed Feb 06 03:35:04 2008 +0000 @@ -149,7 +149,7 @@ return 0; } -static Tcl_Interp *tcl_create_interp() +static Tcl_Interp *tcl_create_interp(void) { Tcl_Interp *interp; diff -r f182cf94145c -r 00eaff9396ec libpurple/plugins/tcl/tcl_cmds.c --- a/libpurple/plugins/tcl/tcl_cmds.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/plugins/tcl/tcl_cmds.c Wed Feb 06 03:35:04 2008 +0000 @@ -25,6 +25,7 @@ #include "internal.h" #include "conversation.h" #include "connection.h" +#include "eventloop.h" #include "account.h" #include "server.h" #include "notify.h" @@ -1778,7 +1779,7 @@ } /* We can't unload immediately, but we can unload at the first * known safe opportunity. */ - g_idle_add(unload_self, (gpointer)plugin); + purple_timeout_add(0, unload_self, (gpointer)plugin); return TCL_OK; } diff -r f182cf94145c -r 00eaff9396ec libpurple/plugins/test.pl --- a/libpurple/plugins/test.pl Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/plugins/test.pl Wed Feb 06 03:35:04 2008 +0000 @@ -1,4 +1,4 @@ -#!/usr/bin/perl -w +#!/usr/bin/env perl -w use Gaim; diff -r f182cf94145c -r 00eaff9396ec libpurple/privacy.c --- a/libpurple/privacy.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/privacy.c Wed Feb 06 03:35:04 2008 +0000 @@ -202,9 +202,12 @@ return TRUE; } -/* This makes sure that only all the buddies are in the permit list. */ +/** + * This makes sure your permit list contains all buddies from your + * buddy list and ONLY buddies from your buddy list. + */ static void -add_buddies_in_permit(PurpleAccount *account, gboolean local) +add_all_buddies_to_permit_list(PurpleAccount *account, gboolean local) { GSList *list; @@ -227,6 +230,12 @@ } } +/* + * TODO: All callers of this function pass in FALSE for local and + * restore and I don't understand when you would ever want to + * use TRUE for either of them. I think both parameters could + * safely be removed in the next major version bump. + */ void purple_privacy_allow(PurpleAccount *account, const char *who, gboolean local, gboolean restore) @@ -256,7 +265,7 @@ break; case PURPLE_PRIVACY_ALLOW_BUDDYLIST: if (!purple_find_buddy(account, who)) { - add_buddies_in_permit(account, local); + add_all_buddies_to_permit_list(account, local); purple_privacy_permit_add(account, who, local); account->perm_deny = PURPLE_PRIVACY_ALLOW_USERS; } @@ -266,6 +275,12 @@ } } +/* + * TODO: All callers of this function pass in FALSE for local and + * restore and I don't understand when you would ever want to + * use TRUE for either of them. I think both parameters could + * safely be removed in the next major version bump. + */ void purple_privacy_deny(PurpleAccount *account, const char *who, gboolean local, gboolean restore) @@ -295,7 +310,7 @@ break; case PURPLE_PRIVACY_ALLOW_BUDDYLIST: if (purple_find_buddy(account, who)) { - add_buddies_in_permit(account, local); + add_all_buddies_to_permit_list(account, local); purple_privacy_permit_remove(account, who, local); account->perm_deny = PURPLE_PRIVACY_ALLOW_USERS; } diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/bonjour/bonjour.c --- a/libpurple/protocols/bonjour/bonjour.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/bonjour/bonjour.c Wed Feb 06 03:35:04 2008 +0000 @@ -617,7 +617,7 @@ #endif static void -initialize_default_account_values() +initialize_default_account_values(void) { #ifndef _WIN32 struct passwd *info; @@ -673,11 +673,12 @@ /* Try to figure out a good host name to use */ /* TODO: Avoid 'localhost,' if possible */ - if (gethostname(hostname, 255) != 0) { + if (gethostname(hostname, sizeof(hostname)) != 0) { purple_debug_warning("bonjour", "Error when getting host name: %s. Using \"localhost.\"\n", g_strerror(errno)); strcpy(hostname, "localhost"); } + hostname[sizeof(hostname) - 1] = '\0'; default_hostname = g_strdup(hostname); } diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/bonjour/jabber.c --- a/libpurple/protocols/bonjour/jabber.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/bonjour/jabber.c Wed Feb 06 03:35:04 2008 +0000 @@ -995,7 +995,7 @@ bb->conversation = NULL; } - purple_timeout_add(0, _async_bonjour_jabber_close_conversation_cb, bconv); + bconv->close_timeout = purple_timeout_add(0, _async_bonjour_jabber_close_conversation_cb, bconv); } void @@ -1054,6 +1054,9 @@ if (bconv->context != NULL) bonjour_parser_setup(bconv); + if (bconv->close_timeout != 0) + purple_timeout_remove(bconv->close_timeout); + g_free(bconv->buddy_name); g_free(bconv->ip); g_free(bconv); diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/bonjour/jabber.h --- a/libpurple/protocols/bonjour/jabber.h Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/bonjour/jabber.h Wed Feb 06 03:35:04 2008 +0000 @@ -47,6 +47,7 @@ gint socket; guint rx_handler; guint tx_handler; + guint close_timeout; PurpleCircBuffer *tx_buf; int sent_stream_start; /* 0 = Unsent, 1 = Partial, 2 = Complete */ gboolean recv_stream_start; diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/bonjour/mdns_avahi.c --- a/libpurple/protocols/bonjour/mdns_avahi.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/bonjour/mdns_avahi.c Wed Feb 06 03:35:04 2008 +0000 @@ -445,14 +445,14 @@ idata->group, AVAHI_IF_UNSPEC, AVAHI_PROTO_INET, 0, purple_account_get_username(data->account), - ICHAT_SERVICE, NULL, NULL, data->port_p2pj, lst); + LINK_LOCAL_RECORD_NAME, NULL, NULL, data->port_p2pj, lst); break; case PUBLISH_UPDATE: publish_result = avahi_entry_group_update_service_txt_strlst( idata->group, AVAHI_IF_UNSPEC, AVAHI_PROTO_INET, 0, purple_account_get_username(data->account), - ICHAT_SERVICE, NULL, lst); + LINK_LOCAL_RECORD_NAME, NULL, lst); break; } @@ -461,7 +461,7 @@ if (publish_result < 0) { purple_debug_error("bonjour", - "Failed to add the " ICHAT_SERVICE " service. Error: %s\n", + "Failed to add the " LINK_LOCAL_RECORD_NAME " service. Error: %s\n", avahi_strerror(publish_result)); return FALSE; } @@ -469,7 +469,7 @@ if (type == PUBLISH_START && (publish_result = avahi_entry_group_commit(idata->group)) < 0) { purple_debug_error("bonjour", - "Failed to commit " ICHAT_SERVICE " service. Error: %s\n", + "Failed to commit " LINK_LOCAL_RECORD_NAME " service. Error: %s\n", avahi_strerror(publish_result)); return FALSE; } @@ -482,7 +482,7 @@ g_return_val_if_fail(idata != NULL, FALSE); - idata->sb = avahi_service_browser_new(idata->client, AVAHI_IF_UNSPEC, AVAHI_PROTO_INET, ICHAT_SERVICE, NULL, 0, _browser_callback, data->account); + idata->sb = avahi_service_browser_new(idata->client, AVAHI_IF_UNSPEC, AVAHI_PROTO_INET, LINK_LOCAL_RECORD_NAME, NULL, 0, _browser_callback, data->account); if (!idata->sb) { purple_debug_error("bonjour", @@ -524,7 +524,7 @@ return FALSE; } - svc_name = g_strdup_printf("%s." ICHAT_SERVICE "local", + svc_name = g_strdup_printf("%s." LINK_LOCAL_RECORD_NAME "local", purple_account_get_username(data->account)); ret = avahi_entry_group_add_record(idata->buddy_icon_group, AVAHI_IF_UNSPEC, @@ -615,7 +615,7 @@ purple_debug_info("bonjour", "Retrieving buddy icon for '%s'.\n", buddy->name); - name = g_strdup_printf("%s." ICHAT_SERVICE "local", buddy->name); + name = g_strdup_printf("%s." LINK_LOCAL_RECORD_NAME "local", buddy->name); idata->buddy_icon_rec_browser = avahi_record_browser_new(session_idata->client, AVAHI_IF_UNSPEC, AVAHI_PROTO_INET, name, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_NULL, 0, _buddy_icon_record_cb, buddy); diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/bonjour/mdns_types.h --- a/libpurple/protocols/bonjour/mdns_types.h Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/bonjour/mdns_types.h Wed Feb 06 03:35:04 2008 +0000 @@ -20,7 +20,7 @@ #include #include "account.h" -#define ICHAT_SERVICE "_presence._tcp." +#define LINK_LOCAL_RECORD_NAME "_presence._tcp." /** * Data to be used by the dns-sd connection. diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/bonjour/mdns_win32.c --- a/libpurple/protocols/bonjour/mdns_win32.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/bonjour/mdns_win32.c Wed Feb 06 03:35:04 2008 +0000 @@ -30,19 +30,21 @@ static GSList *pending_buddies = NULL; +typedef struct _dnssd_service_ref_handler { + DNSServiceRef sdRef; + PurpleAccount *account; + guint input_handler; +} DnsSDServiceRefHandlerData; + /* data used by win32 bonjour implementation */ typedef struct _win32_session_impl_data { - DNSServiceRef presence_svc; - DNSServiceRef browser_svc; + DnsSDServiceRefHandlerData *presence_query; + DnsSDServiceRefHandlerData *browser_query; DNSRecordRef buddy_icon_rec; - - guint presence_handler; - guint browser_handler; } Win32SessionImplData; typedef struct _win32_buddy_service_resolver_data { - DNSServiceRef txt_query; - guint txt_query_handler; + DnsSDServiceRefHandlerData *txt_query; uint32_t if_idx; gchar *name; gchar *type; @@ -53,21 +55,20 @@ typedef struct _win32_buddy_impl_data { GSList *resolvers; - DNSServiceRef null_query; - guint null_query_handler; + DnsSDServiceRefHandlerData *null_query; } Win32BuddyImplData; /* data structure for the resolve callback */ typedef struct _ResolveCallbackArgs { - DNSServiceRef resolver; - guint resolver_handler; + DnsSDServiceRefHandlerData *resolver_query; PurpleAccount *account; BonjourBuddy *bb; Win32SvcResolverData *res_data; gchar *full_service_name; - PurpleDnsQueryData *query; + PurpleDnsQueryData *dns_query; } ResolveCallbackArgs; + static gint _find_resolver_data(gconstpointer a, gconstpointer b) { const Win32SvcResolverData *rd_a = a; @@ -87,8 +88,9 @@ static void _cleanup_resolver_data(Win32SvcResolverData *rd) { if (rd->txt_query != NULL) { - purple_input_remove(rd->txt_query_handler); - DNSServiceRefDeallocate(rd->txt_query); + purple_input_remove(rd->txt_query->input_handler); + DNSServiceRefDeallocate(rd->txt_query->sdRef); + g_free(rd->txt_query); } g_free(rd->name); g_free(rd->type); @@ -98,7 +100,16 @@ static void _mdns_handle_event(gpointer data, gint source, PurpleInputCondition condition) { - DNSServiceProcessResult((DNSServiceRef) data); + DnsSDServiceRefHandlerData *srh = data; + DNSServiceErrorType errorCode = DNSServiceProcessResult(srh->sdRef); + if (errorCode != kDNSServiceErr_NoError) { + purple_debug_error("bonjour", "Error (%d) handling mDNS response.\n", errorCode); + /* This happens when the mDNSResponder goes down, I haven't seen it happen any other time (in my limited testing) */ + if (errorCode == kDNSServiceErr_Unknown) { + purple_connection_error_reason(srh->account->gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Error communicating with local mDNSResponder.")); + } + } } static void @@ -123,7 +134,7 @@ uint32_t ttl, void *context) { - if (kDNSServiceErr_NoError != errorCode) { + if (errorCode != kDNSServiceErr_NoError) { purple_debug_error("bonjour", "record query - callback error.\n"); /* TODO: Probably should remove the buddy when this happens */ } else if (flags & kDNSServiceFlagsAdd) { @@ -142,9 +153,9 @@ bonjour_buddy_got_buddy_icon(bb, rdata, rdlen); /* We've got what we need; stop listening */ - purple_input_remove(idata->null_query_handler); - idata->null_query_handler = 0; - DNSServiceRefDeallocate(idata->null_query); + purple_input_remove(idata->null_query->input_handler); + DNSServiceRefDeallocate(idata->null_query->sdRef); + g_free(idata->null_query); idata->null_query = NULL; } } @@ -153,7 +164,7 @@ static void _mdns_resolve_host_callback(GSList *hosts, gpointer data, const char *error_message) { - ResolveCallbackArgs* args = (ResolveCallbackArgs*) data; + ResolveCallbackArgs *args = (ResolveCallbackArgs*) data; Win32BuddyImplData *idata = args->bb->mdns_impl_data; gboolean delete_buddy = FALSE; PurpleBuddy *pb; @@ -168,27 +179,31 @@ delete_buddy = TRUE; } else { struct sockaddr_in *addr = g_slist_nth_data(hosts, 1); + DNSServiceErrorType errorCode; + DNSServiceRef txt_query_sr; /* finally, set up the continuous txt record watcher, and add the buddy to purple */ - - if (kDNSServiceErr_NoError == DNSServiceQueryRecord(&args->res_data->txt_query, kDNSServiceFlagsLongLivedQuery, + errorCode = DNSServiceQueryRecord(&txt_query_sr, kDNSServiceFlagsLongLivedQuery, kDNSServiceInterfaceIndexAny, args->full_service_name, kDNSServiceType_TXT, - kDNSServiceClass_IN, _mdns_record_query_callback, args->bb)) { - + kDNSServiceClass_IN, _mdns_record_query_callback, args->bb); + if (errorCode == kDNSServiceErr_NoError) { const char *ip = inet_ntoa(addr->sin_addr); purple_debug_info("bonjour", "Found buddy %s at %s:%d\n", args->bb->name, ip, args->bb->port_p2pj); - args->bb->ips = g_slist_prepend(args->bb->ips, g_strdup(ip)); args->res_data->ip = args->bb->ips->data; - args->res_data->txt_query_handler = purple_input_add(DNSServiceRefSockFD(args->res_data->txt_query), + args->res_data->txt_query = g_new(DnsSDServiceRefHandlerData, 1); + args->res_data->txt_query->sdRef = txt_query_sr; + args->res_data->txt_query->account = args->account; + + args->res_data->txt_query->input_handler = purple_input_add(DNSServiceRefSockFD(txt_query_sr), PURPLE_INPUT_READ, _mdns_handle_event, args->res_data->txt_query); bonjour_buddy_add_to_purple(args->bb, NULL); } else { - purple_debug_error("bonjour", "Unable to set up record watcher for buddy %s\n", args->bb->name); + purple_debug_error("bonjour", "Unable to set up record watcher for buddy %s (%d)\n", args->bb->name, errorCode); delete_buddy = TRUE; } @@ -230,21 +245,21 @@ _mdns_service_resolve_callback(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *fullname, const char *hosttarget, uint16_t port, uint16_t txtLen, const char *txtRecord, void *context) { - ResolveCallbackArgs *args = (ResolveCallbackArgs*)context; + ResolveCallbackArgs *args = (ResolveCallbackArgs*) context; Win32BuddyImplData *idata = args->bb->mdns_impl_data; /* remove the input fd and destroy the service ref */ - purple_input_remove(args->resolver_handler); - args->resolver_handler = 0; - DNSServiceRefDeallocate(args->resolver); - args->resolver = NULL; + purple_input_remove(args->resolver_query->input_handler); + DNSServiceRefDeallocate(args->resolver_query->sdRef); + g_free(args->resolver_query); + args->resolver_query = NULL; - if (kDNSServiceErr_NoError != errorCode) + if (errorCode != kDNSServiceErr_NoError) purple_debug_error("bonjour", "service resolver - callback error.\n"); else { /* set more arguments, and start the host resolver */ - if ((args->query = + if ((args->dns_query = purple_dnsquery_a(hosttarget, port, _mdns_resolve_host_callback, args)) != NULL) { args->full_service_name = g_strdup(fullname); @@ -286,7 +301,7 @@ const char *name, const char *regtype, const char *domain, void *context) { /* TODO: deal with collision */ - if (kDNSServiceErr_NoError != errorCode) + if (errorCode != kDNSServiceErr_NoError) purple_debug_error("bonjour", "service advertisement - callback error (%d).\n", errorCode); else purple_debug_info("bonjour", "service advertisement - callback.\n"); @@ -298,26 +313,28 @@ { PurpleAccount *account = (PurpleAccount*)context; - if (kDNSServiceErr_NoError != errorCode) - purple_debug_error("bonjour", "service browser - callback error\n"); + if (errorCode != kDNSServiceErr_NoError) + purple_debug_error("bonjour", "service browser - callback error (%d)\n", errorCode); else if (flags & kDNSServiceFlagsAdd) { /* A presence service instance has been discovered... check it isn't us! */ if (purple_utf8_strcasecmp(serviceName, account->username) != 0) { + DNSServiceErrorType resErrorCode; /* OK, lets go ahead and resolve it to add to the buddy list */ ResolveCallbackArgs *args = g_new0(ResolveCallbackArgs, 1); + DNSServiceRef resolver_sr; purple_debug_info("bonjour", "Received new record for '%s' on iface %u (%s, %s)\n", serviceName, interfaceIndex, regtype ? regtype : "", replyDomain ? replyDomain : ""); - if (kDNSServiceErr_NoError == DNSServiceResolve(&args->resolver, 0, 0, serviceName, regtype, - replyDomain, _mdns_service_resolve_callback, args)) { + resErrorCode = DNSServiceResolve(&resolver_sr, 0, 0, serviceName, regtype, + replyDomain, _mdns_service_resolve_callback, args); + if (resErrorCode == kDNSServiceErr_NoError) { GSList *tmp = pending_buddies; PurpleBuddy *pb; BonjourBuddy* bb = NULL; Win32SvcResolverData *rd; Win32BuddyImplData *idata; - gint fd; /* Is there an existing buddy? */ if ((pb = purple_find_buddy(account, serviceName))) @@ -344,7 +361,6 @@ pb->proto_data = bb; } - rd = g_new0(Win32SvcResolverData, 1); rd->if_idx = interfaceIndex; rd->name = g_strdup(serviceName); @@ -358,11 +374,14 @@ args->res_data = rd; args->account = account; + args->resolver_query = g_new(DnsSDServiceRefHandlerData, 1); + args->resolver_query->sdRef = resolver_sr; + args->resolver_query->account = account; /* get a file descriptor for this service ref, and add it to the input list */ - fd = DNSServiceRefSockFD(args->resolver); - args->resolver_handler = purple_input_add(fd, PURPLE_INPUT_READ, _mdns_handle_event, args->resolver); + args->resolver_query->input_handler = purple_input_add(DNSServiceRefSockFD(resolver_sr), + PURPLE_INPUT_READ, _mdns_handle_event, args->resolver_query); } else { - purple_debug_error("bonjour", "service browser - failed to resolve service.\n"); + purple_debug_error("bonjour", "service browser - failed to resolve service. (%d)\n", resErrorCode); g_free(args); } } @@ -432,7 +451,7 @@ gboolean _mdns_publish(BonjourDnsSd *data, PublishType type, GSList *records) { TXTRecordRef dns_data; gboolean ret = TRUE; - DNSServiceErrorType set_ret = kDNSServiceErr_NoError; + DNSServiceErrorType errorCode = kDNSServiceErr_NoError; Win32SessionImplData *idata = data->mdns_impl_data; g_return_val_if_fail(idata != NULL, FALSE); @@ -441,44 +460,46 @@ while (records) { PurpleKeyValuePair *kvp = records->data; - set_ret = TXTRecordSetValue(&dns_data, kvp->key, strlen(kvp->value), kvp->value); - if (set_ret != kDNSServiceErr_NoError) + errorCode = TXTRecordSetValue(&dns_data, kvp->key, strlen(kvp->value), kvp->value); + if (errorCode != kDNSServiceErr_NoError) break; records = records->next; } - if (set_ret != kDNSServiceErr_NoError) { - purple_debug_error("bonjour", "Unable to allocate memory for text record.\n"); + if (errorCode != kDNSServiceErr_NoError) { + purple_debug_error("bonjour", "Unable to allocate memory for text record.(%d)\n", errorCode); ret = FALSE; } else { - DNSServiceErrorType err = kDNSServiceErr_NoError; - /* OK, we're done constructing the text record, (re)publish the service */ + DNSServiceRef presence_sr; switch (type) { case PUBLISH_START: purple_debug_info("bonjour", "Registering presence on port %d\n", data->port_p2pj); - err = DNSServiceRegister(&idata->presence_svc, 0, 0, purple_account_get_username(data->account), ICHAT_SERVICE, + errorCode = DNSServiceRegister(&presence_sr, 0, 0, purple_account_get_username(data->account), LINK_LOCAL_RECORD_NAME, NULL, NULL, htons(data->port_p2pj), TXTRecordGetLength(&dns_data), TXTRecordGetBytesPtr(&dns_data), _mdns_service_register_callback, NULL); break; case PUBLISH_UPDATE: purple_debug_info("bonjour", "Updating presence.\n"); - err = DNSServiceUpdateRecord(idata->presence_svc, NULL, 0, TXTRecordGetLength(&dns_data), TXTRecordGetBytesPtr(&dns_data), 0); + errorCode = DNSServiceUpdateRecord(idata->presence_query->sdRef, NULL, 0, TXTRecordGetLength(&dns_data), TXTRecordGetBytesPtr(&dns_data), 0); break; } - if (err != kDNSServiceErr_NoError) { - purple_debug_error("bonjour", "Failed to publish presence service.\n"); + if (errorCode != kDNSServiceErr_NoError) { + purple_debug_error("bonjour", "Failed to publish presence service.(%d)\n", errorCode); ret = FALSE; } else if (type == PUBLISH_START) { /* We need to do this because according to the Apple docs: * "the client is responsible for ensuring that DNSServiceProcessResult() is called * whenever there is a reply from the daemon - the daemon may terminate its connection * with a client that does not process the daemon's responses */ - idata->presence_handler = purple_input_add(DNSServiceRefSockFD(idata->presence_svc), - PURPLE_INPUT_READ, _mdns_handle_event, idata->presence_svc); + idata->presence_query = g_new(DnsSDServiceRefHandlerData, 1); + idata->presence_query->sdRef = presence_sr; + idata->presence_query->account = data->account; + idata->presence_query->input_handler = purple_input_add(DNSServiceRefSockFD(presence_sr), + PURPLE_INPUT_READ, _mdns_handle_event, idata->presence_query); } } @@ -488,17 +509,24 @@ } gboolean _mdns_browse(BonjourDnsSd *data) { + DNSServiceErrorType errorCode; Win32SessionImplData *idata = data->mdns_impl_data; + DNSServiceRef browser_sr; g_return_val_if_fail(idata != NULL, FALSE); - if (DNSServiceBrowse(&idata->browser_svc, 0, 0, ICHAT_SERVICE, NULL, - _mdns_service_browse_callback, data->account) - == kDNSServiceErr_NoError) { - idata->browser_handler = purple_input_add(DNSServiceRefSockFD(idata->browser_svc), - PURPLE_INPUT_READ, _mdns_handle_event, idata->browser_svc); + errorCode = DNSServiceBrowse(&browser_sr, 0, 0, LINK_LOCAL_RECORD_NAME, NULL, + _mdns_service_browse_callback, data->account); + if (errorCode == kDNSServiceErr_NoError) { + idata->browser_query = g_new(DnsSDServiceRefHandlerData, 1); + idata->browser_query->sdRef = browser_sr; + idata->browser_query->account = data->account; + idata->browser_query->input_handler = purple_input_add(DNSServiceRefSockFD(browser_sr), + PURPLE_INPUT_READ, _mdns_handle_event, idata->browser_query); return TRUE; - } + } else + purple_debug_error("bonjour", "Error registering Local Link presence browser. (%d)\n", errorCode); + return FALSE; } @@ -509,14 +537,16 @@ if (idata == NULL) return; - if (idata->presence_svc != NULL) { - purple_input_remove(idata->presence_handler); - DNSServiceRefDeallocate(idata->presence_svc); + if (idata->presence_query != NULL) { + purple_input_remove(idata->presence_query->input_handler); + DNSServiceRefDeallocate(idata->presence_query->sdRef); + g_free(idata->presence_query); } - if (idata->browser_svc != NULL) { - purple_input_remove(idata->browser_handler); - DNSServiceRefDeallocate(idata->browser_svc); + if (idata->browser_query != NULL) { + purple_input_remove(idata->browser_query->input_handler); + DNSServiceRefDeallocate(idata->browser_query->sdRef); + g_free(idata->browser_query); } g_free(idata); @@ -526,28 +556,30 @@ gboolean _mdns_set_buddy_icon_data(BonjourDnsSd *data, gconstpointer avatar_data, gsize avatar_len) { Win32SessionImplData *idata = data->mdns_impl_data; - DNSServiceErrorType err = kDNSServiceErr_NoError; + DNSServiceErrorType errorCode = kDNSServiceErr_NoError; g_return_val_if_fail(idata != NULL, FALSE); if (avatar_data != NULL && idata->buddy_icon_rec == NULL) { purple_debug_info("bonjour", "Setting new buddy icon.\n"); - err = DNSServiceAddRecord(idata->presence_svc, &idata->buddy_icon_rec, + errorCode = DNSServiceAddRecord(idata->presence_query->sdRef, &idata->buddy_icon_rec, 0, kDNSServiceType_NULL, avatar_len, avatar_data, 0); } else if (avatar_data != NULL) { purple_debug_info("bonjour", "Updating existing buddy icon.\n"); - err = DNSServiceUpdateRecord(idata->presence_svc, idata->buddy_icon_rec, + errorCode = DNSServiceUpdateRecord(idata->presence_query->sdRef, idata->buddy_icon_rec, 0, avatar_len, avatar_data, 0); } else if (idata->buddy_icon_rec != NULL) { purple_debug_info("bonjour", "Removing existing buddy icon.\n"); - DNSServiceRemoveRecord(idata->presence_svc, idata->buddy_icon_rec, 0); + errorCode = DNSServiceRemoveRecord(idata->presence_query->sdRef, idata->buddy_icon_rec, 0); idata->buddy_icon_rec = NULL; } - if (err != kDNSServiceErr_NoError) - purple_debug_error("bonjour", "Error (%d) setting buddy icon record.\n", err); + if (errorCode != kDNSServiceErr_NoError) { + purple_debug_error("bonjour", "Error (%d) setting buddy icon record.\n", errorCode); + return FALSE; + } - return (err == kDNSServiceErr_NoError); + return TRUE; } void _mdns_init_buddy(BonjourBuddy *buddy) { @@ -566,8 +598,9 @@ } if (idata->null_query != NULL) { - purple_input_remove(idata->null_query_handler); - DNSServiceRefDeallocate(idata->null_query); + purple_input_remove(idata->null_query->input_handler); + DNSServiceRefDeallocate(idata->null_query->sdRef); + g_free(idata->null_query); } g_free(idata); @@ -583,17 +616,30 @@ /* Cancel any existing query */ if (idata->null_query != NULL) { - purple_input_remove(idata->null_query_handler); - idata->null_query_handler = 0; - DNSServiceRefDeallocate(idata->null_query); + purple_input_remove(idata->null_query->input_handler); + DNSServiceRefDeallocate(idata->null_query->sdRef); + g_free(idata->null_query); idata->null_query = NULL; } - DNSServiceConstructFullName(svc_name, buddy->name, ICHAT_SERVICE, "local"); - if (kDNSServiceErr_NoError == DNSServiceQueryRecord(&idata->null_query, 0, kDNSServiceInterfaceIndexAny, svc_name, - kDNSServiceType_NULL, kDNSServiceClass_IN, _mdns_record_query_callback, buddy)) { - idata->null_query_handler = purple_input_add(DNSServiceRefSockFD(idata->null_query), - PURPLE_INPUT_READ, _mdns_handle_event, idata->null_query); + if (DNSServiceConstructFullName(svc_name, buddy->name, LINK_LOCAL_RECORD_NAME, "local") != 0) + purple_debug_error("bonjour", "Unable to construct full name to retrieve buddy icon for %s.\n", buddy->name); + else { + DNSServiceRef null_query_sr; + + DNSServiceErrorType errorCode = DNSServiceQueryRecord(&null_query_sr, 0, kDNSServiceInterfaceIndexAny, + svc_name, kDNSServiceType_NULL, kDNSServiceClass_IN, _mdns_record_query_callback, buddy); + + if (errorCode == kDNSServiceErr_NoError) { + idata->null_query = g_new(DnsSDServiceRefHandlerData, 1); + + idata->null_query->sdRef = null_query_sr; + idata->null_query->account = buddy->account; + + idata->null_query->input_handler = purple_input_add(DNSServiceRefSockFD(null_query_sr), + PURPLE_INPUT_READ, _mdns_handle_event, idata->null_query); + } else + purple_debug_error("bonjour", "Unable to query buddy icon record for %s. (%d)\n", buddy->name, errorCode); } } diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/bonjour/parser.c --- a/libpurple/protocols/bonjour/parser.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/bonjour/parser.c Wed Feb 06 03:35:04 2008 +0000 @@ -39,7 +39,7 @@ for(i=0; i < nb_attributes * 5; i+=5) { if(!xmlStrcmp(attributes[i], (xmlChar*) "from")) { int len = attributes[i+4] - attributes[i+3]; - bconv->buddy_name = g_strndup(attributes[i+3], len); + bconv->buddy_name = g_strndup((char *)attributes[i+3], len); bonjour_jabber_conv_match_by_name(bconv); return (bconv->pb != NULL); diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/gg/gg.c --- a/libpurple/protocols/gg/gg.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/gg/gg.c Wed Feb 06 03:35:04 2008 +0000 @@ -1314,7 +1314,7 @@ _("Unable to read socket")); return; } - + gc->last_received = time(NULL); switch (ev->type) { case GG_EVENT_NONE: /* Nothing happened. */ diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/irc/cmds.c --- a/libpurple/protocols/irc/cmds.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/irc/cmds.c Wed Feb 06 03:35:04 2008 +0000 @@ -367,7 +367,12 @@ if (!end) end = cur + strlen(cur); msg = g_strndup(cur, end - cur); - buf = irc_format(irc, "vt:", "PRIVMSG", args[0], msg); + + if(!strcmp(cmd, "notice")) + buf = irc_format(irc, "vt:", "NOTICE", args[0], msg); + else + buf = irc_format(irc, "vt:", "PRIVMSG", args[0], msg); + irc_send(irc, buf); g_free(msg); g_free(buf); diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/irc/dcc_send.c --- a/libpurple/protocols/irc/dcc_send.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/irc/dcc_send.c Wed Feb 06 03:35:04 2008 +0000 @@ -51,9 +51,14 @@ */ static void irc_dccsend_recv_ack(PurpleXfer *xfer, const guchar *data, size_t size) { unsigned long l; + size_t result; l = htonl(xfer->bytes_sent); - write(xfer->fd, &l, sizeof(l)); + result = write(xfer->fd, &l, sizeof(l)); + if (result != sizeof(l)) { + purple_debug_error("irc", "unable to send acknowledgement: %s\n", g_strerror(errno)); + /* TODO: We should probably close the connection here or something. */ + } } static void irc_dccsend_recv_init(PurpleXfer *xfer) { diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/irc/irc.c --- a/libpurple/protocols/irc/irc.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/irc/irc.c Wed Feb 06 03:35:04 2008 +0000 @@ -572,6 +572,7 @@ { char *cur, *end; + irc->account->gc->last_received = time(NULL); irc->inbufused += len; irc->inbuf[irc->inbufused] = '\0'; diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/irc/parse.c --- a/libpurple/protocols/irc/parse.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/irc/parse.c Wed Feb 06 03:35:04 2008 +0000 @@ -136,6 +136,7 @@ { "names", "c", irc_cmd_names, N_("names [channel]: List the users currently in a channel.") }, { "nick", "n", irc_cmd_nick, N_("nick <new nickname>: Change your nickname.") }, { "nickserv", ":", irc_cmd_service, N_("nickserv: Send a command to nickserv") }, + { "notice", "t:", irc_cmd_privmsg, N_("notice <target<: Send a notice to a user or channel.") }, { "op", ":", irc_cmd_op, N_("op <nick1> [nick2] ...: Grant channel operator status to someone. You must be a channel operator to do this.") }, { "operwall", ":", irc_cmd_wallops, N_("operwall <message>: If you don't know what this is, you probably can't use it.") }, { "operserv", ":", irc_cmd_service, N_("operserv: Send a command to operserv") }, diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/jabber/auth.c --- a/libpurple/protocols/jabber/auth.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/jabber/auth.c Wed Feb 06 03:35:04 2008 +0000 @@ -325,7 +325,7 @@ purple_request_yes_no(js->gc, _("Plaintext Authentication"), _("Plaintext Authentication"), msg, - 2, js->gc->account, NULL, NULL, js->gc->account, + 1, js->gc->account, NULL, NULL, js->gc->account, allow_cyrus_plaintext_auth, disallow_plaintext_auth); g_free(msg); @@ -344,6 +344,7 @@ * Doing otherwise means that simply compiling with SASL support renders the client unable to connect to servers * which would connect without issue otherwise. -evands */ + js->auth_type = JABBER_AUTH_IQ_AUTH; jabber_auth_start_old(js); return; } @@ -396,24 +397,6 @@ g_free(enc_out); } } - - if (mech && (strcmp(mech, "DIGEST-MD5") == 0)) { - /* CYRUS-SASL's DIGEST-MD5 and Java's DIGEST-MD5 are mutually incompatible because of different interpretations of RFC2831. - * This means that if we are using SASL and connecting to a Java-based server such as OpenFire, we will receive an authentication - * failure if that server offers DIGEST-MD5 in such a way that SASL chooses it as the best mechanism for us. - * - * However, we implement our own DIGEST-MD5 for use when we're compiled without SASL support, and that implementation - * works correctly. Therefore, if SASL chooses DIGEST-MD5, we switch over to our own implementation. - * jabber_auth_handle_challenge() will note the auth_type and take it from there. - * - * SASL would change state to SASL_OK after when handling the challenge; we do so immediately to avoid an error later. - */ - js->auth_type = JABBER_AUTH_DIGEST_MD5; - js->sasl_state = SASL_OK; - sasl_dispose(&js->sasl); - js->sasl = NULL; - } - jabber_send(js, auth); xmlnode_free(auth); } else { @@ -545,7 +528,7 @@ purple_request_yes_no(js->gc, _("Plaintext Authentication"), _("Plaintext Authentication"), msg, - 2, + 1, purple_connection_get_account(js->gc), NULL, NULL, purple_connection_get_account(js->gc), allow_plaintext_auth, disallow_plaintext_auth); @@ -737,7 +720,7 @@ purple_request_yes_no(js->gc, _("Plaintext Authentication"), _("Plaintext Authentication"), _("This server requires plaintext authentication over an unencrypted connection. Allow this and continue authentication?"), - 2, + 1, purple_connection_get_account(js->gc), NULL, NULL, purple_connection_get_account(js->gc), allow_plaintext_auth, disallow_plaintext_auth); @@ -1095,10 +1078,12 @@ } } /* If we've negotiated a security layer, we need to enable it */ - sasl_getprop(js->sasl, SASL_SSF, &x); - if (*(int *)x > 0) { - sasl_getprop(js->sasl, SASL_MAXOUTBUF, &x); - js->sasl_maxbuf = *(int *)x; + if (js->sasl) { + sasl_getprop(js->sasl, SASL_SSF, &x); + if (*(int *)x > 0) { + sasl_getprop(js->sasl, SASL_MAXOUTBUF, &x); + js->sasl_maxbuf = *(int *)x; + } } #endif diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/jabber/jabber.c --- a/libpurple/protocols/jabber/jabber.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/jabber/jabber.c Wed Feb 06 03:35:04 2008 +0000 @@ -390,26 +390,29 @@ static void jabber_pong_cb(JabberStream *js, xmlnode *packet, gpointer timeout) { - g_source_remove(GPOINTER_TO_INT(timeout)); + purple_timeout_remove(GPOINTER_TO_INT(timeout)); + js->keepalive_timeout = -1; } static gboolean jabber_pong_timeout(PurpleConnection *gc) { + JabberStream *js = gc->proto_data; purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Ping timeout")); + js->keepalive_timeout = -1; return FALSE; } void jabber_keepalive(PurpleConnection *gc) { - JabberIq *iq = jabber_iq_new(gc->proto_data, JABBER_IQ_GET); - guint timeout; + JabberStream *js = gc->proto_data; + JabberIq *iq = jabber_iq_new(js, JABBER_IQ_GET); - xmlnode *ping = xmlnode_new_child(iq->node, "ping"); - xmlnode_set_namespace(ping, "urn:xmpp:ping"); + xmlnode *ping = xmlnode_new_child(iq->node, "ping"); + xmlnode_set_namespace(ping, "urn:xmpp:ping"); - timeout = purple_timeout_add_seconds(20, (GSourceFunc)(jabber_pong_timeout), gc); - jabber_iq_set_callback(iq, jabber_pong_cb, GINT_TO_POINTER(timeout)); + js->keepalive_timeout = purple_timeout_add_seconds(20, (GSourceFunc)(jabber_pong_timeout), gc); + jabber_iq_set_callback(iq, jabber_pong_cb, GINT_TO_POINTER(js->keepalive_timeout)); jabber_iq_send(iq); } @@ -429,6 +432,7 @@ } while((len = purple_ssl_read(gsc, buf, sizeof(buf) - 1)) > 0) { + gc->last_received = time(NULL); buf[len] = '\0'; purple_debug(PURPLE_DEBUG_INFO, "jabber", "Recv (ssl)(%d): %s\n", len, buf); jabber_parser_process(js, buf, len); @@ -456,6 +460,7 @@ return; if((len = read(js->fd, buf, sizeof(buf) - 1)) > 0) { + gc->last_received = time(NULL); #ifdef HAVE_CYRUS_SASL if (js->sasl_maxbuf>0) { const char *out; @@ -556,13 +561,12 @@ purple_input_remove(js->gc->inpa); js->gc->inpa = 0; js->gsc = purple_ssl_connect_with_host_fd(js->gc->account, js->fd, - jabber_login_callback_ssl, jabber_ssl_connect_failure, js->host, js->gc); + jabber_login_callback_ssl, jabber_ssl_connect_failure, js->certificate_CN, js->gc); } static void jabber_login_connect(JabberStream *js, const char *fqdn, const char *host, int port) { js->serverFQDN = g_strdup(fqdn); - js->host = g_strdup(host); if (purple_proxy_connect(js->gc, js->gc->account, host, port, jabber_login_callback, js->gc) == NULL) @@ -611,7 +615,9 @@ js->user = jabber_id_new(purple_account_get_username(account)); js->next_id = g_random_int(); js->write_buffer = purple_circ_buffer_new(512); - js->old_length = -1; + js->old_length = 0; + js->keepalive_timeout = -1; + js->certificate_CN = g_strdup(connect_server[0] ? connect_server : js->user->domain); if(!js->user) { purple_connection_error_reason (gc, @@ -649,7 +655,7 @@ if(purple_account_get_bool(js->gc->account, "old_ssl", FALSE)) { if(purple_ssl_is_supported()) { js->gsc = purple_ssl_connect(js->gc->account, - connect_server[0] ? connect_server : js->user->domain, + js->certificate_CN, purple_account_get_int(account, "port", 5223), jabber_login_callback_ssl, jabber_ssl_connect_failure, js->gc); } else { @@ -1096,7 +1102,7 @@ g_free, g_free); js->user = jabber_id_new(purple_account_get_username(account)); js->next_id = g_random_int(); - js->old_length = -1; + js->old_length = 0; if(!js->user) { purple_connection_error_reason (gc, @@ -1124,6 +1130,7 @@ my_jb->subscription |= JABBER_SUB_BOTH; server = connect_server[0] ? connect_server : js->user->domain; + js->certificate_CN = g_strdup(server); jabber_stream_set_state(js, JABBER_STREAM_CONNECTING); @@ -1300,7 +1307,7 @@ js->commands = g_list_delete_link(js->commands, js->commands); } g_free(js->server_name); - g_free(js->host); + g_free(js->certificate_CN); g_free(js->gmail_last_time); g_free(js->gmail_last_tid); g_free(js->old_msg); @@ -1311,6 +1318,9 @@ g_free(js->old_uri); g_free(js->old_track); + if (js->keepalive_timeout != -1) + purple_timeout_remove(js->keepalive_timeout); + g_free(js); gc->proto_data = NULL; @@ -1516,10 +1526,16 @@ } else purple_notify_user_info_add_pair(user_info, _("Mood"), mood); } - if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_TUNE)) { + if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_TUNE)) { PurpleStatus *tune = purple_presence_get_status(presence, "tune"); const char *title = purple_status_get_attr_string(tune, PURPLE_TUNE_TITLE); - purple_notify_user_info_add_pair(user_info, _("Current media"), title); + const char *artist = purple_status_get_attr_string(tune, PURPLE_TUNE_ARTIST); + const char *album = purple_status_get_attr_string(tune, PURPLE_TUNE_ALBUM); + char *playing = purple_util_format_song_info(title, artist, album, NULL); + if (playing) { + purple_notify_user_info_add_pair(user_info, _("Now Listening"), playing); + g_free(playing); + } } } @@ -2287,14 +2303,10 @@ GList *jabber_attention_types(PurpleAccount *account) { static GList *types = NULL; - PurpleAttentionType *attn; if (!types) { - attn = g_new0(PurpleAttentionType, 1); - attn->name = _("Buzz"); - attn->incoming_description = _("%s has buzzed you!"); - attn->outgoing_description = _("Buzzing %s..."); - types = g_list_append(types, attn); + types = g_list_append(types, purple_attention_type_new("Buzz", _("Buzz"), + _("%s has buzzed you!"), _("Buzzing %s..."))); } return types; diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/jabber/jabber.h --- a/libpurple/protocols/jabber/jabber.h Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/jabber/jabber.h Wed Feb 06 03:35:04 2008 +0000 @@ -192,7 +192,10 @@ int old_length; char *old_track; - char *host; + char *certificate_CN; + + /* A purple timeout tag for the keepalive */ + int keepalive_timeout; }; typedef gboolean (JabberFeatureEnabled)(JabberStream *js, const gchar *shortname, const gchar *namespace); diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/jabber/si.c --- a/libpurple/protocols/jabber/si.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/jabber/si.c Wed Feb 06 03:35:04 2008 +0000 @@ -1089,7 +1089,7 @@ } else { /* we've got multiple resources, we need to pick one to send to */ GList *l; - char *msg = g_strdup_printf(_("Please select which resource of %s you would like to send a file to"), xfer->who); + char *msg = g_strdup_printf(_("Please select the resource of %s to which you would like to send a file"), xfer->who); PurpleRequestFields *fields = purple_request_fields_new(); PurpleRequestField *field = purple_request_field_choice_new("resource", _("Resource"), 0); PurpleRequestFieldGroup *group = purple_request_field_group_new(NULL); diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/jabber/usertune.c --- a/libpurple/protocols/jabber/usertune.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/jabber/usertune.c Wed Feb 06 03:35:04 2008 +0000 @@ -35,11 +35,12 @@ xmlnode *tuneinfo, *tune; PurpleJabberTuneInfo tuneinfodata; JabberBuddyResource *resource; - + gboolean valid = FALSE; + /* ignore the tune of people not on our buddy list */ if (!buddy || !item) return; - + tuneinfodata.artist = NULL; tuneinfodata.title = NULL; tuneinfodata.album = NULL; @@ -58,36 +59,47 @@ if (!strcmp(tuneinfo->name, "artist")) { if (tuneinfodata.artist == NULL) /* only pick the first one */ tuneinfodata.artist = xmlnode_get_data(tuneinfo); + valid = TRUE; } else if (!strcmp(tuneinfo->name, "length")) { if (tuneinfodata.time == -1) { char *length = xmlnode_get_data(tuneinfo); if (length) tuneinfodata.time = strtol(length, NULL, 10); g_free(length); + if (tuneinfodata.time > 0) + valid = TRUE; } } else if (!strcmp(tuneinfo->name, "source")) { if (tuneinfodata.album == NULL) /* only pick the first one */ tuneinfodata.album = xmlnode_get_data(tuneinfo); + valid = TRUE; } else if (!strcmp(tuneinfo->name, "title")) { if (tuneinfodata.title == NULL) /* only pick the first one */ tuneinfodata.title = xmlnode_get_data(tuneinfo); + valid = TRUE; } else if (!strcmp(tuneinfo->name, "track")) { if (tuneinfodata.track == NULL) /* only pick the first one */ tuneinfodata.track = xmlnode_get_data(tuneinfo); + valid = TRUE; } else if (!strcmp(tuneinfo->name, "uri")) { if (tuneinfodata.url == NULL) /* only pick the first one */ tuneinfodata.url = xmlnode_get_data(tuneinfo); + valid = TRUE; } } } - purple_prpl_got_user_status(js->gc->account, from, "tune", - PURPLE_TUNE_ARTIST, tuneinfodata.artist, - PURPLE_TUNE_TITLE, tuneinfodata.title, - PURPLE_TUNE_ALBUM, tuneinfodata.album, - PURPLE_TUNE_TRACK, tuneinfodata.track, - PURPLE_TUNE_TIME, tuneinfodata.time, - PURPLE_TUNE_URL, tuneinfodata.url, NULL); + if (valid) { + purple_prpl_got_user_status(js->gc->account, from, "tune", + PURPLE_TUNE_ARTIST, tuneinfodata.artist, + PURPLE_TUNE_TITLE, tuneinfodata.title, + PURPLE_TUNE_ALBUM, tuneinfodata.album, + PURPLE_TUNE_TRACK, tuneinfodata.track, + PURPLE_TUNE_TIME, tuneinfodata.time, + PURPLE_TUNE_URL, tuneinfodata.url, NULL); + } else { + purple_prpl_got_user_status_deactive(js->gc->account, from, "tune"); + } g_free(tuneinfodata.artist); g_free(tuneinfodata.title); @@ -119,7 +131,7 @@ xmlnode_insert_data(xmlnode_new_child(tunenode, "source"),tuneinfo->album,-1); if(tuneinfo->url && tuneinfo->url[0] != '\0') xmlnode_insert_data(xmlnode_new_child(tunenode, "uri"),tuneinfo->url,-1); - if(tuneinfo->time >= 0) { + if(tuneinfo->time > 0) { char *length = g_strdup_printf("%d", tuneinfo->time); xmlnode_insert_data(xmlnode_new_child(tunenode, "length"),length,-1); g_free(length); diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/msn/msn.c --- a/libpurple/protocols/msn/msn.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/msn/msn.c Wed Feb 06 03:35:04 2008 +0000 @@ -122,15 +122,11 @@ static GList * msn_attention_types(PurpleAccount *account) { - PurpleAttentionType *attn; static GList *list = NULL; if (!list) { - attn = g_new0(PurpleAttentionType, 1); - attn->name = _("Nudge"); - attn->incoming_description = _("%s has nudged you!"); - attn->outgoing_description = _("Nudging %s..."); - list = g_list_append(list, attn); + list = g_list_append(list, purple_attention_type_new("Nudge", _("Nudge"), + _("%s has nudged you!"), _("Nudging %s..."))); } return list; @@ -355,7 +351,7 @@ _("Do you want to allow or disallow people on " "your buddy list to send you MSN Mobile pages " "to your cell phone or other mobile device?"), - -1, + PURPLE_DEFAULT_ACTION_NONE, purple_connection_get_account(gc), NULL, NULL, gc, 3, _("Allow"), G_CALLBACK(enable_msn_pages_cb), @@ -461,7 +457,7 @@ msn_switchboard_request_add_user(swboard, buddy->name); /* TODO: This might move somewhere else, after USR might be */ - swboard->chat_id = session->conv_seq++; + swboard->chat_id = msn_switchboard_get_chat_id(); swboard->conv = serv_got_joined_chat(gc, swboard->chat_id, "MSN Chat"); swboard->flag = MSN_SB_FLAG_IM; @@ -593,8 +589,8 @@ PurpleStatus *tune = purple_presence_get_status(presence, "tune"); const char *title = purple_status_get_attr_string(tune, PURPLE_TUNE_TITLE); const char *artist = purple_status_get_attr_string(tune, PURPLE_TUNE_ARTIST); - currentmedia = g_strdup_printf("%s%s%s", title, artist ? " - " : "", - artist ? artist : ""); + const char *album = purple_status_get_attr_string(tune, PURPLE_TUNE_ALBUM); + currentmedia = purple_util_format_song_info(title, artist, album, NULL); /* We could probably just use user->media.title etc. here */ } @@ -643,9 +639,7 @@ } if (currentmedia) { - tmp = g_markup_escape_text(currentmedia, -1); - purple_notify_user_info_add_pair(user_info, _("Current media"), tmp); - g_free(tmp); + purple_notify_user_info_add_pair(user_info, _("Now Listening"), currentmedia); g_free(currentmedia); } } @@ -661,8 +655,22 @@ */ if (full && user) { + const char *phone; + purple_notify_user_info_add_pair(user_info, _("Blocked"), ((user->list_op & (1 << MSN_LIST_BL)) ? _("Yes") : _("No"))); + + phone = msn_user_get_home_phone(user); + if (phone != NULL) + purple_notify_user_info_add_pair(user_info, _("Home Phone Number"), phone); + + phone = msn_user_get_work_phone(user); + if (phone != NULL) + purple_notify_user_info_add_pair(user_info, _("Work Phone Number"), phone); + + phone = msn_user_get_mobile_phone(user); + if (phone != NULL) + purple_notify_user_info_add_pair(user_info, _("Mobile Phone Number"), phone); } } diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/msn/servconn.c --- a/libpurple/protocols/msn/servconn.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/msn/servconn.c Wed Feb 06 03:35:04 2008 +0000 @@ -391,6 +391,7 @@ session = servconn->session; len = read(servconn->fd, buf, sizeof(buf) - 1); + servconn->session->account->gc->last_received = time(NULL); if (len <= 0) { switch (errno) { diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/msn/session.c --- a/libpurple/protocols/msn/session.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/msn/session.c Wed Feb 06 03:35:04 2008 +0000 @@ -46,7 +46,6 @@ session->oim = msn_oim_new(session); session->protocol_ver = WLM_PROT_VER; - session->conv_seq = 1; return session; } diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/msn/session.h --- a/libpurple/protocols/msn/session.h Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/msn/session.h Wed Feb 06 03:35:04 2008 +0000 @@ -107,8 +107,6 @@ GList *directconns; /**< The list of all the directconnections. */ GList *slplinks; /**< The list of all the slplinks. */ - int conv_seq; /**< The current conversation sequence number. */ - /*psm info*/ char *psm; diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/msn/switchboard.c --- a/libpurple/protocols/msn/switchboard.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/msn/switchboard.c Wed Feb 06 03:35:04 2008 +0000 @@ -164,6 +164,14 @@ return swboard->session_id; } +int +msn_switchboard_get_chat_id(void) +{ + static int chat_id = 1; + + return chat_id++; +} + void msn_switchboard_set_invited(MsnSwitchBoard *swboard, gboolean invited) { @@ -250,7 +258,7 @@ purple_conversation_destroy(swboard->conv); #endif - swboard->chat_id = cmdproc->session->conv_seq++; + swboard->chat_id = msn_switchboard_get_chat_id(); swboard->flag |= MSN_SB_FLAG_IM; swboard->conv = serv_got_joined_chat(account->gc, swboard->chat_id, diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/msn/switchboard.h --- a/libpurple/protocols/msn/switchboard.h Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/msn/switchboard.h Wed Feb 06 03:35:04 2008 +0000 @@ -167,6 +167,13 @@ const char *msn_switchboard_get_session_id(MsnSwitchBoard *swboard); /** + * Returns the next chat ID for use by a switchboard. + * + * @return The chat ID. + */ +int msn_switchboard_get_chat_id(void); + +/** * Sets whether or not we were invited to this switchboard. * * @param swboard The switchboard. diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/msnp9/msn.c --- a/libpurple/protocols/msnp9/msn.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/msnp9/msn.c Wed Feb 06 03:35:04 2008 +0000 @@ -27,6 +27,7 @@ #include "msn.h" #include "accountopt.h" +#include "eventloop.h" #include "msg.h" #include "page.h" #include "pluginpref.h" @@ -122,15 +123,11 @@ static GList * msn_attention_types(PurpleAccount *account) { - PurpleAttentionType *attn; static GList *list = NULL; if (!list) { - attn = g_new0(PurpleAttentionType, 1); - attn->name = _("Nudge"); - attn->incoming_description = _("%s has nudged you!"); - attn->outgoing_description = _("Nudging %s..."); - list = g_list_append(list, attn); + list = g_list_append(list, purple_attention_type_new("Nudge", _("Nudge"), + _("%s has nudged you!"), _("Nudging %s..."))); } return list; @@ -351,7 +348,7 @@ _("Do you want to allow or disallow people on " "your buddy list to send you MSN Mobile pages " "to your cell phone or other mobile device?"), - -1, + PURPLE_DEFAULT_ACTION_NONE, purple_connection_get_account(gc), NULL, NULL, gc, 3, _("Allow"), G_CALLBACK(enable_msn_pages_cb), @@ -435,7 +432,7 @@ msn_switchboard_request_add_user(swboard, buddy->name); /* TODO: This might move somewhere else, after USR might be */ - swboard->chat_id = session->conv_seq++; + swboard->chat_id = msn_switchboard_get_chat_id(); swboard->conv = serv_got_joined_chat(gc, swboard->chat_id, "MSN Chat"); swboard->flag = MSN_SB_FLAG_IM; @@ -560,8 +557,22 @@ * you, which is the important information that this is trying to convey. */ if (full && user) { + const char *phone; + purple_notify_user_info_add_pair(user_info, _("Blocked"), ((user->list_op & (1 << MSN_LIST_BL)) ? _("Yes") : _("No"))); + + phone = msn_user_get_home_phone(user); + if (phone != NULL) + purple_notify_user_info_add_pair(user_info, _("Home Phone Number"), phone); + + phone = msn_user_get_work_phone(user); + if (phone != NULL) + purple_notify_user_info_add_pair(user_info, _("Work Phone Number"), phone); + + phone = msn_user_get_mobile_phone(user); + if (phone != NULL) + purple_notify_user_info_add_pair(user_info, _("Mobile Phone Number"), phone); } } @@ -860,7 +871,7 @@ imdata->msg = body_str; imdata->flags = flags; imdata->when = time(NULL); - g_idle_add(msn_send_me_im, imdata); + purple_timeout_add(0, msn_send_me_im, imdata); } msn_message_destroy(msg); diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/msnp9/notification.c --- a/libpurple/protocols/msnp9/notification.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/msnp9/notification.c Wed Feb 06 03:35:04 2008 +0000 @@ -840,6 +840,38 @@ } static void +bpr_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + const char *type, *value, *passport; + MsnUser *user; + + passport = cmd->params[1]; + user = msn_userlist_find_user(cmdproc->session->userlist, passport); + + g_return_if_fail(user != NULL); + + type = cmd->params[2]; + value = cmd->params[3]; + + if (value) + { + if (!strcmp(type, "MOB")) + { + if (!strcmp(value, "Y")) + user->mobile = TRUE; + else if (!strcmp(value, "N")) + user->mobile = FALSE; + } + else if (!strcmp(type, "PHH")) + msn_user_set_home_phone(user, purple_url_decode(value)); + else if (!strcmp(type, "PHW")) + msn_user_set_work_phone(user, purple_url_decode(value)); + else if (!strcmp(type, "PHM")) + msn_user_set_mobile_phone(user, purple_url_decode(value)); + } +} + +static void reg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { MsnSession *session; @@ -1012,7 +1044,7 @@ { purple_debug_error("msn", "Error opening temp passport file: %s\n", - strerror(errno)); + g_strerror(errno)); } else { @@ -1061,7 +1093,7 @@ { purple_debug_error("msn", "Error closing temp passport file: %s\n", - strerror(errno)); + g_strerror(errno)); g_unlink(session->passport_info.file); g_free(session->passport_info.file); @@ -1435,6 +1467,7 @@ msn_table_add_cmd(cbs_table, NULL, "IPG", ipg_cmd); msn_table_add_cmd(cbs_table, NULL, "MSG", msg_cmd); msn_table_add_cmd(cbs_table, NULL, "NOT", not_cmd); + msn_table_add_cmd(cbs_table, NULL, "BPR", bpr_cmd); msn_table_add_cmd(cbs_table, NULL, "CHL", chl_cmd); msn_table_add_cmd(cbs_table, NULL, "REM", rem_cmd); diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/msnp9/servconn.c --- a/libpurple/protocols/msnp9/servconn.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/msnp9/servconn.c Wed Feb 06 03:35:04 2008 +0000 @@ -387,12 +387,13 @@ session = servconn->session; len = read(servconn->fd, buf, sizeof(buf) - 1); + servconn->session->account->gc->last_received = time(NULL); if (len < 0 && errno == EAGAIN) return; else if (len <= 0) { - purple_debug_error("msn", "servconn read error, len: %d error: %s\n", len, strerror(errno)); + purple_debug_error("msn", "servconn read error, len: %d error: %s\n", len, g_strerror(errno)); msn_servconn_got_error(servconn, MSN_SERVCONN_ERROR_READ); return; diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/msnp9/session.c --- a/libpurple/protocols/msnp9/session.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/msnp9/session.c Wed Feb 06 03:35:04 2008 +0000 @@ -44,7 +44,6 @@ purple_account_get_username(account), NULL); session->protocol_ver = 9; - session->conv_seq = 1; return session; } @@ -398,8 +397,13 @@ PurpleStoredImage *img; const char *passport; - if (session->logged_in) + if (session->logged_in) { + /* We are probably here because of a mid-session notification server XFR + * We must send a CHG now, otherwise the servers default to invisible, + * and prevent things happening, like sending IMs */ + msn_change_status(session); return; + } account = session->account; gc = purple_account_get_connection(account); diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/msnp9/session.h --- a/libpurple/protocols/msnp9/session.h Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/msnp9/session.h Wed Feb 06 03:35:04 2008 +0000 @@ -103,8 +103,6 @@ GList *directconns; /**< The list of all the directconnections. */ GList *slplinks; /**< The list of all the slplinks. */ - int conv_seq; /**< The current conversation sequence number. */ - struct { char *kv; diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/msnp9/slpcall.c --- a/libpurple/protocols/msnp9/slpcall.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/msnp9/slpcall.c Wed Feb 06 03:35:04 2008 +0000 @@ -34,7 +34,7 @@ **************************************************************************/ static char * -rand_guid() +rand_guid(void) { return g_strdup_printf("%4X%4X-%4X-%4X-%4X-%4X%4X%4X", rand() % 0xAAFF + 0x1111, diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/msnp9/switchboard.c --- a/libpurple/protocols/msnp9/switchboard.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/msnp9/switchboard.c Wed Feb 06 03:35:04 2008 +0000 @@ -166,6 +166,14 @@ return swboard->session_id; } +int +msn_switchboard_get_chat_id(void) +{ + static int chat_id = 1; + + return chat_id++; +} + void msn_switchboard_set_invited(MsnSwitchBoard *swboard, gboolean invited) { @@ -252,7 +260,7 @@ purple_conversation_destroy(swboard->conv); #endif - swboard->chat_id = cmdproc->session->conv_seq++; + swboard->chat_id = msn_switchboard_get_chat_id(); swboard->flag |= MSN_SB_FLAG_IM; swboard->conv = serv_got_joined_chat(account->gc, swboard->chat_id, diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/msnp9/switchboard.h --- a/libpurple/protocols/msnp9/switchboard.h Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/msnp9/switchboard.h Wed Feb 06 03:35:04 2008 +0000 @@ -167,6 +167,13 @@ const char *msn_switchboard_get_session_id(MsnSwitchBoard *swboard); /** + * Returns the next chat ID for use by a switchboard. + * + * @return The chat ID. + */ +int msn_switchboard_get_chat_id(void); + +/** * Sets whether or not we were invited to this switchboard. * * @param swboard The switchboard. diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/msnp9/sync.c --- a/libpurple/protocols/msnp9/sync.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/msnp9/sync.c Wed Feb 06 03:35:04 2008 +0000 @@ -206,6 +206,8 @@ { if (!strcmp(value, "Y")) user->mobile = TRUE; + else if (!strcmp(value, "N")) + user->mobile = FALSE; } else if (!strcmp(type, "PHH")) msn_user_set_home_phone(user, purple_url_decode(value)); diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/msnp9/user.c --- a/libpurple/protocols/msnp9/user.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/msnp9/user.c Wed Feb 06 03:35:04 2008 +0000 @@ -36,7 +36,8 @@ user->userlist = userlist; msn_user_set_passport(user, passport); - msn_user_set_friendly_name(user, friendly_name); + if (friendly_name != NULL) + msn_user_set_friendly_name(user, friendly_name); return user; } diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/myspace/myspace.c --- a/libpurple/protocols/myspace/myspace.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/myspace/myspace.c Wed Feb 06 03:35:04 2008 +0000 @@ -133,7 +133,7 @@ types = NULL; - /* Statuses are almost all the same. Define a macro to reduce code repetition. */ + /* Statuses are almost all the same. Define a macro to reduce code repetition. */ #define _MSIM_ADD_NEW_STATUS(prim) status = \ purple_status_type_new_with_attrs( \ prim, /* PurpleStatusPrimitive */ \ @@ -158,6 +158,20 @@ _MSIM_ADD_NEW_STATUS(PURPLE_STATUS_OFFLINE); _MSIM_ADD_NEW_STATUS(PURPLE_STATUS_INVISIBLE); + /* Except tune status is different... */ + status = purple_status_type_new_with_attrs( + PURPLE_STATUS_TUNE, /* primitive */ + "tune", /* ID */ + NULL, /* name - use default */ + TRUE, /* savable */ + TRUE, /* should be user_settable some day */ + TRUE, /* independent */ + + PURPLE_TUNE_ARTIST, _("Artist"), purple_value_new(PURPLE_TYPE_STRING), + PURPLE_TUNE_TITLE, _("Title"), purple_value_new(PURPLE_TYPE_STRING), + NULL); + + types = g_list_append(types, status); return types; } @@ -552,10 +566,8 @@ * return 1 even if the message could not be sent, since I don't know if * it has failed yet--because the IM is only sent after the userid is * retrieved from the server (which happens after this function returns). + * If an error does occur, it should be logged to the IM window. */ - /* TODO: maybe if message is delayed, don't echo to conv window, - * but do echo it to conv window manually once it is actually - * sent? Would be complicated. */ rc = 1; } else { rc = -1; @@ -563,19 +575,6 @@ g_free(message_msim); - /* - * In MySpace, you login with your email address, but don't talk to other - * users using their email address. So there is currently an asymmetry in the - * IM windows when using this plugin: - * - * you@example.com: hello - * some_other_user: what's going on? - * you@example.com: just coding a prpl - * - * TODO: Make the sent IM's appear as from the user's username, instead of - * their email address. Purple uses the login (in MSIM, the email)--change this. - */ - return rc; } @@ -602,7 +601,7 @@ g_return_val_if_fail(MSIM_SESSION_VALID(session), FALSE); g_return_val_if_fail(who != NULL, FALSE); g_return_val_if_fail(text != NULL, FALSE); - + from_username = session->account->username; g_return_val_if_fail(from_username != NULL, FALSE); @@ -611,7 +610,7 @@ type, from_username, who, text); msg = msim_msg_new( - "bm", MSIM_TYPE_INTEGER, GUINT_TO_POINTER(type), + "bm", MSIM_TYPE_INTEGER, GUINT_TO_POINTER(type), "sesskey", MSIM_TYPE_INTEGER, GUINT_TO_POINTER(session->sesskey), /* 't' will be inserted here */ "cv", MSIM_TYPE_INTEGER, GUINT_TO_POINTER(MSIM_CLIENT_VERSION), @@ -664,7 +663,7 @@ msim_incoming_bm(MsimSession *session, MsimMessage *msg) { guint bm; - + bm = msim_msg_get_integer(msg, "bm"); msim_incoming_bm_record_cv(session, msg); @@ -745,7 +744,10 @@ /* TODO: dump unknown msgs to file, so user can send them to me * if they wish, to help add support for new messages (inspired - * by Alexandr Shutko, who maintains OSCAR protocol documentation). */ + * by Alexandr Shutko, who maintains OSCAR protocol documentation). + * + * Filed enhancement ticket for libpurple as #4688. + */ purple_debug_info("msim", "Unrecognized data on account for %s\n", (session && session->account && session->account->username) ? @@ -787,9 +789,6 @@ msg_text, username); if (g_str_equal(msg_text, "%typing%")) { - /* TODO: find out if msim repeatedly sends typing messages, so we can - * give it a timeout. Right now, there does seem to be an inordinately - * amount of time between typing stopped-typing notifications. */ serv_got_typing(session->gc, username, 0, PURPLE_TYPING); rc = TRUE; } else if (g_str_equal(msg_text, "%stoptyping%")) { @@ -797,6 +796,25 @@ rc = TRUE; } else if (strstr(msg_text, "!!!ZAP_SEND!!!=RTE_BTN_ZAPS_")) { rc = msim_incoming_zap(session, msg); + } else if (strstr(msg_text, "!!!GroupCount=")) { + /* TODO: support group chats. I think the number in msg_text has + * something to do with the 'gid' field. */ + purple_debug_info("msim", "msim_incoming_action: TODO: implement #4691, group chats: %s\n", msg_text); + + rc = TRUE; + } else if (strstr(msg_text, "!!!Offline=")) { + /* TODO: support group chats. This one might mean a user + * went offline or exited the chat. */ + purple_debug_info("msim", "msim_incoming_action: TODO: implement #4691, group chats: %s\n", msg_text); + + rc = TRUE; + } else if (msim_msg_get_integer(msg, "aid") != 0) { + purple_debug_info("msim", "TODO: implement #4691, group chat from %d on %d: %s\n", + msim_msg_get_integer(msg, "aid"), + msim_msg_get_integer(msg, "f"), + msg_text); + + rc = TRUE; } else { msim_unrecognized(session, msg, "got to msim_incoming_action but unrecognized value for 'msg'"); @@ -959,6 +977,7 @@ if (!user) { /* User isn't on blist, create a temporary user to store info. */ + /* TODO: is this legit, or is it somehow responsible for #3444? */ PurpleBuddy *buddy; user = g_new0(MsimUser, 1); @@ -990,8 +1009,6 @@ g_free(user->headline); g_free(user->display_name); g_free(user->username); - g_free(user->band_name); - g_free(user->song_name); g_free(user->image_url); g_free(user); } @@ -1052,6 +1069,7 @@ guint status_code; const gchar *message; gchar *stripped; + gchar *unrecognized_msg; session = (MsimSession *)account->gc->proto_data; @@ -1083,6 +1101,12 @@ purple_debug_info("msim", "msim_set_status: unknown " "status interpreting as online"); status_code = MSIM_STATUS_CODE_ONLINE; + + unrecognized_msg = g_strdup_printf("msim_set_status, unrecognized status type: %d\n", + purple_status_type_get_primitive(type)); + msim_unrecognized(session, NULL, unrecognized_msg); + g_free(unrecognized_msg); + break; } @@ -1197,13 +1221,13 @@ /* Special elements name beginning with '_', we'll use internally within the * program (did not come directly from the wire). */ msg = msim_msg_append(msg, "_username", MSIM_TYPE_STRING, username); /* This makes 'msg' the owner of 'username' */ - + /* TODO: attach more useful information, like ImageURL */ msim_process(session, msg); /* TODO: Free copy cloned from msim_preprocess_incoming(). */ - //XXX msim_msg_free(msg); + /* msim_msg_free(msg); */ msim_msg_free(body); } @@ -1211,16 +1235,17 @@ * * @param wanted_uid * - * @return Username of wanted_uid, if on blist, or NULL. Static string. + * @return Username of wanted_uid, if on blist, or NULL. + * This is a static string, so don't free it. Copy it if needed. * */ static const gchar * -msim_uid2username_from_blist(MsimSession *session, guint wanted_uid) +msim_uid2username_from_blist(PurpleAccount *account, guint wanted_uid) { GSList *buddies, *cur; - gchar *ret; - - buddies = purple_find_buddies(session->account, NULL); + const gchar *ret; + + buddies = purple_find_buddies(account, NULL); if (!buddies) { @@ -1244,7 +1269,7 @@ if (uid == wanted_uid) { - ret = g_strdup(name); + ret = name; break; } } @@ -1271,7 +1296,7 @@ /* 'f' = userid message is from, in buddy messages */ uid = msim_msg_get_integer(msg, "f"); - username = msim_uid2username_from_blist(session, uid); + username = msim_uid2username_from_blist(session->account, uid); if (username) { /* Know username already, use it. */ @@ -1313,13 +1338,13 @@ g_return_val_if_fail(MSIM_SESSION_VALID(session), FALSE); delta = time(NULL) - session->last_comm; - //purple_debug_info("msim", "msim_check_alive: delta=%d\n", delta); + /* purple_debug_info("msim", "msim_check_alive: delta=%d\n", delta); */ if (delta >= MSIM_KEEPALIVE_INTERVAL) { errmsg = g_strdup_printf(_("Connection to server lost (no data received within %d seconds)"), (int)delta); purple_debug_info("msim", "msim_check_alive: %s > interval of %d, presumed dead\n", errmsg, MSIM_KEEPALIVE_INTERVAL); - purple_connection_error_reason (session->gc, + purple_connection_error_reason(session->gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, errmsg); purple_notify_error(session->gc, NULL, errmsg, NULL); @@ -1741,7 +1766,7 @@ static gboolean msim_web_challenge(MsimSession *session, MsimMessage *msg) { - /* TODO: web challenge, store token */ + /* TODO: web challenge, store token. #2659. */ return FALSE; } @@ -1832,13 +1857,14 @@ if (msim_msg_get(msg, "fatal")) { PurpleConnectionError reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; purple_debug_info("msim", "fatal error, closing\n"); + switch (err) { - case 260: /* Incorrect password */ + case MSIM_ERROR_INCORRECT_PASSWORD: /* Incorrect password */ reason = PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED; if (!purple_account_get_remember_password(session->account)) purple_account_set_password(session->account, NULL); break; - case 6: /* Logged in elsewhere */ + case MSIM_ERROR_LOGGED_IN_ELSEWHERE: /* Logged in elsewhere */ reason = PURPLE_CONNECTION_ERROR_NAME_IN_USE; if (!purple_account_get_remember_password(session->account)) purple_account_set_password(session->account, NULL); @@ -1871,6 +1897,7 @@ gchar *status_headline, *status_headline_escaped; gint status_code, purple_status_code; gchar *username; + gchar *unrecognized_msg; g_return_val_if_fail(MSIM_SESSION_VALID(session), FALSE); g_return_val_if_fail(msg != NULL, FALSE); @@ -1903,7 +1930,8 @@ blist = purple_get_blist(); - /* Add buddy if not found */ + /* Add buddy if not found. + * TODO: Could this be responsible for #3444? */ user = msim_find_user(session, username); if (!user) { PurpleBuddy *buddy; @@ -1915,7 +1943,7 @@ user = msim_get_user_from_buddy(buddy); - /* All buddies on list should have 'uid' integer associated with them. */ + /* All buddies on list should have a UserID integer associated with them. */ purple_blist_node_set_int(&buddy->node, "UserID", msim_msg_get_integer(msg, "f")); msim_store_user_info(session, msg, NULL); @@ -1938,7 +1966,7 @@ /* don't copy; let the MsimUser own the headline, memory-wise */ user->headline = status_headline_escaped; - + /* Set user status */ switch (status_code) { case MSIM_STATUS_CODE_OFFLINE_OR_HIDDEN: @@ -1959,9 +1987,15 @@ break; default: - purple_debug_info("msim", "msim_status for %s, unknown status code %d, treating as available\n", + purple_debug_info("msim", "msim_incoming_status for %s, unknown status code %d, treating as available\n", username, status_code); purple_status_code = PURPLE_STATUS_AVAILABLE; + + unrecognized_msg = g_strdup_printf("msim_incoming_status, unrecognized status code: %d\n", + status_code); + msim_unrecognized(session, NULL, unrecognized_msg); + g_free(unrecognized_msg); + } purple_prpl_got_user_status(session->account, username, purple_primitive_get_id_from_type(purple_status_code), NULL); @@ -2156,10 +2190,15 @@ gchar *msg; msg = g_strdup_printf(_("No such user: %s"), username); - purple_notify_error(NULL, NULL, _("User lookup"), msg); + if (!purple_conv_present_error(username, session->account, msg)) { + purple_notify_error(NULL, NULL, _("User lookup"), msg); + } + g_free(msg); g_free(username); - //msim_msg_free(msg); + /* TODO: free + * msim_msg_free(msg); + */ return; } @@ -2180,7 +2219,9 @@ g_free(uid_field_name); g_free(uid_before); g_free(username); - //msim_msg_free(msg); + /* TODO: free + * msim_msg_free(msg); + */ } /** Postprocess and send a message. @@ -2222,8 +2263,7 @@ uid = 0; } - if (!buddy || !uid) - { + if (!buddy || !uid) { /* Don't have uid offhand - need to ask for it, and wait until hear back before sending. */ purple_debug_info("msim", ">>> msim_postprocess_outgoing: couldn't find username %s in blist\n", username ? username : "(NULL)"); @@ -2244,7 +2284,9 @@ rc = msim_msg_send(session, msg); - //msim_msg_free(msg); + /* TODO: free + * msim_msg_free(msg); + */ return rc; } @@ -2304,7 +2346,7 @@ "blocklist", MSIM_TYPE_BOOLEAN, TRUE, "sesskey", MSIM_TYPE_INTEGER, session->sesskey, /* TODO: MsimMessage lists. Currently isn't replaced in lists. */ - //"idlist", MSIM_TYPE_STRING, g_strdup("a-||b-|"), + /* "idlist", MSIM_TYPE_STRING, g_strdup("a-||b-|"), */ "idlist", MSIM_TYPE_LIST, blocklist_updates, NULL); @@ -2316,6 +2358,72 @@ msim_msg_free(blocklist_msg); } +/** + * Returns a string of a username in canonical form. Basically removes all the + * spaces, lowercases the string, and looks up user IDs to usernames. + * Normalizing tom, TOM, Tom, and 6221 wil all return 'tom'. + * + * Borrowed this code from oscar_normalize. Added checking for + * "if userid, get name before normalizing" + */ +const char *msim_normalize(const PurpleAccount *account, const char *str) { + static char normalized[BUF_LEN]; + char *tmp1, *tmp2; + int i, j; + guint id; + + g_return_val_if_fail(str != NULL, NULL); + + if (msim_is_userid(str)) { + /* Have user ID, we need to get their username first :) */ + const char *username; + + /* If the account does not exist, we can't look up the user. */ + if (!account) + return str; + + id = atol(str); + username = msim_uid2username_from_blist((PurpleAccount *)account, id); + if (!username) { + /* Not in buddy list... scheisse... TODO: Manual Lookup! Bug #4631 */ + /* Note: manual lookup using msim_lookup_user() is a problem inside + * msim_normalize(), because msim_lookup_user() calls a callback function + * when the user information has been looked up, but msim_normalize() expects + * the result immediately. */ + strncpy(normalized, str, BUF_LEN); + } else { + strncpy(normalized, username, BUF_LEN); + } + } else { + /* Have username. */ + strncpy(normalized, str, BUF_LEN); + } + + /* Strip spaces. */ + for (i=0, j=0; normalized[j]; i++, j++) { + while (normalized[j] == ' ') + j++; + normalized[i] = normalized[j]; + } + normalized[i] = '\0'; + + /* Lowercase and perform UTF-8 normalization. */ + tmp1 = g_utf8_strdown(normalized, -1); + tmp2 = g_utf8_normalize(tmp1, -1, G_NORMALIZE_DEFAULT); + g_snprintf(normalized, sizeof(normalized), "%s", tmp2); + g_free(tmp2); + g_free(tmp1); + + /* TODO: re-add caps and spacing back to what the user wanted. + * User can format their own names, for example 'msimprpl' is shown + * as 'MsIm PrPl' in the official client. + * + * TODO: file a ticket to add this enhancement. + */ + + return normalized; +} + /** Return whether the buddy can be messaged while offline. * * The protocol supports offline messages in just the same way as online @@ -2364,31 +2472,30 @@ g_return_if_fail(cond == PURPLE_INPUT_READ); g_return_if_fail(MSIM_SESSION_VALID(session)); - /* Mark down that we got data, so don't timeout. */ + /* Mark down that we got data, so we don't timeout. */ session->last_comm = time(NULL); - /* Only can handle so much data at once... - * If this happens, try recompiling with a higher MSIM_READ_BUF_SIZE. - * Should be large enough to hold the largest protocol message. - */ - if (session->rxoff >= MSIM_READ_BUF_SIZE) { - purple_debug_error("msim", - "msim_input_cb: %d-byte read buffer full! rxoff=%d\n", - MSIM_READ_BUF_SIZE, session->rxoff); - purple_connection_error_reason (gc, - PURPLE_CONNECTION_ERROR_NETWORK_ERROR, - _("Read buffer full")); + /* If approaching end of buffer, reallocate some more memory. */ + if (session->rxsize < session->rxoff + MSIM_READ_BUF_SIZE) { + purple_debug_info("msim", + "msim_input_cb: %d-byte read buffer full, rxoff=%d, " "growing by %d bytes\n", + session->rxsize, session->rxoff, MSIM_READ_BUF_SIZE); + session->rxsize += MSIM_READ_BUF_SIZE; + session->rxbuf = g_realloc(session->rxbuf, session->rxsize); + return; } - purple_debug_info("msim", "buffer at %d (max %d), reading up to %d\n", - session->rxoff, MSIM_READ_BUF_SIZE, - MSIM_READ_BUF_SIZE - session->rxoff); + purple_debug_info("msim", "dynamic buffer at %d (max %d), reading up to %d\n", + session->rxoff, session->rxsize, + MSIM_READ_BUF_SIZE - session->rxoff - 1); /* Read into buffer. On Win32, need recv() not read(). session->fd also holds * the file descriptor, but it sometimes differs from the 'source' parameter. */ - n = recv(session->fd, session->rxbuf + session->rxoff, MSIM_READ_BUF_SIZE - session->rxoff, 0); + n = recv(session->fd, + session->rxbuf + session->rxoff, + session->rxsize - session->rxoff - 1, 0); if (n < 0 && errno == EAGAIN) { return; @@ -2408,13 +2515,13 @@ return; } - if (n + session->rxoff >= MSIM_READ_BUF_SIZE) { + if (n + session->rxoff > session->rxsize) { purple_debug_info("msim_input_cb", "received %d bytes, pushing rxoff to %d, over buffer size of %d\n", - n, n + session->rxoff, MSIM_READ_BUF_SIZE); - /* TODO: g_realloc like msn, yahoo, irc, jabber? */ + n, n + session->rxoff, session->rxsize); purple_connection_error_reason (gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, - _("Read buffer full")); + _("Read buffer full (2)")); + return; } /* Null terminate */ @@ -2457,6 +2564,7 @@ purple_connection_error_reason (gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Unparseable message")); + break; } else { /* Process message and then free it (processing function should * clone message if it wants to keep it afterwards.) */ @@ -2469,10 +2577,11 @@ /* Move remaining part of buffer to beginning. */ session->rxoff -= strlen(session->rxbuf) + strlen(MSIM_FINAL_STRING); memmove(session->rxbuf, end + strlen(MSIM_FINAL_STRING), - MSIM_READ_BUF_SIZE - (end + strlen(MSIM_FINAL_STRING) - session->rxbuf)); - - /* Clear end of buffer */ - //memset(end, 0, MSIM_READ_BUF_SIZE - (end - session->rxbuf)); + session->rxsize - (end + strlen(MSIM_FINAL_STRING) - session->rxbuf)); + + /* Clear end of buffer + * memset(end, 0, MSIM_READ_BUF_SIZE - (end - session->rxbuf)); + */ } } @@ -2675,7 +2784,7 @@ uid = msim_msg_get_integer(contact_info, "ContactID"); if (!user_lookup_info) { - username = g_strdup(msim_uid2username_from_blist(session, uid)); + username = g_strdup(msim_uid2username_from_blist(session->account, uid)); g_return_if_fail(username != NULL); } else { user_lookup_info_body = msim_msg_get_dictionary(user_lookup_info, "body"); @@ -2724,8 +2833,9 @@ msim_store_user_info(session, contact_info, NULL); /* TODO: other fields, store in 'user' */ - msim_msg_free(contact_info); + + g_free(username); } /** Add first ContactID in contact_info to buddy's list. Used to add @@ -2743,7 +2853,7 @@ g_return_val_if_fail(uid != 0, FALSE); /* Lookup the username, since NickName and IMName is unreliable */ - username = msim_uid2username_from_blist(session, uid); + username = msim_uid2username_from_blist(session->account, uid); if (!username) { gchar *uid_str; @@ -2772,7 +2882,10 @@ msim_msg_dump("msim_got_contact_list: reply=%s", reply); body = msim_msg_get_dictionary(reply, "body"); - g_return_if_fail(body != NULL); + if (!body) { + /* No friends. Not an error. */ + return; + } buddy_count = 0; @@ -2912,8 +3025,7 @@ menu = g_list_append(menu, act); #endif - act = purple_plugin_action_new(g_strdup_printf("%s", - _("Add friends from MySpace.com")), msim_import_friends); + act = purple_plugin_action_new(_("Add friends from MySpace.com"), msim_import_friends); menu = g_list_append(menu, act); return menu; @@ -2971,7 +3083,7 @@ NULL, /* rename_group */ NULL, /* buddy_free */ NULL, /* convo_closed */ - NULL, /* normalize */ + msim_normalize, /* normalize */ NULL, /* set_buddy_icon */ NULL, /* remove_group */ NULL, /* get_cb_real_name */ diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/myspace/myspace.h --- a/libpurple/protocols/myspace/myspace.h Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/myspace/myspace.h Wed Feb 06 03:35:04 2008 +0000 @@ -180,7 +180,9 @@ #define MSIM_CONTACT_LIST_IMPORT_ALL_FRIENDS 1 #define MSIM_CONTACT_LIST_IMPORT_TOP_FRIENDS 2 -#define MsimAttentionType PurpleAttentionType +/* Error codes */ +#define MSIM_ERROR_INCORRECT_PASSWORD 260 +#define MSIM_ERROR_LOGGED_IN_ELSEWHERE 6 /* Functions */ gboolean msim_load(PurplePlugin *plugin); @@ -201,6 +203,8 @@ void msim_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group); void msim_remove_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group); +const char *msim_normalize(const PurpleAccount *account, const char *str); + gboolean msim_offline_message(const PurpleBuddy *buddy); void msim_close(PurpleConnection *gc); diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/myspace/session.c --- a/libpurple/protocols/myspace/session.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/myspace/session.c Wed Feb 06 03:35:04 2008 +0000 @@ -59,7 +59,8 @@ session->server_info = NULL; session->rxoff = 0; - session->rxbuf = g_new0(gchar, MSIM_READ_BUF_SIZE); + session->rxsize = MSIM_READ_BUF_SIZE; + session->rxbuf = g_new0(gchar, session->rxsize); session->next_rid = 1; session->last_comm = time(NULL); session->inbox_status = 0; diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/myspace/session.h --- a/libpurple/protocols/myspace/session.h Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/myspace/session.h Wed Feb 06 03:35:04 2008 +0000 @@ -42,6 +42,7 @@ gchar *rxbuf; /**< Receive buffer */ guint rxoff; /**< Receive buffer offset */ + guint rxsize; /**< Receive buffer size */ guint next_rid; /**< Next request/response ID */ time_t last_comm; /**< Time received last communication */ guint inbox_status; /**< Bit field of inbox notifications */ diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/myspace/user.c --- a/libpurple/protocols/myspace/user.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/myspace/user.c Wed Feb 06 03:35:04 2008 +0000 @@ -20,7 +20,7 @@ #include "myspace.h" static void msim_store_user_info_each(const gchar *key_str, gchar *value_str, MsimUser *user); -static gchar *msim_format_now_playing(gchar *band, gchar *song); +static gchar *msim_format_now_playing(const gchar *band, const gchar *song); static void msim_downloaded_buddy_icon(PurpleUtilFetchUrlData *url_data, gpointer user_data, const gchar *url_text, gsize len, const gchar *error_message); @@ -28,7 +28,7 @@ * @return Return a new string (must be g_free()'d), or NULL. */ static gchar * -msim_format_now_playing(gchar *band, gchar *song) +msim_format_now_playing(const gchar *band, const gchar *song) { if ((band && *band) || (song && *song)) { return g_strdup_printf("%s - %s", @@ -85,6 +85,7 @@ void msim_append_user_info(MsimSession *session, PurpleNotifyUserInfo *user_info, MsimUser *user, gboolean full) { + PurplePresence *presence; gchar *str; guint uid; guint cv; @@ -128,11 +129,22 @@ purple_notify_user_info_add_pair(user_info, _("Headline"), user->headline); } - str = msim_format_now_playing(user->band_name, user->song_name); - if (str && *str) { - purple_notify_user_info_add_pair(user_info, _("Song"), str); + presence = purple_buddy_get_presence(user->buddy); + + if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_TUNE)) { + PurpleStatus *status; + const char *artist, *title; + + status = purple_presence_get_status(presence, "tune"); + title = purple_status_get_attr_string(status, PURPLE_TUNE_TITLE); + artist = purple_status_get_attr_string(status, PURPLE_TUNE_ARTIST); + + str = msim_format_now_playing(artist, title); + if (str && *str) { + purple_notify_user_info_add_pair(user_info, _("Song"), str); + } + g_free(str); } - g_free(str); /* Note: total friends only available if looked up by uid, not username. */ if (user->total_friends) { @@ -161,6 +173,59 @@ } } +/** Set the currently playing song artist and or title. + * + * @param user User associated with the now playing information. + * + * @param new_artist New artist to set, or NULL/empty to not change artist. + * + * @param new_title New title to set, or NULL/empty to not change title. + * + * If new_artist and new_title are NULL/empty, deactivate PURPLE_STATUS_TUNE. + * + * This function is useful because it lets you set the artist or title + * individually, which purple_prpl_got_user_status() doesn't do. + */ +static void msim_set_artist_or_title(MsimUser *user, const char *new_artist, const char *new_title) +{ + PurplePresence *presence; + const char *prev_artist, *prev_title; + + prev_artist = NULL; + prev_title = NULL; + + if (new_artist && !strlen(new_artist)) + new_artist = NULL; + if (new_title && !strlen(new_title)) + new_title = NULL; + + if (!new_artist && !new_title) { + purple_prpl_got_user_status_deactive(user->buddy->account, user->buddy->name, "tune"); + return; + } + + presence = purple_buddy_get_presence(user->buddy); + + if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_TUNE)) { + PurpleStatus *status; + + status = purple_presence_get_status(presence, "tune"); + prev_title = purple_status_get_attr_string(status, PURPLE_TUNE_TITLE); + prev_artist = purple_status_get_attr_string(status, PURPLE_TUNE_ARTIST); + } + + if (!new_artist) + new_artist = prev_artist; + + if (!new_title) + new_title = prev_title; + + purple_prpl_got_user_status(user->buddy->account, user->buddy->name, "tune", + PURPLE_TUNE_TITLE, new_title, + PURPLE_TUNE_ARTIST, new_artist, + NULL); +} + /** Store a field of information about a buddy. * * @param key_str Key to store. @@ -194,11 +259,9 @@ g_free(user->display_name); user->display_name = value_str; } else if (g_str_equal(key_str, "BandName")) { - g_free(user->band_name); - user->band_name = value_str; + msim_set_artist_or_title(user, value_str, NULL); } else if (g_str_equal(key_str, "SongName")) { - g_free(user->song_name); - user->song_name = value_str; + msim_set_artist_or_title(user, NULL, value_str); } else if (g_str_equal(key_str, "UserName") || g_str_equal(key_str, "IMName") || g_str_equal(key_str, "NickName")) { /* Ignore because PurpleBuddy knows this already */ g_free(value_str); diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/myspace/zap.c --- a/libpurple/protocols/myspace/zap.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/myspace/zap.c Wed Feb 06 03:35:04 2008 +0000 @@ -29,15 +29,12 @@ msim_attention_types(PurpleAccount *acct) { static GList *types = NULL; - MsimAttentionType* attn; + PurpleAttentionType* attn; if (!types) { -#define _MSIM_ADD_NEW_ATTENTION(icn, nme, incoming, outgoing) \ - attn = g_new0(MsimAttentionType, 1); \ - attn->icon_name = icn; \ - attn->name = nme; \ - attn->incoming_description = incoming; \ - attn->outgoing_description = outgoing; \ +#define _MSIM_ADD_NEW_ATTENTION(icn, ulname, nme, incoming, outgoing) \ + attn = purple_attention_type_new(ulname, nme, incoming, outgoing); \ + purple_attention_type_set_icon_name(attn, icn); \ types = g_list_append(types, attn); /* TODO: icons for each zap */ @@ -48,37 +45,46 @@ * projectile or weapon." This term often has an electrical * connotation, for example, "he was zapped by electricity when * he put a fork in the toaster." */ - _MSIM_ADD_NEW_ATTENTION(NULL, _("Zap"), _("%s has zapped you!"), _("Zapping %s...")); + _MSIM_ADD_NEW_ATTENTION(NULL, "Zap", _("Zap"), _("%s has zapped you!"), + _("Zapping %s...")); /* Whack means "to hit or strike someone with a sharp blow" */ - _MSIM_ADD_NEW_ATTENTION(NULL, _("Whack"), _("%s has whacked you!"), _("Whacking %s...")); + _MSIM_ADD_NEW_ATTENTION(NULL, "Whack", _("Whack"), + _("%s has whacked you!"), _("Whacking %s...")); /* Torch means "to set on fire." Don't worry, this doesn't * make a whole lot of sense in English, either. Feel free * to translate it literally. */ - _MSIM_ADD_NEW_ATTENTION(NULL, _("Torch"), _("%s has torched you!"), _("Torching %s...")); + _MSIM_ADD_NEW_ATTENTION(NULL, "Torch", _("Torch"), + _("%s has torched you!"), _("Torching %s...")); /* Smooch means "to kiss someone, often enthusiastically" */ - _MSIM_ADD_NEW_ATTENTION(NULL, _("Smooch"), _("%s has smooched you!"), _("Smooching %s...")); + _MSIM_ADD_NEW_ATTENTION(NULL, "Smooch", _("Smooch"), + _("%s has smooched you!"), _("Smooching %s...")); /* A hug is a display of affection; wrapping your arms around someone */ - _MSIM_ADD_NEW_ATTENTION(NULL, _("Hug"), _("%s has hugged you!"), _("Hugging %s...")); + _MSIM_ADD_NEW_ATTENTION(NULL, "Hug", _("Hug"), _("%s has hugged you!"), + _("Hugging %s...")); /* Slap means "to hit someone with an open/flat hand" */ - _MSIM_ADD_NEW_ATTENTION(NULL, _("Slap"), _("%s has slapped you!"), _("Slapping %s...")); + _MSIM_ADD_NEW_ATTENTION(NULL, "Slap", _("Slap"), + _("%s has slapped you!"), _("Slapping %s...")); /* Goose means "to pinch someone on their butt" */ - _MSIM_ADD_NEW_ATTENTION(NULL, _("Goose"), _("%s has goosed you!"), _("Goosing %s...")); + _MSIM_ADD_NEW_ATTENTION(NULL, "Goose", _("Goose"), + _("%s has goosed you!"), _("Goosing %s...")); /* A high-five is when two people's hands slap each other * in the air above their heads. It is done to celebrate * something, often a victory, or to congratulate someone. */ - _MSIM_ADD_NEW_ATTENTION(NULL, _("High-five"), _("%s has high-fived you!"), _("High-fiving %s...")); + _MSIM_ADD_NEW_ATTENTION(NULL, "High-five", _("High-five"), + _("%s has high-fived you!"), _("High-fiving %s...")); /* We're not entirely sure what the MySpace people mean by * this... but we think it's the equivalent of "prank." Or, for * someone to perform a mischievous trick or practical joke. */ - _MSIM_ADD_NEW_ATTENTION(NULL, _("Punk"), _("%s has punk'd you!"), _("Punking %s...")); + _MSIM_ADD_NEW_ATTENTION(NULL, "Punk", _("Punk"), + _("%s has punk'd you!"), _("Punking %s...")); /* Raspberry is a slang term for the vibrating sound made * when you stick your tongue out of your mouth with your @@ -87,7 +93,8 @@ * gesture, so it does not carry a harsh negative * connotation. It is generally used in a playful tone * with friends. */ - _MSIM_ADD_NEW_ATTENTION(NULL, _("Raspberry"), _("%s has raspberried you!"), _("Raspberrying %s...")); + _MSIM_ADD_NEW_ATTENTION(NULL, "Raspberry", _("Raspberry"), + _("%s has raspberried you!"), _("Raspberrying %s...")); } return types; @@ -99,14 +106,14 @@ { GList *types; MsimSession *session; - MsimAttentionType *attn; + PurpleAttentionType *attn; PurpleBuddy *buddy; session = (MsimSession *)gc->proto_data; /* Look for this attention type, by the code index given. */ types = msim_attention_types(gc->account); - attn = (MsimAttentionType *)g_list_nth_data(types, code); + attn = (PurpleAttentionType *)g_list_nth_data(types, code); if (!attn) { purple_debug_info("msim_send_attention", "got invalid zap code %d\n", code); @@ -200,12 +207,12 @@ i = 0; do { - MsimAttentionType *attn; + PurpleAttentionType *attn; - attn = (MsimAttentionType *)types->data; + attn = (PurpleAttentionType *)types->data; - act = purple_menu_action_new(attn->name, PURPLE_CALLBACK(msim_send_zap_from_menu), - GUINT_TO_POINTER(i), NULL); + act = purple_menu_action_new(purple_attention_type_get_name(attn), + PURPLE_CALLBACK(msim_send_zap_from_menu), GUINT_TO_POINTER(i), NULL); zap_menu = g_list_append(zap_menu, act); ++i; diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/novell/nmfield.c --- a/libpurple/protocols/novell/nmfield.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/novell/nmfield.c Wed Feb 06 03:35:04 2008 +0000 @@ -164,9 +164,7 @@ case NMFIELD_TYPE_BINARY: case NMFIELD_TYPE_UTF8: case NMFIELD_TYPE_DN: - if (field->ptr_value != NULL) { - g_free(field->ptr_value); - } + g_free(field->ptr_value); break; case NMFIELD_TYPE_ARRAY: diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/novell/novell.c --- a/libpurple/protocols/novell/novell.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/novell/novell.c Wed Feb 06 03:35:04 2008 +0000 @@ -1029,7 +1029,7 @@ ******************************************************************************/ static char * -_user_agent_string() +_user_agent_string(void) { #if !defined(_WIN32) @@ -1920,6 +1920,7 @@ parms = g_slist_append(parms, nm_event_get_conference(event)); /* Prompt the user */ + /* TODO: Would it be better to use serv_got_chat_invite() here? */ gc = purple_account_get_connection(user->client_data); purple_request_action(gc, title, primary, secondary, PURPLE_DEFAULT_ACTION_NONE, diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/oscar/family_auth.c --- a/libpurple/protocols/oscar/family_auth.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/oscar/family_auth.c Wed Feb 06 03:35:04 2008 +0000 @@ -196,6 +196,10 @@ * unknown= 0x0000008b * serverstore = 0x01 * + * @param truncate_pass Truncate the password to 8 characters. This + * usually happens for AOL accounts. We are told that we + * should truncate it if the 0x0017/0x0007 SNAC contains + * a TLV of type 0x0026 with data 0x0000. */ int aim_send_login(OscarData *od, FlapConnection *conn, const char *sn, const char *password, gboolean truncate_pass, ClientInfo *ci, const char *key) @@ -522,8 +526,8 @@ /* * If the truncate_pass TLV exists then we should truncate the - * user's password to 8 characters. This flag is sent when you - * try to log in with an AOL user's screen name. + * user's password to 8 characters. This flag is sent to us + * when logging in with an AOL user's screen name. */ truncate_pass = aim_tlv_gettlv(tlvlist, 0x0026, 1) != NULL; diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/oscar/family_buddy.c --- a/libpurple/protocols/oscar/family_buddy.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/oscar/family_buddy.c Wed Feb 06 03:35:04 2008 +0000 @@ -219,8 +219,9 @@ if ((userfunc = aim_callhandler(od, snac->family, snac->subtype))) ret = userfunc(od, conn, frame, &userinfo); - if (snac->subtype == SNAC_SUBTYPE_BUDDY_ONCOMING) - aim_locate_requestuserinfo(od, userinfo.sn); + if (snac->subtype == SNAC_SUBTYPE_BUDDY_ONCOMING && userinfo.flags & AIM_FLAG_AWAY) + aim_locate_autofetch_away_message(od, userinfo.sn); + aim_info_free(&userinfo); return ret; diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/oscar/family_icbm.c --- a/libpurple/protocols/oscar/family_icbm.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/oscar/family_icbm.c Wed Feb 06 03:35:04 2008 +0000 @@ -51,6 +51,9 @@ #include "win32dep.h" #endif +#include "util.h" + + /** * Add a standard ICBM header to the given bstream with the given * information. @@ -2335,11 +2338,166 @@ sn = byte_stream_getstr(bs, snlen); reason = byte_stream_get16(bs); - if (channel == 0x0002) { /* File transfer declined */ + if (channel == 0x0002) + { + /* parse status note text */ + + struct aim_icq_info *info = NULL; + struct aim_icq_info *prev_info = NULL; + char *response = NULL; + char *encoding = NULL; + char *stripped_encoding = NULL; + char *status_note_text = NULL; + char *stripped_status_note_text = NULL; + char *status_note = NULL; + + /* + * TODO: Using a while statement here is kind of an ugly hack + * to be able to use 'break'. We might as well be using + * 'goto'. Should probably get rid of this. + */ + while (reason == 0x0003) /* channel-specific */ + { + guint32 length; + guint16 version; + guint32 capability; + guint8 message_type; + guint16 status_code; + guint16 text_length; + guint32 request_length; + guint32 response_length; + guint32 encoding_length; + PurpleAccount *account; + PurpleBuddy *buddy; + PurplePresence *presence; + PurpleStatus *status; + + for (info = od->icq_info; info != NULL; info = info->next) + { + if (memcmp(&info->icbm_cookie, cookie, 8) == 0) + { + if (prev_info == NULL) + od->icq_info = info->next; + else + prev_info->next = info->next; + + break; + } + + prev_info = info; + } + + if (info == NULL) + break; + + if ((length = byte_stream_getle16(bs)) != 27) + { + purple_debug_misc("oscar", "clientautoresp: incorrect header size; expected 27, received %u.\n", length); + break; + } + if ((version = byte_stream_getle16(bs)) != 9) + { + purple_debug_misc("oscar", "clientautoresp: incorrect version; expected 9, received %u.\n", version); + break; + } + capability = aim_locate_getcaps(od, bs, 0x10); + if (capability != OSCAR_CAPABILITY_EMPTY) + { + purple_debug_misc("oscar", "clientautoresp: plugin ID is not null.\n"); + break; + } + byte_stream_advance(bs, 2); /* unknown */ + byte_stream_advance(bs, 4); /* client capabilities flags */ + byte_stream_advance(bs, 1); /* unknown */ + byte_stream_advance(bs, 2); /* downcouner? */ + + if ((length = byte_stream_getle16(bs)) != 14) + { + purple_debug_misc("oscar", "clientautoresp: incorrect header size; expected 14, received %u.\n", length); + break; + } + byte_stream_advance(bs, 2); /* downcounter? */ + byte_stream_advance(bs, 12); /* unknown */ + + if ((message_type = byte_stream_get8(bs)) != 0x1a) + { + purple_debug_misc("oscar", "clientautoresp: incorrect message type; expected 0x1a, received 0x%x.\n", message_type); + break; + } + byte_stream_advance(bs, 1); /* message flags */ + if ((status_code = byte_stream_getle16(bs)) != 0) + { + purple_debug_misc("oscar", "clientautoresp: incorrect status code; expected 0, received %u.\n", status_code); + break; + } + byte_stream_advance(bs, 2); /* priority code */ + + text_length = byte_stream_getle16(bs); + byte_stream_advance(bs, text_length); /* text */ + + length = byte_stream_getle16(bs); + byte_stream_advance(bs, 18); /* unknown */ + if (length != 18 + 4 + (request_length = byte_stream_getle32(bs)) + 17) + { + purple_debug_misc("oscar", "clientautoresp: incorrect block; expected length is %u, got %u.\n", 18 + 4 + request_length + 17, length); + break; + } + byte_stream_advance(bs, request_length); /* x request */ + byte_stream_advance(bs, 17); /* unknown */ + + length = byte_stream_getle32(bs); + response_length = byte_stream_getle32(bs); + response = byte_stream_getstr(bs, response_length); + if (length != 4 + response_length + 4 + (encoding_length = byte_stream_getle32(bs))) + { + purple_debug_misc("oscar", "clientautoresp: incorrect block; expected length is %u, got %u.\n", 4 + response_length + 4 + encoding_length, length); + break; + } + encoding = byte_stream_getstr(bs, encoding_length); + + account = purple_connection_get_account(od->gc); + stripped_encoding = oscar_encoding_extract(encoding); + status_note_text = oscar_encoding_to_utf8(account, stripped_encoding, response, response_length); + stripped_status_note_text = purple_markup_strip_html(status_note_text); + + if (stripped_status_note_text != NULL && stripped_status_note_text[0] != 0) + status_note = g_strdup_printf("%s: %s", info->status_note_title, stripped_status_note_text); + else + status_note = g_strdup(info->status_note_title); + + buddy = purple_find_buddy(account, sn); + if (buddy == NULL) + { + purple_debug_misc("oscar", "clientautoresp: buddy %s was not found.\n", sn); + break; + } + + purple_debug_misc("oscar", "clientautoresp: setting status message to \"%s\".\n", status_note); + + presence = purple_buddy_get_presence(buddy); + status = purple_presence_get_active_status(presence); + + purple_prpl_got_user_status(account, sn, + purple_status_get_id(status), + "message", status_note, NULL); + + break; + } + + g_free(status_note); + g_free(stripped_status_note_text); + g_free(status_note_text); + g_free(stripped_encoding); + g_free(encoding); + g_free(response); + g_free(info->status_note_title); + g_free(info); + byte_stream_get16(bs); /* Unknown */ byte_stream_get16(bs); /* Unknown */ if ((userfunc = aim_callhandler(od, snac->family, snac->subtype))) ret = userfunc(od, conn, frame, channel, sn, reason, cookie); + } else if (channel == 0x0004) { /* ICQ message */ switch (reason) { case 0x0003: { /* ICQ status message. Maybe other stuff too, you never know with these people. */ diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/oscar/family_icq.c --- a/libpurple/protocols/oscar/family_icq.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/oscar/family_icq.c Wed Feb 06 03:35:04 2008 +0000 @@ -435,6 +435,65 @@ return 0; } +/* + * getstatusnote may be a misleading name because the response + * contains a lot of different information but currently it's only + * used to get that. + */ +int aim_icq_getstatusnote(OscarData *od, const char *uin, guint8 *note_hash, guint16 note_hash_len) +{ + FlapConnection *conn; + FlapFrame *frame; + aim_snacid_t snacid; + int bslen; + + purple_debug_misc("oscar", "aim_icq_getstatusnote: requesting status note for %s.\n", uin); + + if (!od || !(conn = flap_connection_findbygroup(od, 0x0015))) + { + purple_debug_misc("oscar", "aim_icq_getstatusnote: no connection.\n"); + return -EINVAL; + } + + bslen = 2 + 4 + 2 + 2 + 2 + 2 + 58 + strlen(uin); + + frame = flap_frame_new(od, 0x02, 10 + 4 + bslen); + + snacid = aim_cachesnac(od, 0x0015, 0x0002, 0x0000, NULL, 0); + aim_putsnac(&frame->data, 0x0015, 0x0002, 0x0000, snacid); + + /* For simplicity, don't bother using a tlvlist */ + byte_stream_put16(&frame->data, 0x0001); + byte_stream_put16(&frame->data, bslen); + + byte_stream_putle16(&frame->data, bslen - 2); + byte_stream_putle32(&frame->data, atoi(od->sn)); + byte_stream_putle16(&frame->data, 0x07d0); /* I command thee. */ + byte_stream_putle16(&frame->data, snacid); /* eh. */ + byte_stream_putle16(&frame->data, 0x0fa0); /* shrug. */ + byte_stream_putle16(&frame->data, 58 + strlen(uin)); + + byte_stream_put32(&frame->data, 0x05b90002); /* don't ask */ + byte_stream_put32(&frame->data, 0x80000000); + byte_stream_put32(&frame->data, 0x00000006); + byte_stream_put32(&frame->data, 0x00010002); + byte_stream_put32(&frame->data, 0x00020000); + byte_stream_put32(&frame->data, 0x04e30000); + byte_stream_put32(&frame->data, 0x00020002); + byte_stream_put32(&frame->data, 0x00000001); + + byte_stream_put16(&frame->data, 24 + strlen(uin)); + byte_stream_put32(&frame->data, 0x003c0010); + byte_stream_putraw(&frame->data, note_hash, 16); /* status note hash */ + byte_stream_put16(&frame->data, 0x0032); /* buddy uin */ + byte_stream_put16(&frame->data, strlen(uin)); + byte_stream_putstr(&frame->data, uin); + + flap_connection_send(conn, frame); + + return 0; +} + static void aim_icq_freeinfo(struct aim_icq_info *info) { int i; @@ -467,6 +526,7 @@ g_free(info->workposition); g_free(info->workwebpage); g_free(info->info); + g_free(info->status_note_title); g_free(info); } @@ -641,6 +701,178 @@ info->email = byte_stream_getstr(&qbs, byte_stream_getle16(&qbs)); /* Then 0x00 02 00 00 00 00 00 */ } break; + + /* status note title and send request for status note text */ + case 0x0fb4: { + GSList *tlvlist; + aim_tlv_t *tlv; + FlapConnection *conn; + char *uin = NULL; + char *status_note_title = NULL; + + conn = flap_connection_findbygroup(od, 0x0004); + if (conn == NULL) + { + purple_debug_misc("oscar", "icq/0x0fb4: flap connection was not found.\n"); + break; + } + + byte_stream_advance(&qbs, 0x02); /* length */ + byte_stream_advance(&qbs, 0x2f); /* unknown stuff */ + + tlvlist = aim_tlvlist_read(&qbs); + + tlv = aim_tlv_gettlv(tlvlist, 0x0032, 1); + if (tlv != NULL) + /* Get user number */ + uin = aim_tlv_getvalue_as_string(tlv); + + tlv = aim_tlv_gettlv(tlvlist, 0x0226, 1); + if (tlv != NULL) + /* Get status note title */ + status_note_title = aim_tlv_getvalue_as_string(tlv); + + aim_tlvlist_free(tlvlist); + + if (uin == NULL || status_note_title == NULL) + { + purple_debug_misc("oscar", "icq/0x0fb4: uin or " + "status_note_title was not found\n"); + g_free(uin); + g_free(status_note_title); + break; + } + + if (status_note_title[0] == '\0') + { + PurpleAccount *account; + PurpleBuddy *buddy; + PurplePresence *presence; + PurpleStatus *status; + + account = purple_connection_get_account(od->gc); + buddy = purple_find_buddy(account, uin); + presence = purple_buddy_get_presence(buddy); + status = purple_presence_get_active_status(presence); + + purple_prpl_got_user_status(account, uin, + purple_status_get_id(status), + "message", NULL, NULL); + + g_free(status_note_title); + } + else + { + struct aim_icq_info *info; + guint32 data_len; + FlapFrame *frame; + aim_snacid_t snacid; + guchar cookie[8]; + + info = g_new0(struct aim_icq_info, 1); + + if (info == NULL) + { + g_free(uin); + g_free(status_note_title); + + break; + } + + data_len = 13 + strlen(uin) + 30 + 6 + 4 + 55 + 85 + 4; + frame = flap_frame_new(od, 0x0002, 10 + 4 + data_len); + snacid = aim_cachesnac(od, 0x0004, 0x0006, 0x0000, NULL, 0); + + aim_putsnac(&frame->data, 0x0004, 0x0006, 0x0000, snacid); + + aim_icbm_makecookie(cookie); + + byte_stream_putraw(&frame->data, cookie, 8); /* ICBM cookie */ + byte_stream_put16(&frame->data, 0x0002); /* message channel */ + byte_stream_put8(&frame->data, strlen(uin)); /* uin */ + byte_stream_putstr(&frame->data, uin); + + byte_stream_put16(&frame->data, 0x0005); /* rendez vous data */ + byte_stream_put16(&frame->data, 0x00b2); + byte_stream_put16(&frame->data, 0x0000); /* request */ + byte_stream_putraw(&frame->data, cookie, 8); /* ICBM cookie */ + byte_stream_put32(&frame->data, 0x09461349); /* ICQ server relaying */ + byte_stream_put16(&frame->data, 0x4c7f); + byte_stream_put16(&frame->data, 0x11d1); + byte_stream_put32(&frame->data, 0x82224445); + byte_stream_put32(&frame->data, 0x53540000); + + byte_stream_put16(&frame->data, 0x000a); /* unknown TLV */ + byte_stream_put16(&frame->data, 0x0002); + byte_stream_put16(&frame->data, 0x0001); + + byte_stream_put16(&frame->data, 0x000f); /* unknown TLV */ + byte_stream_put16(&frame->data, 0x0000); + + byte_stream_put16(&frame->data, 0x2711); /* extended data */ + byte_stream_put16(&frame->data, 0x008a); + byte_stream_putle16(&frame->data, 0x001b); /* length */ + byte_stream_putle16(&frame->data, 0x0009); /* version */ + byte_stream_putle32(&frame->data, 0x00000000); /* plugin: none */ + byte_stream_putle32(&frame->data, 0x00000000); + byte_stream_putle32(&frame->data, 0x00000000); + byte_stream_putle32(&frame->data, 0x00000000); + byte_stream_putle16(&frame->data, 0x0000); /* unknown */ + byte_stream_putle32(&frame->data, 0x00000000); /* client capabilities flags */ + byte_stream_put8(&frame->data, 0x00); /* unknown */ + byte_stream_putle16(&frame->data, 0x0064); /* downcounter? */ + byte_stream_putle16(&frame->data, 0x000e); /* length */ + byte_stream_putle16(&frame->data, 0x0064); /* downcounter? */ + byte_stream_putle32(&frame->data, 0x00000000); /* unknown */ + byte_stream_putle32(&frame->data, 0x00000000); + byte_stream_putle32(&frame->data, 0x00000000); + byte_stream_put8(&frame->data, 0x1a); /* message type: plugin message descibed by text string */ + byte_stream_put8(&frame->data, 0x00); /* message flags */ + byte_stream_putle16(&frame->data, 0x0000); /* status code */ + byte_stream_putle16(&frame->data, 0x0001); /* priority code */ + byte_stream_putle16(&frame->data, 0x0000); /* text length */ + + byte_stream_put8(&frame->data, 0x3a); /* message dump */ + byte_stream_put32(&frame->data, 0x00811a18); + byte_stream_put32(&frame->data, 0xbc0e6c18); + byte_stream_put32(&frame->data, 0x47a5916f); + byte_stream_put32(&frame->data, 0x18dcc76f); + byte_stream_put32(&frame->data, 0x1a010013); + byte_stream_put32(&frame->data, 0x00000041); + byte_stream_put32(&frame->data, 0x77617920); + byte_stream_put32(&frame->data, 0x53746174); + byte_stream_put32(&frame->data, 0x7573204d); + byte_stream_put32(&frame->data, 0x65737361); + byte_stream_put32(&frame->data, 0x67650100); + byte_stream_put32(&frame->data, 0x00000000); + byte_stream_put32(&frame->data, 0x00000000); + byte_stream_put32(&frame->data, 0x00000000); + byte_stream_put32(&frame->data, 0x00000015); + byte_stream_put32(&frame->data, 0x00000000); + byte_stream_put32(&frame->data, 0x0000000d); + byte_stream_put32(&frame->data, 0x00000074); + byte_stream_put32(&frame->data, 0x6578742f); + byte_stream_put32(&frame->data, 0x782d616f); + byte_stream_put32(&frame->data, 0x6c727466); + + byte_stream_put16(&frame->data, 0x0003); /* server ACK requested */ + byte_stream_put16(&frame->data, 0x0000); + + info->uin = atoi(uin); + info->status_note_title = status_note_title; + + memcpy(&info->icbm_cookie, cookie, 8); + + info->next = od->icq_info; + od->icq_info = info; + + flap_connection_send(conn, frame); + } + + g_free(uin); + + } break; + } /* End switch statement */ if (!(snac->flags & 0x0001)) { diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/oscar/family_locate.c --- a/libpurple/protocols/oscar/family_locate.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/oscar/family_locate.c Wed Feb 06 03:35:04 2008 +0000 @@ -320,10 +320,10 @@ cur->away_encoding = g_strdup(userinfo->away_encoding); cur->away_len = userinfo->away_len; - } else if (!(userinfo->flags & AIM_FLAG_AWAY)) { + } else { /* - * We don't have an away message specified in this user_info block. - * If the user is not away, clear any cached away message now. + * We don't have an away message specified in this user_info + * block, so clear any cached away message now. */ if (cur->away) { g_free(cur->away); @@ -347,41 +347,6 @@ userfunc(od, conn, NULL, cur); } -void -aim_locate_dorequest(OscarData *od) -{ - struct userinfo_node *cur = od->locate.torequest; - - if (od->locate.waiting_for_response == TRUE) - return; - - od->locate.waiting_for_response = TRUE; - aim_locate_getinfoshort(od, cur->sn, 0x00000003); - - /* Move this node to the "requested" queue */ - od->locate.torequest = cur->next; - cur->next = od->locate.requested; - od->locate.requested = cur; -} - -static gboolean -purple_reqinfo_timeout_cb(void *data) -{ - OscarData *od; - - od = data; - - if (od->locate.torequest == NULL) - { - od->getinfotimer = 0; - return FALSE; - } - - aim_locate_dorequest(od); - - return TRUE; -} - /** * Remove this screen name from our queue. If this info was requested * by our info request queue, then pop the next element off of the queue. @@ -417,43 +382,26 @@ cur = cur->next; } - if (!was_explicit) { - od->locate.waiting_for_response = FALSE; - - /* - * Wait a little while then call aim_locate_dorequest(od). - * This keeps us from hitting the rate limit due to - * requesting away messages and info too quickly. - */ - if (od->getinfotimer == 0) - od->getinfotimer = purple_timeout_add(500, - purple_reqinfo_timeout_cb, od); - } - return was_explicit; } void -aim_locate_requestuserinfo(OscarData *od, const char *sn) +aim_locate_autofetch_away_message(OscarData *od, const char *sn) { struct userinfo_node *cur; - /* Make sure we aren't already requesting info for this buddy */ - cur = od->locate.torequest; - while (cur != NULL) { + /* Make sure we haven't already made an info request for this buddy */ + for (cur = od->locate.requested; cur != NULL; cur = cur->next) if (aim_sncmp(sn, cur->sn) == 0) return; - cur = cur->next; - } /* Add a new node to our request queue */ cur = (struct userinfo_node *)g_malloc(sizeof(struct userinfo_node)); cur->sn = g_strdup(sn); - cur->next = od->locate.torequest; - od->locate.torequest = cur; + cur->next = od->locate.requested; + od->locate.requested = cur; - /* Actually request some info up in this piece */ - aim_locate_dorequest(od); + aim_locate_getinfoshort(od, cur->sn, 0x00000002); } aim_userinfo_t *aim_locate_finduserinfo(OscarData *od, const char *sn) { diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/oscar/flap_connection.c --- a/libpurple/protocols/oscar/flap_connection.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/oscar/flap_connection.c Wed Feb 06 03:35:04 2008 +0000 @@ -360,7 +360,7 @@ conn = data; od = conn->od; - account = (PURPLE_CONNECTION_IS_VALID(od->gc) ? purple_connection_get_account(od->gc) : NULL); + account = purple_connection_get_account(od->gc); purple_debug_info("oscar", "Destroying oscar connection of " "type 0x%04hx. Disconnect reason is %d\n", @@ -375,8 +375,8 @@ * TODO: If we don't have a SNAC_FAMILY_LOCATE connection then * we should try to request one instead of disconnecting. */ - if (account && !account->disconnecting && - ((od->oscar_connections == NULL) || (!flap_connection_getbytype(od, SNAC_FAMILY_LOCATE)))) + if (!account->disconnecting && ((od->oscar_connections == NULL) + || (!flap_connection_getbytype(od, SNAC_FAMILY_LOCATE)))) { /* No more FLAP connections! Sign off this PurpleConnection! */ gchar *tmp; @@ -817,6 +817,7 @@ OSCAR_DISCONNECT_LOST_CONNECTION, g_strerror(errno)); break; } + conn->od->gc->last_received = time(NULL); /* If we don't even have a complete FLAP header then do nothing */ conn->header_received += read; diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/oscar/libaim.c --- a/libpurple/protocols/oscar/libaim.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/oscar/libaim.c Wed Feb 06 03:35:04 2008 +0000 @@ -92,11 +92,11 @@ NULL, /* whiteboard_prpl_ops */ NULL, /* send_raw */ NULL, /* roomlist_room_serialize */ + NULL, /* unregister_user */ + NULL, /* send_attention */ + NULL, /* get_attention_types */ /* padding */ - NULL, - NULL, - NULL, NULL }; diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/oscar/libicq.c --- a/libpurple/protocols/oscar/libicq.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/oscar/libicq.c Wed Feb 06 03:35:04 2008 +0000 @@ -92,11 +92,11 @@ NULL, /* whiteboard_prpl_ops */ NULL, /* send_raw */ NULL, /* roomlist_room_serialize */ + NULL, /* unregister_user */ + NULL, /* send_attention */ + NULL, /* get_attention_types */ /* padding */ - NULL, - NULL, - NULL, NULL }; diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/oscar/oscar.c --- a/libpurple/protocols/oscar/oscar.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/oscar/oscar.c Wed Feb 06 03:35:04 2008 +0000 @@ -7,6 +7,7 @@ * Some code copyright (C) 2001-2007, Mark Doliner * Some code copyright (C) 2005, Jonathan Clark * Some code copyright (C) 2007, ComBOTS Product GmbH (htfv) + * Some code copyright (C) 2008, Aman Gupta * * Most libfaim code copyright (C) 1998-2001 Adam Fritzler * Some libfaim code copyright (C) 2001-2004 Mark Doliner @@ -196,7 +197,6 @@ static void purple_icons_fetch(PurpleConnection *gc); -static void recent_buddies_cb(const char *name, PurplePrefType type, gconstpointer value, gpointer data); void oscar_set_info(PurpleConnection *gc, const char *info); static void oscar_set_info_and_status(PurpleAccount *account, gboolean setinfo, const char *rawinfo, gboolean setstatus, PurpleStatus *status); static void oscar_set_extendedstatus(PurpleConnection *gc); @@ -1181,6 +1181,48 @@ return 1; } +static void +idle_reporting_pref_cb(const char *name, PurplePrefType type, + gconstpointer value, gpointer data) +{ + PurpleConnection *gc; + OscarData *od; + gboolean report_idle; + guint32 presence; + + gc = data; + od = gc->proto_data; + report_idle = strcmp((const char *)value, "none") != 0; + presence = aim_ssi_getpresence(od->ssi.local); + + if (report_idle) + aim_ssi_setpresence(od, presence | 0x400); + else + aim_ssi_setpresence(od, presence & ~0x400); +} + +/** + * Should probably make a "Use recent buddies group" account preference + * so that this option is surfaced to the user. + */ +static void +recent_buddies_pref_cb(const char *name, PurplePrefType type, + gconstpointer value, gpointer data) +{ + PurpleConnection *gc; + OscarData *od; + guint32 presence; + + gc = data; + od = gc->proto_data; + presence = aim_ssi_getpresence(od->ssi.local); + + if (value) + aim_ssi_setpresence(od, presence & ~AIM_SSI_PRESENCE_FLAG_NORECENTBUDDIES); + else + aim_ssi_setpresence(od, presence | AIM_SSI_PRESENCE_FLAG_NORECENTBUDDIES); +} + void oscar_login(PurpleAccount *account) { @@ -1271,7 +1313,8 @@ } /* Connect to core Purple signals */ - purple_prefs_connect_callback(gc, "/plugins/prpl/oscar/recent_buddies", recent_buddies_cb, gc); + purple_prefs_connect_callback(gc, "/purple/away/idle_reporting", idle_reporting_pref_cb, gc); + purple_prefs_connect_callback(gc, "/plugins/prpl/oscar/recent_buddies", recent_buddies_pref_cb, gc); newconn = flap_connection_new(od, SNAC_FAMILY_AUTH); newconn->connect_data = purple_proxy_connect(NULL, account, @@ -1516,6 +1559,7 @@ { struct pieceofcrap *pos = data; gchar *buf; + ssize_t result; if (!PURPLE_CONNECTION_IS_VALID(pos->gc)) { @@ -1527,8 +1571,8 @@ pos->fd = source; if (source < 0) { - buf = g_strdup_printf(_("You may be disconnected shortly. You may want to use TOC until " - "this is fixed. Check %s for updates."), PURPLE_WEBSITE); + buf = g_strdup_printf(_("You may be disconnected shortly. " + "Check %s for updates."), PURPLE_WEBSITE); purple_notify_warning(pos->gc, NULL, _("Unable to get a valid AIM login hash."), buf); @@ -1540,7 +1584,18 @@ buf = g_strdup_printf("GET " AIMHASHDATA "?offset=%ld&len=%ld&modname=%s HTTP/1.0\n\n", pos->offset, pos->len, pos->modname ? pos->modname : ""); - write(pos->fd, buf, strlen(buf)); + result = send(pos->fd, buf, strlen(buf), 0); + if (result != strlen(buf)) { + if (result < 0) + purple_debug_error("oscar", "Error writing %" G_GSIZE_FORMAT + " bytes to fetch AIM hash data: %s\n", + strlen(buf), g_strerror(errno)); + else + purple_debug_error("oscar", "Tried to write %" + G_GSIZE_FORMAT " bytes to fetch AIM hash data but " + "instead wrote %" G_GSIZE_FORMAT " bytes\n", + strlen(buf), result); + } g_free(buf); g_free(pos->modname); pos->inpa = purple_input_add(pos->fd, PURPLE_INPUT_READ, damn_you, pos); @@ -1722,8 +1777,6 @@ int type = 0; gboolean buddy_is_away = FALSE; const char *status_id; - gboolean have_status_message = FALSE; - char *message = NULL; va_list ap; aim_userinfo_t *info; @@ -1771,21 +1824,6 @@ status_id = OSCAR_STATUS_ID_AVAILABLE; } - /* - * Handle the available message. If info->status is NULL then the user - * may or may not have an available message, so don't do anything. If - * info->status is set to the empty string, then the user's client DOES - * support available messages and the user DOES NOT have one set. - * Otherwise info->status contains the available message. - */ - if (info->status != NULL) - { - have_status_message = TRUE; - if (info->status[0] != '\0') - message = oscar_encoding_to_utf8(account, info->status_encoding, - info->status, info->status_len); - } - if (info->flags & AIM_FLAG_WIRELESS) { purple_prpl_got_user_status(account, info->sn, OSCAR_STATUS_ID_MOBILE, NULL); @@ -1793,37 +1831,30 @@ purple_prpl_got_user_status_deactive(account, info->sn, OSCAR_STATUS_ID_MOBILE); } - if (have_status_message) + if (strcmp(status_id, OSCAR_STATUS_ID_AVAILABLE) == 0) { - if ((!strcmp(status_id, OSCAR_STATUS_ID_AVAILABLE)) && (info->itmsurl != NULL)) - { - char *itmsurl; + char *message = NULL; + char *itmsurl = NULL; + + if (info->status != NULL && info->status[0] != '\0') + /* Grab the available message */ + message = oscar_encoding_to_utf8(account, info->status_encoding, + info->status, info->status_len); + + if (info->itmsurl_encoding && info->itmsurl && info->itmsurl_len) + /* Grab the iTunes Music Store URL */ itmsurl = oscar_encoding_to_utf8(account, info->itmsurl_encoding, info->itmsurl, info->itmsurl_len); - purple_prpl_got_user_status(account, info->sn, status_id, - "message", message, "itmsurl", itmsurl, NULL); - g_free(itmsurl); - } - else - { - purple_prpl_got_user_status(account, info->sn, status_id, - "message", message, NULL); - } + + purple_prpl_got_user_status(account, info->sn, status_id, + "message", message, "itmsurl", itmsurl, NULL); + g_free(message); + g_free(itmsurl); } else { - PurpleBuddy *b = purple_find_buddy(account, info->sn); - PurpleStatus *status = NULL; - const char *active_status_id = NULL; - - if (b != NULL) { - status = purple_presence_get_active_status(purple_buddy_get_presence(b)); - active_status_id = purple_status_get_id(status); - } - - if (!active_status_id || strcmp(active_status_id, status_id)) - purple_prpl_got_user_status(account, info->sn, status_id, NULL); + purple_prpl_got_user_status(account, info->sn, status_id, NULL); } /* Login time stuff */ @@ -1879,6 +1910,31 @@ g_free(b16); } + /* + * If we didn't receive a status message with the status change, + * or if the message is empty, and we have a note hash, then + * query the ICQ6 status note. + * + * TODO: We should probably always query the status note regardless + * of whether they have a status message set, and we should + * figure out a way to display both the status note and the + * status message at the same time. + */ + if (info->status == NULL || info->status[0] == '\0') + { + struct aim_ssi_item *ssi_item; + aim_tlv_t *note_hash; + + ssi_item = aim_ssi_itemlist_finditem(od->ssi.local, + NULL, info->sn, AIM_SSI_TYPE_BUDDY); + if (ssi_item != NULL) + { + note_hash = aim_tlv_gettlv(ssi_item->data, 0x015c, 1); + if (note_hash != NULL) + aim_icq_getstatusnote(od, info->sn, note_hash->value, note_hash->length); + } + } + return 1; } @@ -3000,7 +3056,7 @@ if (!aim_snvalid_icq(userinfo->sn)) { - if (strcmp(purple_buddy_get_name(b), userinfo->sn)) + if (strcmp(purple_buddy_get_name(b), userinfo->sn) != 0) serv_got_alias(gc, purple_buddy_get_name(b), userinfo->sn); else serv_got_alias(gc, purple_buddy_get_name(b), NULL); @@ -3009,23 +3065,19 @@ presence = purple_buddy_get_presence(b); status = purple_presence_get_active_status(presence); - if (!purple_status_is_available(status) && purple_status_is_online(status)) + if (purple_status_is_online(status) && !purple_status_is_available(status) && + userinfo->flags & AIM_FLAG_AWAY && userinfo->away_len > 0 && + userinfo->away != NULL && userinfo->away_encoding != NULL) { - if ((userinfo->flags & AIM_FLAG_AWAY) && - (userinfo->away_len > 0) && (userinfo->away != NULL) && (userinfo->away_encoding != NULL)) { - gchar *charset = oscar_encoding_extract(userinfo->away_encoding); - message = oscar_encoding_to_utf8(account, charset, - userinfo->away, - userinfo->away_len); - g_free(charset); - purple_status_set_attr_string(status, "message", message); - g_free(message); - } - else - /* Set an empty message so that we know not to show "pending" */ - purple_status_set_attr_string(status, "message", ""); - - purple_blist_update_buddy_status(b, status); + gchar *charset = oscar_encoding_extract(userinfo->away_encoding); + message = oscar_encoding_to_utf8(account, charset, + userinfo->away, + userinfo->away_len); + g_free(charset); + purple_prpl_got_user_status(account, userinfo->sn, + purple_status_get_id(status), + "message", message, NULL); + g_free(message); } return 1; @@ -4444,7 +4496,6 @@ PurplePresence *presence; PurpleStatusType *status_type; PurpleStatusPrimitive primitive; - gboolean invisible; char *htmlinfo; char *info_encoding = NULL; @@ -4459,7 +4510,6 @@ status_type = purple_status_get_type(status); primitive = purple_status_type_get_primitive(status_type); presence = purple_account_get_presence(account); - invisible = purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_INVISIBLE); if (!setinfo) { @@ -4520,12 +4570,11 @@ /* This is needed for us to un-set any previous away message. */ away = g_strdup(""); } - else if ((primitive == PURPLE_STATUS_AWAY) || - (primitive == PURPLE_STATUS_EXTENDED_AWAY)) + else { htmlaway = purple_status_get_attr_string(status, "message"); if ((htmlaway == NULL) || (*htmlaway == '\0')) - htmlaway = _("Away"); + htmlaway = purple_status_type_get_name(status_type); away = purple_prpl_oscar_convert_to_infotext(htmlaway, &awaylen, &away_encoding); if (awaylen > od->rights.maxawaymsglen) @@ -4898,9 +4947,21 @@ } } /* Presence settings (idle time visibility) */ - if ((tmp = aim_ssi_getpresence(od->ssi.local)) != 0xFFFFFFFF) - if (!(tmp & 0x400)) + tmp = aim_ssi_getpresence(od->ssi.local); + if (tmp != 0xFFFFFFFF) { + const char *idle_reporting_pref; + gboolean report_idle; + + idle_reporting_pref = purple_prefs_get_string("/purple/away/idle_reporting"); + report_idle = strcmp(idle_reporting_pref, "none") != 0; + + if (report_idle) aim_ssi_setpresence(od, tmp | 0x400); + else + aim_ssi_setpresence(od, tmp & ~0x400); + } + + } /* end pruning buddies from local list */ /* Add from server list to local list */ @@ -5099,6 +5160,8 @@ char *gname, *gname_utf8, *alias, *alias_utf8; PurpleBuddy *b; PurpleGroup *g; + struct aim_ssi_item *ssi_item; + aim_tlv_t *note_hash; va_list ap; guint16 snac_subtype, type; const char *name; @@ -5166,6 +5229,21 @@ } + ssi_item = aim_ssi_itemlist_finditem(od->ssi.local, + gname, name, AIM_SSI_TYPE_BUDDY); + if (ssi_item != NULL) + { + note_hash = aim_tlv_gettlv(ssi_item->data, 0x015c, 1); + if (note_hash != NULL) + aim_icq_getstatusnote(od, name, note_hash->value, note_hash->length); + } + else + { + purple_debug_error("oscar", "purple_ssi_parseaddmod: " + "Could not find ssi item for oncoming buddy %s, " + "group %s\n", name, gname); + } + g_free(gname_utf8); g_free(alias_utf8); @@ -5959,7 +6037,7 @@ _("Because this reveals your IP address, it " "may be considered a security risk. Do you " "wish to continue?"), - 0, + 0, /* Default action is "connect" */ purple_connection_get_account(gc), data->who, NULL, data, 2, _("C_onnect"), G_CALLBACK(oscar_ask_directim_yes_cb), @@ -6522,33 +6600,6 @@ } } -static void -recent_buddies_cb(const char *name, PurplePrefType type, - gconstpointer value, gpointer data) -{ - PurpleConnection *gc = data; - OscarData *od = gc->proto_data; - guint32 presence; - - presence = aim_ssi_getpresence(od->ssi.local); - - if (value) { - presence &= ~AIM_SSI_PRESENCE_FLAG_NORECENTBUDDIES; - aim_ssi_setpresence(od, presence); - } else { - presence |= AIM_SSI_PRESENCE_FLAG_NORECENTBUDDIES; - aim_ssi_setpresence(od, presence); - } -} - -#ifdef USE_PRPL_PREFERENCES - ppref = purple_plugin_pref_new_with_name_and_label("/plugins/prpl/oscar/recent_buddies", _("Use recent buddies group")); - purple_plugin_pref_frame_add(frame, ppref); - - ppref = purple_plugin_pref_new_with_name_and_label("/plugins/prpl/oscar/show_idle", _("Show how long you have been idle")); - purple_plugin_pref_frame_add(frame, ppref); -#endif - const char * oscar_normalize(const PurpleAccount *account, const char *str) { @@ -6711,7 +6762,7 @@ /* Preferences */ purple_prefs_add_none("/plugins/prpl/oscar"); purple_prefs_add_bool("/plugins/prpl/oscar/recent_buddies", FALSE); - purple_prefs_add_bool("/plugins/prpl/oscar/show_idle", FALSE); + purple_prefs_remove("/plugins/prpl/oscar/show_idle"); purple_prefs_remove("/plugins/prpl/oscar/always_use_rv_proxy"); /* protocol handler */ diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/oscar/oscar.h --- a/libpurple/protocols/oscar/oscar.h Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/oscar/oscar.h Wed Feb 06 03:35:04 2008 +0000 @@ -3,8 +3,6 @@ * This file is the legal property of its developers. * Please see the AUTHORS file distributed alongside this file. * - * Some code copyright (C) 2007, ComBOTS Product GmbH (htfv) - * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either @@ -311,7 +309,7 @@ } #define CLIENTINFO_AIM_KNOWNGOOD CLIENTINFO_AIM_5_1_3036 -#define CLIENTINFO_ICQ_KNOWNGOOD CLIENTINFO_ICQ_5_45_3777 +#define CLIENTINFO_ICQ_KNOWNGOOD CLIENTINFO_ICQBASIC_14_34_3000 typedef enum { @@ -468,7 +466,6 @@ gboolean icq; guint getblisttimer; - guint getinfotimer; struct { guint maxwatchers; /* max users who can watch you */ @@ -513,9 +510,7 @@ struct { struct aim_userinfo_s *userinfo; - struct userinfo_node *torequest; struct userinfo_node *requested; - gboolean waiting_for_response; } locate; /* Server-stored information (ssi) */ @@ -1079,7 +1074,7 @@ /* 0x000f */ int aim_locate_setinterests(OscarData *od, const char *interest1, const char *interest2, const char *interest3, const char *interest4, const char *interest5, guint16 privacy); /* 0x0015 */ int aim_locate_getinfoshort(OscarData *od, const char *sn, guint32 flags); -void aim_locate_requestuserinfo(OscarData *od, const char *sn); +void aim_locate_autofetch_away_message(OscarData *od, const char *sn); guint32 aim_locate_getcaps(OscarData *od, ByteStream *bs, int len); guint32 aim_locate_getcaps_short(OscarData *od, ByteStream *bs, int len); void aim_info_free(aim_userinfo_t *); @@ -1329,6 +1324,10 @@ /* we keep track of these in a linked list because we're 1337 */ struct aim_icq_info *next; + + /* status note info */ + guint8 icbm_cookie[8]; + char *status_note_title; }; int aim_icq_reqofflinemsgs(OscarData *od); @@ -1339,7 +1338,7 @@ int aim_icq_getalias(OscarData *od, const char *uin); int aim_icq_getallinfo(OscarData *od, const char *uin); int aim_icq_sendsms(OscarData *od, const char *name, const char *msg, const char *alias); - +int aim_icq_getstatusnote(OscarData *od, const char *uin, guint8 *note_hash, guint16 note_hash_len); /* 0x0017 - family_auth.c */ diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/oscar/oscar_data.c --- a/libpurple/protocols/oscar/oscar_data.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/oscar/oscar_data.c Wed Feb 06 03:35:04 2008 +0000 @@ -97,8 +97,6 @@ g_free(od->oldp); if (od->getblisttimer > 0) purple_timeout_remove(od->getblisttimer); - if (od->getinfotimer > 0) - purple_timeout_remove(od->getinfotimer); while (od->oscar_connections != NULL) flap_connection_destroy(od->oscar_connections->data, OSCAR_DISCONNECT_DONE, NULL); diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/oscar/peer.c --- a/libpurple/protocols/oscar/peer.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/oscar/peer.c Wed Feb 06 03:35:04 2008 +0000 @@ -1041,7 +1041,7 @@ "Images. Because your IP address will be " "revealed, this may be considered a privacy " "risk."), - PURPLE_DEFAULT_ACTION_NONE, + 0, /* Default action is "connect" */ account, sn, NULL, conn, 2, _("C_onnect"), G_CALLBACK(peer_connection_got_proposition_yes_cb), diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/qq/file_trans.c --- a/libpurple/protocols/qq/file_trans.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/qq/file_trans.c Wed Feb 06 03:35:04 2008 +0000 @@ -59,7 +59,7 @@ return key; } -static guint32 _gen_file_key() +static guint32 _gen_file_key(void) { guint8 seed; @@ -97,6 +97,7 @@ guint8 *buffer; PurpleCipher *cipher; PurpleCipherContext *context; + size_t wc; const gint QQ_MAX_FILE_MD5_LENGTH = 10002432; @@ -109,15 +110,20 @@ buffer = g_newa(guint8, filelen); g_return_if_fail(buffer != NULL); - fread(buffer, filelen, 1, fp); + wc = fread(buffer, filelen, 1, fp); + fclose(fp); + if (wc != 1) { + purple_debug_error("qq", "Unable to read file: %s\n", filename); + + /* TODO: XXX: Really, the caller should be modified to deal with this properly. */ + return; + } cipher = purple_ciphers_find_cipher("md5"); context = purple_cipher_context_new(cipher, NULL); purple_cipher_context_append(context, buffer, filelen); purple_cipher_context_digest(context, 16, md5, NULL); purple_cipher_context_destroy(context); - - fclose(fp); } static void _qq_get_file_header(guint8 *buf, guint8 **cursor, gint buflen, qq_file_header *fh) diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/qq/group_im.c --- a/libpurple/protocols/qq/group_im.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/qq/group_im.c Wed Feb 06 03:35:04 2008 +0000 @@ -135,7 +135,7 @@ purple_request_action(gc, _("QQ Qun Operation"), msg, reason, - 2, + PURPLE_DEFAULT_ACTION_NONE, purple_connection_get_account(gc), nombre, NULL, g, 3, _("Approve"), diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/qq/group_opt.c --- a/libpurple/protocols/qq/group_opt.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/qq/group_opt.c Wed Feb 06 03:35:04 2008 +0000 @@ -96,7 +96,8 @@ g_return_if_fail(g != NULL && g->gc != NULL && g->member > 0); qq_send_packet_get_info(g->gc, g->member, TRUE); /* we want to see window */ - purple_request_action(g->gc, NULL, _("Do you want to approve the request?"), "", 2, + purple_request_action(g->gc, NULL, _("Do you want to approve the request?"), "", + PURPLE_DEFAULT_ACTION_NONE, purple_connection_get_account(g->gc), NULL, NULL, g, 2, _("Reject"), G_CALLBACK(qq_group_reject_application_with_struct), diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/qq/login_logout.c --- a/libpurple/protocols/qq/login_logout.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/qq/login_logout.c Wed Feb 06 03:35:04 2008 +0000 @@ -485,11 +485,15 @@ PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, _("Incorrect password.")); break; case QQ_LOGIN_REPLY_MISC_ERROR: - purple_connection_error_reason(gc, - PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Unable to login, check debug log")); + if (purple_debug_is_enabled()) + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Unable to login. Check debug log.")); + else + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Unable to login")); break; case QQ_LOGIN_REPLY_OK: - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Login replys OK, everything is fine\n"); + purple_debug(PURPLE_DEBUG_INFO, "QQ", "Login repliess OK; everything is fine\n"); break; case QQ_LOGIN_REPLY_REDIRECT: /* the redirect has been done in _qq_process_login_reply */ diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/qq/sys_msg.c --- a/libpurple/protocols/qq/sys_msg.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/qq/sys_msg.c Wed Feb 06 03:35:04 2008 +0000 @@ -84,7 +84,8 @@ nombre = uid_to_purple_name(uid); purple_request_action - (gc, NULL, _("Do you want to approve the request?"), "", 2, + (gc, NULL, _("Do you want to approve the request?"), "", + PURPLE_DEFAULT_ACTION_NONE, purple_connection_get_account(gc), nombre, NULL, g, 2, _("Reject"), G_CALLBACK(qq_reject_add_request_with_gc_and_uid), @@ -107,7 +108,8 @@ qq_send_packet_get_info(gc, uid, TRUE); /* we want to see window */ nombre = uid_to_purple_name(uid); purple_request_action - (gc, NULL, _("Do you want to add this buddy?"), "", 2, + (gc, NULL, _("Do you want to add this buddy?"), "", + PURPLE_DEFAULT_ACTION_NONE, purple_connection_get_account(gc), nombre, NULL, g, 2, _("Cancel"), NULL, @@ -166,7 +168,8 @@ message = g_strdup_printf(_("You have been added by %s"), from); _qq_sys_msg_log_write(gc, message, from); purple_request_action(gc, NULL, message, - _("Would you like to add him?"), 2, + _("Would you like to add him?"), + PURPLE_DEFAULT_ACTION_NONE, purple_connection_get_account(gc), name, NULL, g, 3, _("Cancel"), NULL, @@ -240,7 +243,7 @@ _qq_sys_msg_log_write(gc, message, from); purple_request_action - (gc, NULL, message, reason, 2, + (gc, NULL, message, reason, PURPLE_DEFAULT_ACTION_NONE, purple_connection_get_account(gc), name, NULL, g, 3, _("Reject"), @@ -260,7 +263,7 @@ g2->uid = strtol(from, NULL, 10); message = g_strdup_printf(_("%s is not in your buddy list"), from); purple_request_action(gc, NULL, message, - _("Would you like to add him?"), 2, + _("Would you like to add him?"), PURPLE_DEFAULT_ACTION_NONE, purple_connection_get_account(gc), name, NULL, g2, 3, _("Cancel"), NULL, diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/sametime/sametime.c --- a/libpurple/protocols/sametime/sametime.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/sametime/sametime.c Wed Feb 06 03:35:04 2008 +0000 @@ -1695,7 +1695,9 @@ int len; len = read(sock, buf, BUF_LEN); - if(len > 0) mwSession_recv(session, buf, len); + if(len > 0) { + mwSession_recv(session, buf, len); + } return len; } @@ -2286,6 +2288,7 @@ PurpleXfer *xfer; FILE *fp; + size_t wc; xfer = mwFileTransfer_getClientData(ft); g_return_if_fail(xfer != NULL); @@ -2294,7 +2297,12 @@ g_return_if_fail(fp != NULL); /* we must collect and save our precious data */ - fwrite(data->data, 1, data->len, fp); + wc = fwrite(data->data, 1, data->len, fp); + if (wc != data->len) { + DEBUG_ERROR("failed to write data\n"); + purple_xfer_cancel_local(xfer); + return; + } /* update the progress */ xfer->bytes_sent += data->len; @@ -3806,7 +3814,7 @@ } -static int mw_rand() { +static int mw_rand(void) { static int seed = 0; /* for diversity, not security. don't touch */ @@ -3818,7 +3826,7 @@ /** generates a random-ish content id string */ -static char *im_mime_content_id() { +static char *im_mime_content_id(void) { return g_strdup_printf("%03x@%05xmeanwhile", mw_rand() & 0xfff, mw_rand() & 0xfffff); } @@ -3826,7 +3834,7 @@ /** generates a multipart/related content type with a random-ish boundary value */ -static char *im_mime_content_type() { +static char *im_mime_content_type(void) { return g_strdup_printf("multipart/related; boundary=related_MW%03x_%04x", mw_rand() & 0xfff, mw_rand() & 0xffff); } diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/silc10/ops.c --- a/libpurple/protocols/silc10/ops.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/silc10/ops.c Wed Feb 06 03:35:04 2008 +0000 @@ -1697,27 +1697,32 @@ return; break; case SILC_CLIENT_CONN_ERROR: - purple_connection_error(gc, _("Error during connecting to SILC Server")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Error during connecting to SILC Server")); g_unlink(silcpurple_session_file(purple_account_get_username(sg->account))); break; case SILC_CLIENT_CONN_ERROR_KE: - purple_connection_error(gc, _("Key Exchange failed")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR, + _("Key Exchange failed")); break; case SILC_CLIENT_CONN_ERROR_AUTH: - purple_connection_error(gc, _("Authentication failed")); + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, + _("Authentication failed")); break; case SILC_CLIENT_CONN_ERROR_RESUME: - purple_connection_error(gc, - _("Resuming detached session failed. " - "Press Reconnect to create new connection.")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR, + _("Resuming detached session failed. " + "Press Reconnect to create new connection.")); g_unlink(silcpurple_session_file(purple_account_get_username(sg->account))); break; case SILC_CLIENT_CONN_ERROR_TIMEOUT: - purple_connection_error(gc, _("Connection Timeout")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Connection Timeout")); break; } @@ -1746,7 +1751,8 @@ /* Close the connection */ if (!sg->detaching) - purple_connection_error(gc, _("Disconnected by server")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Disconnected by server")); else /* TODO: Does this work correctly? Maybe we need to set wants_to_die? */ purple_account_disconnect(purple_connection_get_account(gc)); diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/silc10/silc.c --- a/libpurple/protocols/silc10/silc.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/silc10/silc.c Wed Feb 06 03:35:04 2008 +0000 @@ -158,7 +158,9 @@ sg = gc->proto_data; if (source < 0) { - purple_connection_error(gc, _("Connection failed")); + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Connection failed")); return; } @@ -179,7 +181,8 @@ "silc.silcnet.org"), purple_account_get_int(account, "port", 706), sg); if (!conn) { - purple_connection_error(gc, _("Cannot initialize SILC Client connection")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Cannot initialize SILC Client connection")); gc->proto_data = NULL; return; } @@ -264,7 +267,8 @@ /* Allocate SILC client */ client = silc_client_alloc(&ops, ¶ms, gc, NULL); if (!client) { - purple_connection_error(gc, _("Out of memory")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR, + _("Out of memory")); return; } @@ -309,15 +313,15 @@ /* Init SILC client */ if (!silc_client_init(client)) { - gc->wants_to_die = TRUE; - purple_connection_error(gc, _("Cannot initialize SILC protocol")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR, + _("Cannot initialize SILC protocol")); return; } /* Check the ~/.silc dir and create it, and new key pair if necessary. */ if (!silcpurple_check_silc_dir(gc)) { - gc->wants_to_die = TRUE; - purple_connection_error(gc, _("Cannot find/access ~/.silc directory")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR, + _("Error loading SILC key pair")); return; } @@ -332,7 +336,8 @@ (gc->password == NULL) ? "" : gc->password, &client->pkcs, &client->public_key, &client->private_key)) { g_snprintf(pkd, sizeof(pkd), _("Could not load SILC key pair: %s"), g_strerror(errno)); - purple_connection_error(gc, pkd); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR, + _("Could not load SILC key pair")); return; } @@ -352,7 +357,8 @@ purple_account_get_int(account, "port", 706), silcpurple_login_connected, gc) == NULL) { - purple_connection_error(gc, _("Unable to create connection")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Unable to create connection")); return; } diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/simple/simple.c --- a/libpurple/protocols/simple/simple.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/simple/simple.c Wed Feb 06 03:35:04 2008 +0000 @@ -45,17 +45,17 @@ #include "dnssrv.h" #include "ntlm.h" -static char *gentag() { +static char *gentag(void) { return g_strdup_printf("%04d%04d", rand() & 0xFFFF, rand() & 0xFFFF); } -static char *genbranch() { +static char *genbranch(void) { return g_strdup_printf("z9hG4bK%04X%04X%04X%04X%04X", rand() & 0xFFFF, rand() & 0xFFFF, rand() & 0xFFFF, rand() & 0xFFFF, rand() & 0xFFFF); } -static char *gencallid() { +static char *gencallid(void) { return g_strdup_printf("%04Xg%04Xa%04Xi%04Xm%04Xt%04Xb%04Xx%04Xx", rand() & 0xFFFF, rand() & 0xFFFF, rand() & 0xFFFF, rand() & 0xFFFF, rand() & 0xFFFF, rand() & 0xFFFF, @@ -1356,10 +1356,21 @@ } static gboolean process_publish_response(struct simple_account_data *sip, struct sipmsg *msg, struct transaction *tc) { + + const gchar *etag = NULL; + if(msg->response != 200 && msg->response != 408) { /* never send again */ sip->republish = -1; } + + etag = sipmsg_find_header(msg, "SIP-Etag"); + if (etag) { + /* we must store the etag somewhere. */ + g_free(sip->publish_etag); + sip->publish_etag = g_strdup(etag); + } + return TRUE; } @@ -1368,10 +1379,12 @@ gchar *uri = g_strdup_printf("sip:%s@%s", sip->username, sip->servername); gchar *doc = gen_pidf(sip, TRUE); - add_headers = g_strdup_printf("%s%d%s", - "Expires: ", - PUBLISH_EXPIRATION, - "\r\nEvent: presence\r\n" + add_headers = g_strdup_printf("%s%s%s%s%d\r\n%s", + sip->publish_etag ? "SIP-If-Match: " : "", + sip->publish_etag ? sip->publish_etag : "", + sip->publish_etag ? "\r\n" : "", + "Expires: ", PUBLISH_EXPIRATION, + "Event: presence\r\n" "Content-Type: application/pidf+xml\r\n"); send_sip_request(sip->gc, "PUBLISH", uri, uri, @@ -1384,14 +1397,23 @@ static void send_closed_publish(struct simple_account_data *sip) { gchar *uri = g_strdup_printf("sip:%s@%s", sip->username, sip->servername); - gchar *doc = gen_pidf(sip, FALSE); - send_sip_request(sip->gc, "PUBLISH", uri, uri, - "Expires: 600\r\nEvent: presence\r\n" - "Content-Type: application/pidf+xml\r\n", + gchar *add_headers, *doc; + + add_headers = g_strdup_printf("%s%s%s%s", + sip->publish_etag ? "SIP-If-Match: " : "", + sip->publish_etag ? sip->publish_etag : "", + sip->publish_etag ? "\r\n" : "", + "Expires: 600\r\n" + "Event: presence\r\n" + "Content-Type: application/pidf+xml\r\n"); + + doc = gen_pidf(sip, FALSE); + send_sip_request(sip->gc, "PUBLISH", uri, uri, add_headers, doc, NULL, process_publish_response); /*sip->republish = time(NULL) + 500;*/ g_free(uri); g_free(doc); + g_free(add_headers); } static void process_incoming_subscribe(struct simple_account_data *sip, struct sipmsg *msg) { @@ -1653,7 +1675,7 @@ if(sip->fd == source) sip->fd = -1; return; } - + gc->last_received = time(NULL); conn->inbufused += len; conn->inbuf[conn->inbufused] = '\0'; @@ -1948,6 +1970,7 @@ g_free(sip->proxy.target); g_free(sip->proxy.realm); g_free(sip->proxy.digest_session_key); + g_free(sip->publish_etag); if(sip->txbuf) purple_circ_buffer_destroy(sip->txbuf); g_free(sip->realhostname); @@ -1960,13 +1983,6 @@ gc->proto_data = NULL; } -/* not needed since privacy is checked for every subscribe */ -static void dummy_add_deny(PurpleConnection *gc, const char *name) { -} - -static void dummy_permit_deny(PurpleConnection *gc) { -} - static PurplePluginProtocolInfo prpl_info = { 0, @@ -1994,11 +2010,11 @@ NULL, /* add_buddies */ simple_remove_buddy, /* remove_buddy */ NULL, /* remove_buddies */ - dummy_add_deny, /* add_permit */ - dummy_add_deny, /* add_deny */ - dummy_add_deny, /* rem_permit */ - dummy_add_deny, /* rem_deny */ - dummy_permit_deny, /* set_permit_deny */ + NULL, /* add_permit */ + NULL, /* add_deny */ + NULL, /* rem_permit */ + NULL, /* rem_deny */ + NULL, /* set_permit_deny */ NULL, /* join_chat */ NULL, /* reject_chat */ NULL, /* get_chat_name */ diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/simple/simple.h --- a/libpurple/protocols/simple/simple.h Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/simple/simple.h Wed Feb 06 03:35:04 2008 +0000 @@ -112,6 +112,7 @@ int registerexpire; gchar *realhostname; int realport; /* port and hostname from SRV record */ + gchar *publish_etag; }; struct sip_connection { diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/yahoo/util.c --- a/libpurple/protocols/yahoo/util.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/yahoo/util.c Wed Feb 06 03:35:04 2008 +0000 @@ -31,6 +31,70 @@ #include "yahoo.h" #include +/* + * Returns cookies formatted as a null terminated string for the given connection. + * Must g_free return value. + * + * TODO:will work, but must test for strict correctness + */ +gchar* yahoo_get_cookies(PurpleConnection *gc) +{ + gchar *ans = NULL; + gchar *cur; + char firstflag = 1; + gchar *t1,*t2,*t3; + GSList *tmp; + GSList *cookies; + cookies = ((struct yahoo_data*)(gc->proto_data))->cookies; + tmp = cookies; + while(tmp) + { + cur = tmp->data; + t1 = ans; + t2 = g_strrstr(cur, ";expires="); + if(t2 == NULL) + t2 = g_strrstr(cur, "; expires="); + if(t2 == NULL) + { + if(firstflag) + ans = g_strdup_printf("%c=%s", cur[0], cur+2); + else + ans = g_strdup_printf("%s; %c=%s", t1, cur[0], cur+2); + } + else + { + t3 = strstr(t2+1, ";"); + if(t3 != NULL) + { + t2[0] = '\0'; + + if(firstflag) + ans = g_strdup_printf("%c=%s%s", cur[0], cur+2, t3); + else + ans = g_strdup_printf("%s; %c=%s%s", t1, cur[0], cur+2, t3); + + t2[0] = ';'; + } + else + { + t2[0] = '\0'; + + if(firstflag) + ans = g_strdup_printf("%c=%s", cur[0], cur+2); + else + ans = g_strdup_printf("%s; %c=%s", t1, cur[0], cur+2); + + t2[0] = ';'; + } + } + if(firstflag) + firstflag = 0; + else + g_free(t1); + tmp = g_slist_next(tmp); + } + return ans; +} /** * Encode some text to send to the yahoo server. @@ -100,6 +164,25 @@ return g_strdup(""); } +char *yahoo_convert_to_numeric(const char *str) +{ + GString *gstr = NULL; + char *retstr; + const unsigned char *p; + + gstr = g_string_sized_new(strlen(str) * 6 + 1); + + for (p = (unsigned char *)str; *p; p++) { + g_string_append_printf(gstr, "&#%u;", *p); + } + + retstr = gstr->str; + + g_string_free(gstr, FALSE); + + return retstr; +} + /* * I found these on some website but i don't know that they actually * work (or are supposed to work). I didn't implement them yet. diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/yahoo/yahoo.c --- a/libpurple/protocols/yahoo/yahoo.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/yahoo/yahoo.c Wed Feb 06 03:35:04 2008 +0000 @@ -61,58 +61,6 @@ #endif static void yahoo_set_status(PurpleAccount *account, PurpleStatus *status); -static void -yahoo_add_permit(PurpleConnection *gc, const char *who) -{ - purple_debug_info("yahoo", - "Permitting ID %s local contact rights for account %s\n", who, gc->account); - purple_privacy_permit_add(gc->account,who,TRUE); -} - -static void -yahoo_rem_permit(PurpleConnection *gc, const char *who) -{ - purple_debug_info("yahoo", - "Denying ID %s local contact rights for account %s\n", who, gc->account); - purple_privacy_permit_remove(gc->account,who,TRUE); -} - -gboolean -yahoo_privacy_check(PurpleConnection *gc, const char *who) -{ - /* returns TRUE if allowed through, FALSE otherwise */ - gboolean permitted; - - permitted = purple_privacy_check(gc->account, who); - - /* print some debug info */ - if (!permitted) { - char *deb = NULL; - switch (gc->account->perm_deny) - { - case PURPLE_PRIVACY_DENY_ALL: - deb = "PURPLE_PRIVACY_DENY_ALL"; - break; - case PURPLE_PRIVACY_DENY_USERS: - deb = "PURPLE_PRIVACY_DENY_USERS"; - break; - case PURPLE_PRIVACY_ALLOW_BUDDYLIST: - deb = "PURPLE_PRIVACY_ALLOW_BUDDYLIST"; - break; - } - if(deb) - purple_debug_info("yahoo", - "%s blocked data received from %s (%s)\n", - gc->account->username,who, deb); - } else if (gc->account->perm_deny == PURPLE_PRIVACY_ALLOW_USERS) { - purple_debug_info("yahoo", - "%s allowed data received from %s (PURPLE_PRIVACY_ALLOW_USERS)\n", - gc->account->username,who); - } - - return permitted; -} - static void yahoo_update_status(PurpleConnection *gc, const char *name, YahooFriend *f) { char *status = NULL; @@ -392,6 +340,10 @@ case 97: /* Unicode status message */ unicode = !strcmp(pair->value, "1"); break; + case 244: /* client version number. Yahoo Client Detection */ + if(f && strtol(pair->value, NULL, 10)) + f->version_id = strtol(pair->value, NULL, 10); + break; default: purple_debug(PURPLE_DEBUG_ERROR, "yahoo", @@ -493,16 +445,16 @@ static void yahoo_process_cookie(struct yahoo_data *yd, char *c) { if (c[0] == 'Y') { - g_free(yd->cookie_y); + if (yd->cookie_y) + g_free(yd->cookie_y); yd->cookie_y = _getcookie(c); } else if (c[0] == 'T') { - g_free(yd->cookie_t); + if (yd->cookie_t) + g_free(yd->cookie_t); yd->cookie_t = _getcookie(c); - } else if (c[0] == 'C') { - g_free(yd->cookie_c); - yd->cookie_c = _getcookie(c); } else - purple_debug_info("yahoo", "Ignoring unrecognized cookie '%c'\n", c[0]); + purple_debug_info("yahoo", "Unrecognized cookie '%c'\n", c[0]); + yd->cookies = g_slist_prepend(yd->cookies, g_strdup(c)); } static void yahoo_process_list_15(PurpleConnection *gc, struct yahoo_packet *pkt) @@ -510,6 +462,7 @@ GSList *l = pkt->hash; PurpleAccount *account = purple_connection_get_account(gc); + struct yahoo_data *yd = gc->proto_data; GHashTable *ht; char *grp = NULL; char *norm_bud = NULL; @@ -575,6 +528,9 @@ purple_debug_info("yahoo", "Setting protocol to %d\n", f->protocol); } break; + case 59: /* somebody told cookies come here too, but im not sure */ + yahoo_process_cookie(yd, pair->value); + break; case 317: /* Stealth Setting */ if (f && (strtol(pair->value, NULL, 10) == 2)) { f->presence = YAHOO_PRESENCE_PERM_OFFLINE; @@ -692,7 +648,7 @@ for (bud = buddies; bud && *bud; bud++) { /* The server is already ignoring the user */ got_serv_list = TRUE; - purple_privacy_deny_add(gc->account, *bud, 1); + purple_privacy_deny_add(account, *bud, 1); } g_strfreev(buddies); @@ -701,13 +657,13 @@ } if (got_serv_list && - ((gc->account->perm_deny != PURPLE_PRIVACY_ALLOW_BUDDYLIST) && - (gc->account->perm_deny != PURPLE_PRIVACY_DENY_ALL) && - (gc->account->perm_deny != PURPLE_PRIVACY_ALLOW_USERS))) + ((account->perm_deny != PURPLE_PRIVACY_ALLOW_BUDDYLIST) && + (account->perm_deny != PURPLE_PRIVACY_DENY_ALL) && + (account->perm_deny != PURPLE_PRIVACY_ALLOW_USERS))) { - gc->account->perm_deny = PURPLE_PRIVACY_DENY_USERS; + account->perm_deny = PURPLE_PRIVACY_DENY_USERS; purple_debug_info("yahoo", "%s privacy defaulting to PURPLE_PRIVACY_DENY_USERS.\n", - gc->account->username); + account->username); } if (yd->tmp_serv_plist) { @@ -716,7 +672,7 @@ f = yahoo_friend_find(gc, *bud); if (f) { purple_debug_info("yahoo", "%s setting presence for %s to PERM_OFFLINE\n", - gc->account->username, *bud); + account->username, *bud); f->presence = YAHOO_PRESENCE_PERM_OFFLINE; } } @@ -731,6 +687,7 @@ static void yahoo_process_notify(PurpleConnection *gc, struct yahoo_packet *pkt) { + PurpleAccount *account; char *msg = NULL; char *from = NULL; char *stat = NULL; @@ -738,6 +695,8 @@ YahooFriend *f = NULL; GSList *l = pkt->hash; + account = purple_connection_get_account(gc); + while (l) { struct yahoo_pair *pair = l->data; if (pair->key == 4) @@ -755,13 +714,14 @@ return; if (!g_ascii_strncasecmp(msg, "TYPING", strlen("TYPING")) - && (yahoo_privacy_check(gc, from))) { + && (purple_privacy_check(account, from))) + { if (*stat == '1') serv_got_typing(gc, from, 0, PURPLE_TYPING); else serv_got_typing_stopped(gc, from); } else if (!g_ascii_strncasecmp(msg, "GAME", strlen("GAME"))) { - PurpleBuddy *bud = purple_find_buddy(gc->account, from); + PurpleBuddy *bud = purple_find_buddy(account, from); if (!bud) { purple_debug(PURPLE_DEBUG_WARNING, "yahoo", @@ -781,7 +741,7 @@ yahoo_update_status(gc, from, f); } } else if (!g_ascii_strncasecmp(msg, "WEBCAMINVITE", strlen("WEBCAMINVITE"))) { - PurpleConversation *conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, from, gc->account); + PurpleConversation *conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, from, account); char *buf = g_strdup_printf(_("%s has sent you a webcam invite, which is not yet supported."), from); purple_conversation_write(conv, NULL, buf, PURPLE_MESSAGE_SYSTEM|PURPLE_MESSAGE_NOTIFY, time(NULL)); g_free(buf); @@ -800,13 +760,15 @@ static void yahoo_process_message(PurpleConnection *gc, struct yahoo_packet *pkt) { + PurpleAccount *account; struct yahoo_data *yd = gc->proto_data; GSList *l = pkt->hash; GSList *list = NULL; struct _yahoo_im *im = NULL; - const char *imv = NULL; + account = purple_connection_get_account(gc); + if (pkt->status <= 1 || pkt->status == 5) { while (l != NULL) { struct yahoo_pair *pair = l->data; @@ -851,20 +813,20 @@ { PurpleWhiteboard *wb; - if (!yahoo_privacy_check(gc, im->from)) { + if (!purple_privacy_check(account, im->from)) { purple_debug_info("yahoo", "Doodle request from %s dropped.\n", im->from); return; } /* I'm not sure the following ever happens -DAA */ - wb = purple_whiteboard_get_session(gc->account, im->from); + wb = purple_whiteboard_get_session(account, im->from); /* If a Doodle session doesn't exist between this user */ if(wb == NULL) { doodle_session *ds; - wb = purple_whiteboard_create(gc->account, im->from, DOODLE_STATE_REQUESTED); + wb = purple_whiteboard_create(account, im->from, DOODLE_STATE_REQUESTED); ds = wb->proto_data; ds->imv_key = g_strdup(imv); @@ -884,7 +846,7 @@ continue; } - if (!yahoo_privacy_check(gc, im->from)) { + if (!purple_privacy_check(account, im->from)) { purple_debug_info("yahoo", "Message from %s dropped.\n", im->from); return; } @@ -900,11 +862,9 @@ purple_util_chrreplace(m, '\r', '\n'); if (!strcmp(m, "")) { - PurpleAccount *account; PurpleConversation *c; char *username; - account = purple_connection_get_account(gc); c = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, im->from, account); if (c == NULL) c = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, im->from); @@ -967,15 +927,19 @@ }; static void -yahoo_buddy_add_authorize_cb(gpointer data) { +yahoo_buddy_add_authorize_cb(gpointer data) +{ struct yahoo_add_request *add_req = data; - struct yahoo_packet *pkt; struct yahoo_data *yd = add_req->gc->proto_data; pkt = yahoo_packet_new(YAHOO_SERVICE_AUTH_REQ_15, YAHOO_STATUS_AVAILABLE, 0); - yahoo_packet_hash(pkt, "ssiii", 1, add_req->id, 5, add_req->who, 241, add_req->protocol, - 13, 1, 334, 0); + yahoo_packet_hash(pkt, "ssiii", + 1, add_req->id, + 5, add_req->who, + 241, add_req->protocol, + 13, 1, + 334, 0); yahoo_packet_send_and_free(pkt, yd); g_free(add_req->id); @@ -984,10 +948,11 @@ } static void -yahoo_buddy_add_deny_cb(struct yahoo_add_request *add_req, const char *msg) { +yahoo_buddy_add_deny_cb(struct yahoo_add_request *add_req, const char *msg) +{ + struct yahoo_data *yd = add_req->gc->proto_data; struct yahoo_packet *pkt; char *encoded_msg = NULL; - struct yahoo_data *yd = add_req->gc->proto_data; PurpleAccount *account = purple_connection_get_account(add_req->gc); if (msg && *msg) @@ -1054,9 +1019,12 @@ } static void yahoo_buddy_auth_req_15(PurpleConnection *gc, struct yahoo_packet *pkt) { + PurpleAccount *account; GSList *l = pkt->hash; const char *msg = NULL; + account = purple_connection_get_account(gc); + /* Buddy authorized/declined our addition */ if (pkt->status == 1) { const char *who = NULL; @@ -1126,7 +1094,8 @@ if (add_req->id && add_req->who) { char *alias = NULL, *dec_msg = NULL; - if (!yahoo_privacy_check(gc, add_req->who)) { + if (!purple_privacy_check(account, add_req->who)) + { purple_debug_misc("yahoo", "Auth. request from %s dropped and automatically denied due to privacy settings!\n", add_req->who); yahoo_buddy_add_deny_cb(add_req, NULL); @@ -1146,11 +1115,12 @@ /* DONE! this is almost exactly the same as what MSN does, * this should probably be moved to the core. */ - purple_account_request_authorization(purple_connection_get_account(gc), add_req->who, add_req->id, - alias, dec_msg, purple_find_buddy(purple_connection_get_account(gc), add_req->who) != NULL, - yahoo_buddy_add_authorize_cb, - yahoo_buddy_add_deny_reason_cb, - add_req); + purple_account_request_authorization(account, add_req->who, add_req->id, + alias, dec_msg, + purple_find_buddy(account, add_req->who) != NULL, + yahoo_buddy_add_authorize_cb, + yahoo_buddy_add_deny_reason_cb, + add_req); g_free(alias); g_free(dec_msg); } else { @@ -1165,10 +1135,13 @@ /* I don't think this happens anymore in Version 15 */ static void yahoo_buddy_added_us(PurpleConnection *gc, struct yahoo_packet *pkt) { + PurpleAccount *account; struct yahoo_add_request *add_req; char *msg = NULL; GSList *l = pkt->hash; + account = purple_connection_get_account(gc); + add_req = g_new0(struct yahoo_add_request, 1); add_req->gc = gc; @@ -1194,7 +1167,7 @@ if (add_req->id && add_req->who) { char *dec_msg = NULL; - if (!yahoo_privacy_check(gc, add_req->who)) { + if (!purple_privacy_check(account, add_req->who)) { purple_debug_misc("yahoo", "Auth. request from %s dropped and automatically denied due to privacy settings!\n", add_req->who); yahoo_buddy_add_deny_cb(add_req, NULL); @@ -1207,11 +1180,11 @@ /* DONE! this is almost exactly the same as what MSN does, * this should probably be moved to the core. */ - purple_account_request_authorization(purple_connection_get_account(gc), add_req->who, add_req->id, - NULL, dec_msg, purple_find_buddy(purple_connection_get_account(gc),add_req->who) != NULL, - yahoo_buddy_add_authorize_cb, - yahoo_buddy_add_deny_reason_cb, - add_req); + purple_account_request_authorization(account, add_req->who, add_req->id, + NULL, dec_msg, + purple_find_buddy(account,add_req->who) != NULL, + yahoo_buddy_add_authorize_cb, + yahoo_buddy_add_deny_reason_cb, add_req); g_free(dec_msg); } else { g_free(add_req->id); @@ -1498,7 +1471,13 @@ to_y64(result96, digest, 16); pack = yahoo_packet_new(YAHOO_SERVICE_AUTHRESP, YAHOO_STATUS_AVAILABLE, 0); - yahoo_packet_hash(pack, "ssss", 0, name, 6, result6, 96, result96, 1, name); + yahoo_packet_hash(pack, "ssssss", + 0, name, + 6, result6, + 96, result96, + 1, name, + 244, YAHOO_CLIENT_VERSION_ID, + 135, YAHOO_CLIENT_VERSION); yahoo_packet_send_and_free(pack, yd); g_free(hash_string_p); @@ -1517,11 +1496,11 @@ char *enc_pass; struct yahoo_data *yd = gc->proto_data; - PurpleCipher *md5_cipher; + PurpleCipher *md5_cipher; PurpleCipherContext *md5_ctx; guchar md5_digest[16]; - PurpleCipher *sha1_cipher; + PurpleCipher *sha1_cipher; PurpleCipherContext *sha1_ctx1; PurpleCipherContext *sha1_ctx2; @@ -1533,7 +1512,7 @@ char *delimit_lookup = ",;"; char *password_hash = (char *)g_malloc(25); - char *crypt_hash = (char *)g_malloc(25); + char *crypt_hash = (char *)g_malloc(25); char *crypt_result = NULL; unsigned char pass_hash_xor1[64]; @@ -1587,7 +1566,7 @@ magic_ptr = seed; - while (*magic_ptr != (int)NULL) { + while (*magic_ptr != '\0') { char *loc; /* Ignore parentheses. */ @@ -1640,7 +1619,7 @@ * dust on the values. */ - for (magic_cnt = magic_len-2; magic_cnt >= 0; magic_cnt--) { + for (magic_cnt = magic_len - 2; magic_cnt >= 0; magic_cnt--) { unsigned char byte1; unsigned char byte2; @@ -1656,7 +1635,7 @@ byte1 ^= byte2; magic[magic_cnt+1] = byte1; - } + } /* * Magic: Phase 3. This computes 20 bytes. The first 4 bytes are used as our magic @@ -1671,8 +1650,8 @@ x = 0; do { - unsigned int bl = 0; - unsigned int cl = magic[magic_cnt++]; + unsigned int bl = 0; + unsigned int cl = magic[magic_cnt++]; if (magic_cnt >= magic_len) break; @@ -1697,17 +1676,18 @@ /* First four bytes are magic key. */ memcpy(&magic_key_char[0], comparison_src, 4); - magic_4 = magic_key_char[0] | (magic_key_char[1]<<8) | (magic_key_char[2]<<16) | (magic_key_char[3]<<24); + magic_4 = magic_key_char[0] | (magic_key_char[1] << 8) | + (magic_key_char[2] << 16) | (magic_key_char[3] << 24); /* * Magic: Phase 4. Determine what function to use later by getting outside/inside * loop values until we match our previous buffer. */ for (x = 0; x < 65535; x++) { - int leave = 0; + int leave = 0; for (y = 0; y < 5; y++) { - unsigned char test[3]; + unsigned char test[3]; /* Calculate buffer. */ test[0] = x; @@ -1943,8 +1923,13 @@ } purple_debug_info("yahoo", "yahoo status: %d\n", yd->current_status); pack = yahoo_packet_new(YAHOO_SERVICE_AUTHRESP, yd->current_status, 0); - yahoo_packet_hash(pack, "sssss", 0, name, 6, resp_6, 96, resp_96, 1, - name, 135, "6,0,0,1710"); + yahoo_packet_hash(pack, "ssssss", + 0, name, + 6, resp_6, + 96, resp_96, + 1, name, + 244, YAHOO_CLIENT_VERSION_ID, + 135, YAHOO_CLIENT_VERSION); if (yd->picture_checksum) yahoo_packet_hash_int(pack, 192, yd->picture_checksum); @@ -2256,9 +2241,12 @@ static void yahoo_process_audible(PurpleConnection *gc, struct yahoo_packet *pkt) { + PurpleAccount *account; char *who = NULL, *msg = NULL, *id = NULL; GSList *l = pkt->hash; + account = purple_connection_get_account(gc); + while (l) { struct yahoo_pair *pair = l->data; @@ -2294,9 +2282,9 @@ purple_debug_misc("yahoo", "Warning, nonutf8 audible, ignoring!\n"); return; } - if (!yahoo_privacy_check(gc, who)) { + if (!purple_privacy_check(account, who)) { purple_debug_misc("yahoo", "Audible message from %s for %s dropped!\n", - gc->account->username, who); + purple_account_get_username(account), who); return; } if (id) { @@ -2434,12 +2422,16 @@ case YAHOO_SERVICE_AUDIBLE: yahoo_process_audible(gc, pkt); break; - case YAHOO_SERVICE_Y7_FILETRANSFER: - yahoo_process_y7_filetransfer(gc, pkt); + case YAHOO_SERVICE_FILETRANS_15: + yahoo_process_filetrans_15(gc, pkt); break; - case YAHOO_SERVICE_Y7_FILETRANSFER_INFO: - yahoo_process_y7_filetransfer_info(gc, pkt); + case YAHOO_SERVICE_FILETRANS_INFO_15: + yahoo_process_filetrans_info_15(gc, pkt); break; + case YAHOO_SERVICE_FILETRANS_ACC_15: + yahoo_process_filetrans_acc_15(gc, pkt); + break; + default: purple_debug(PURPLE_DEBUG_ERROR, "yahoo", "Unhandled service 0x%02x\n", pkt->service); @@ -2473,7 +2465,7 @@ _("Server closed the connection.")); return; } - + gc->last_received = time(NULL); yd->rxqueue = g_realloc(yd->rxqueue, len + yd->rxlen); memcpy(yd->rxqueue + yd->rxlen, buf, len); yd->rxlen += len; @@ -2661,11 +2653,15 @@ s = g_string_sized_new(len); while ((i = strstr(i, "Set-Cookie: "))) { + i += strlen("Set-Cookie: "); for (;*i != ';' && *i != '\0'; i++) g_string_append_c(s, *i); - + g_string_append(s, "; "); + /* Should these cookies be included too when trying for xfer? + * It seems to work without these + */ } yd->auth = g_string_free(s, FALSE); @@ -2955,6 +2951,7 @@ yd->txbuf = purple_circ_buffer_new(0); yd->friends = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, yahoo_friend_free); yd->imvironments = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); + yd->xfer_peer_idstring_map = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL); yd->confs = NULL; yd->conf_id = 2; @@ -3009,17 +3006,23 @@ } g_slist_free(yd->confs); + for (l = yd->cookies; l; l = l->next) { + g_free(l->data); + l->data=NULL; + } + g_slist_free(yd->cookies); + yd->chat_online = 0; if (yd->in_chat) yahoo_c_leave(gc, 1); /* 1 = YAHOO_CHAT_ID */ g_hash_table_destroy(yd->friends); g_hash_table_destroy(yd->imvironments); + g_hash_table_destroy(yd->xfer_peer_idstring_map); g_free(yd->chat_name); g_free(yd->cookie_y); g_free(yd->cookie_t); - g_free(yd->cookie_c); if (yd->txhandler) purple_input_remove(yd->txhandler); @@ -3829,12 +3832,10 @@ yahoo_packet_send_and_free(pkt, yd); } -/* XXX - What's the deal with PurpleGroup *foo? */ -static void yahoo_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *foo) +static void yahoo_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *g) { struct yahoo_data *yd = (struct yahoo_data *)gc->proto_data; struct yahoo_packet *pkt; - PurpleGroup *g; const char *group = NULL; char *group2; YahooFriend *f; @@ -3842,20 +3843,17 @@ if (!yd->logged_in) return; - if (!yahoo_privacy_check(gc, purple_buddy_get_name(buddy))) + if (!purple_privacy_check(purple_connection_get_account(gc), + purple_buddy_get_name(buddy))) return; f = yahoo_friend_find(gc, purple_buddy_get_name(buddy)); - if (foo) - group = foo->name; - if (!group) { - g = purple_buddy_get_group(buddy); - if (g) - group = g->name; - else - group = "Buddies"; - } + g = purple_buddy_get_group(buddy); + if (g) + group = g->name; + else + group = "Buddies"; group2 = yahoo_string_encode(gc, group, NULL); pkt = yahoo_packet_new(YAHOO_SERVICE_ADDBUDDY, YAHOO_STATUS_AVAILABLE, 0); @@ -3917,10 +3915,6 @@ if (!yd->logged_in) return; - /* It seems to work better without this */ - - /* if (gc->account->perm_deny != 4) - return; */ if (!who || who[0] == '\0') return; @@ -3946,34 +3940,27 @@ yahoo_packet_send_and_free(pkt, yd); } -static void yahoo_set_permit_deny(PurpleConnection *gc) { - PurpleAccount *acct; +static void yahoo_set_permit_deny(PurpleConnection *gc) +{ + PurpleAccount *account; GSList *deny; - acct = gc->account; - - switch (acct->perm_deny) { - /* privacy 1 */ + account = purple_connection_get_account(gc); + + switch (account->perm_deny) + { case PURPLE_PRIVACY_ALLOW_ALL: - for (deny = acct->deny;deny;deny = deny->next) + for (deny = account->deny; deny; deny = deny->next) yahoo_rem_deny(gc, deny->data); break; - /* privacy 3 */ - case PURPLE_PRIVACY_ALLOW_USERS: - for (deny = acct->deny;deny;deny = deny->next) - yahoo_rem_deny(gc, deny->data); - break; - /* privacy 5 */ + case PURPLE_PRIVACY_ALLOW_BUDDYLIST: - /* privacy 4 */ + case PURPLE_PRIVACY_ALLOW_USERS: case PURPLE_PRIVACY_DENY_USERS: - for (deny = acct->deny;deny;deny = deny->next) + case PURPLE_PRIVACY_DENY_ALL: + for (deny = account->deny; deny; deny = deny->next) yahoo_add_deny(gc, deny->data); break; - /* privacy 2 */ - case PURPLE_PRIVACY_DENY_ALL: - default: - break; } } @@ -4121,17 +4108,13 @@ GList *yahoo_attention_types(PurpleAccount *account) { - PurpleAttentionType *attn; static GList *list = NULL; if (!list) { /* Yahoo only supports one attention command: the 'buzz'. */ /* This is index number YAHOO_BUZZ. */ - attn = g_new0(PurpleAttentionType, 1); - attn->name = _("Buzz"); - attn->incoming_description = _("%s has buzzed you!"); - attn->outgoing_description = _("Buzzing %s..."); - list = g_list_append(list, attn); + list = g_list_append(list, purple_attention_type_new("Buzz", _("Buzz"), + _("%s has buzzed you!"), _("Buzzing %s..."))); } return list; @@ -4307,9 +4290,9 @@ NULL, /* add_buddies */ yahoo_remove_buddy, NULL, /*remove_buddies */ - yahoo_add_permit, + NULL, /* add_permit */ yahoo_add_deny, - yahoo_rem_permit, + NULL, /* rem_permit */ yahoo_rem_deny, yahoo_set_permit_deny, yahoo_c_join, diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/yahoo/yahoo.h --- a/libpurple/protocols/yahoo/yahoo.h Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/yahoo/yahoo.h Wed Feb 06 03:35:04 2008 +0000 @@ -34,6 +34,8 @@ #define YAHOO_MAIL_URL "https://login.yahoo.com/config/login?.src=ym" #define YAHOO_XFER_HOST "filetransfer.msg.yahoo.com" #define YAHOO_XFER_PORT 80 +#define YAHOO_XFER_RELAY_HOST "relay.msg.yahoo.com" +#define YAHOO_XFER_RELAY_PORT 80 #define YAHOO_ROOMLIST_URL "http://insider.msg.yahoo.com/ycontent/" #define YAHOO_ROOMLIST_LOCALE "us" /* really we should get the list of servers from @@ -43,6 +45,11 @@ #define YAHOOJP_MAIL_URL "http://mail.yahoo.co.jp/" #define YAHOOJP_XFER_HOST "filetransfer.msg.yahoo.co.jp" #define YAHOOJP_WEBCAM_HOST "wc.yahoo.co.jp" +/*not sure, must test:*/ +#define YAHOOJP_XFER_RELAY_HOST "relay.msg.yahoo.com" +#define YAHOOJP_XFER_RELAY_PORT 80 +#define YAHOOJP_ROOMLIST_URL "http://insider.msg.yahoo.co.jp/ycontent/" +#define YAHOOJP_ROOMLIST_LOCALE "ja" #define YAHOO_AUDIBLE_URL "http://us.dl1.yimg.com/download.yahoo.com/dl/aud" @@ -67,6 +74,9 @@ #define YAHOO_STATUS_TYPE_INVISIBLE "invisible" #define YAHOO_STATUS_TYPE_MOBILE "mobile" +#define YAHOO_CLIENT_VERSION_ID "2097087" +#define YAHOO_CLIENT_VERSION "8.1.0.421" + /* Index into attention types list. */ #define YAHOO_BUZZ 0 @@ -86,7 +96,8 @@ YAHOO_STATUS_IDLE = 999, YAHOO_STATUS_WEBLOGIN = 0x5a55aa55, YAHOO_STATUS_OFFLINE = 0x5a55aa56, /* don't ask */ - YAHOO_STATUS_TYPING = 0x16 + YAHOO_STATUS_TYPING = 0x16, + YAHOO_STATUS_DISCONNECTED = 0xffffffff /* in ymsg 15. doesnt mean the normal sense of 'disconnected' */ }; struct yahoo_buddy_icon_upload_data { @@ -134,7 +145,6 @@ gsize auth_written; char *cookie_y; char *cookie_t; - char *cookie_c; int session_id; gboolean jp; gboolean wm; /* connected w/ web messenger method */ @@ -154,6 +164,8 @@ * for when we lookup people profile or photo information. */ GSList *url_datas; + GHashTable *xfer_peer_idstring_map;/*Hey, i dont know, but putting this HashTable next to friends gives a run time fault...*/ + GSList *cookies;/*contains all cookies, including _y and _t*/ }; #define YAHOO_MAX_STATUS_MESSAGE_LENGTH (255) @@ -206,20 +218,19 @@ */ char *yahoo_string_decode(PurpleConnection *gc, const char *str, gboolean utf8); +char *yahoo_convert_to_numeric(const char *str); + /* previously-static functions, now needed for yahoo_profile.c */ void yahoo_tooltip_text(PurpleBuddy *b, PurpleNotifyUserInfo *user_info, gboolean full); /* yahoo_profile.c */ void yahoo_get_info(PurpleConnection *gc, const char *name); -/** - * Check to see whether the sender is permitted to send - * - * @param gc The gc handle. - * @param who The sender of the packet to check +/* needed for xfer, thought theyd be useful for other enhancements later on + Returns list of cookies stored in yahoo_data formatted as a single null terminated string + returned value must be g_freed */ -gboolean yahoo_privacy_check - (PurpleConnection *gc, const char *who); +gchar* yahoo_get_cookies(PurpleConnection *gc); gboolean yahoo_send_attention(PurpleConnection *gc, const char *username, guint type); GList *yahoo_attention_types(PurpleAccount *account); diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/yahoo/yahoo_aliases.c --- a/libpurple/protocols/yahoo/yahoo_aliases.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/yahoo/yahoo_aliases.c Wed Feb 06 03:35:04 2008 +0000 @@ -37,6 +37,8 @@ /* I hate hardcoding this stuff, but Yahoo never sends us anything to use. Someone in the know may be able to tweak this URL */ #define YAHOO_ALIAS_FETCH_URL "http://address.yahoo.com/yab/us?v=XM&prog=ymsgr&.intl=us&diffs=1&t=0&tags=short&rt=0&prog-ver=8.1.0.249&useutf8=1&legenc=codepage-1252" #define YAHOO_ALIAS_UPDATE_URL "http://address.yahoo.com/yab/us?v=XM&prog=ymsgr&.intl=us&sync=1&tags=short&noclear=1&useutf8=1&legenc=codepage-1252" +#define YAHOOJP_ALIAS_FETCH_URL "http://address.yahoo.co.jp/yab/jp?v=XM&prog=ymsgr&.intl=jp&diffs=1&t=0&tags=short&rt=0&prog-ver=7.0.0.7" +#define YAHOOJP_ALIAS_UPDATE_URL "http://address.yahoo.co.jp/yab/jp?v=XM&prog=ymsgr&.intl=jp&sync=1&tags=short&noclear=1" void yahoo_update_alias(PurpleConnection *gc, const char *who, const char *alias); @@ -90,7 +92,10 @@ id = xmlnode_get_attrib(item,"id"); /* Yahoo stores first and last names separately, lets put them together into a full name */ - full_name = g_strstrip(g_strdup_printf("%s %s", (fn != NULL ? fn : "") , (ln != NULL ? ln : ""))); + if (yd->jp) + full_name = g_strstrip(g_strdup_printf("%s %s", (ln != NULL ? ln : "") , (fn != NULL ? fn : ""))); + else + full_name = g_strstrip(g_strdup_printf("%s %s", (fn != NULL ? fn : "") , (ln != NULL ? ln : ""))); nick_name = (nn != NULL ? g_strstrip(g_strdup_printf("%s", nn)) : NULL); if (nick_name != NULL) @@ -139,7 +144,7 @@ { struct yahoo_data *yd = gc->proto_data; struct callback_data *cb; - const char *url = YAHOO_ALIAS_FETCH_URL; + const char *url; char *request, *webpage, *webaddress; PurpleUtilFetchUrlData *url_data; @@ -148,6 +153,7 @@ cb->gc = gc; /* Build all the info to make the web request */ + url = yd->jp ? YAHOOJP_ALIAS_FETCH_URL : YAHOO_ALIAS_FETCH_URL; purple_url_parse(url, &webaddress, NULL, &webpage, NULL, NULL); request = g_strdup_printf("GET /%s HTTP/1.1\r\n" "User-Agent: Mozilla/4.0 (compatible; MSIE 5.5)\r\n" @@ -221,14 +227,15 @@ struct yahoo_data *yd; struct YahooUser *yu; char *content, *url, *request, *webpage, *webaddress, *strtmp; + char *escaped_alias, *alias_jp, *converted_alias_jp; int inttmp; struct callback_data *cb; PurpleBuddy *buddy; PurpleUtilFetchUrlData *url_data; - g_return_if_fail(alias!= NULL); - g_return_if_fail(who!=NULL); - g_return_if_fail(gc!=NULL); + g_return_if_fail(alias != NULL); + g_return_if_fail(who != NULL); + g_return_if_fail(gc != NULL); purple_debug_info("yahoo", "Sending '%s' as new alias for user '%s'.\n",alias, who); @@ -247,12 +254,25 @@ cb->gc = gc; /* Build all the info to make the web request */ - url = g_strdup(YAHOO_ALIAS_UPDATE_URL); + url = yd->jp? YAHOOJP_ALIAS_UPDATE_URL: YAHOO_ALIAS_UPDATE_URL; purple_url_parse(url, &webaddress, &inttmp, &webpage, &strtmp, &strtmp); - content = g_strdup_printf("\n" - "\n\r\n", - gc->account->username, who, yu->id, g_markup_escape_text(alias, strlen(alias))); + if (yd->jp) { + alias_jp = g_convert(alias, strlen(alias), "EUC-JP", "UTF-8", NULL, NULL, NULL); + converted_alias_jp = yahoo_convert_to_numeric(alias_jp); + content = g_strdup_printf("\n" + "\n\r\n", + gc->account->username, who, yu->id, converted_alias_jp); + free(converted_alias_jp); + g_free(alias_jp); + } + else { + escaped_alias = g_markup_escape_text(alias, strlen(alias)); + content = g_strdup_printf("\n" + "\n\r\n", + gc->account->username, who, yu->id, escaped_alias); + g_free(escaped_alias); + } request = g_strdup_printf("POST /%s HTTP/1.1\r\n" "User-Agent: Mozilla/4.0 (compatible; MSIE 5.5)\r\n" @@ -271,7 +291,6 @@ } g_free(content); - g_free(url); g_free(request); } diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/yahoo/yahoo_filexfer.c --- a/libpurple/protocols/yahoo/yahoo_filexfer.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/yahoo/yahoo_filexfer.c Wed Feb 06 03:35:04 2008 +0000 @@ -21,6 +21,7 @@ */ #include "internal.h" +#include "dnsquery.h" #include "prpl.h" #include "util.h" @@ -32,6 +33,7 @@ #include "yahoo_packet.h" #include "yahoo_filexfer.h" #include "yahoo_doodle.h" +#include "yahoo_friend.h" struct yahoo_xfer_data { gchar *host; @@ -46,81 +48,65 @@ guint tx_handler; gchar *rxqueue; guint rxlen; + gchar *xfer_peer_idstring; + gchar *xfer_idstring_for_relay; + int version; /*0 for old, 15 for Y7(YMSG 15)*/ + int info_val_249; - gboolean y7; /* true for Y7 transfers (receive only for now) */ - gchar *token; - gchar *tid; + enum { + STARTED = 0, + HEAD_REQUESTED, + HEAD_REPLY_RECEIVED, + TRANSFER_PHASE, + ACCEPTED + } status_15; + + /* contains all filenames, in case of multiple transfers, with the first + * one in the list being the current file's name (ymsg15) */ + GSList *filename_list; + GSList *size_list; /*corresponds to filename_list, with size as **STRING** */ + gboolean firstoflist; }; static void yahoo_xfer_data_free(struct yahoo_xfer_data *xd) { + PurpleConnection *gc; + struct yahoo_data *yd; + PurpleXfer *xfer; + GSList *l; + + gc = xd->gc; + yd = gc->proto_data; + + /*remove entry from map*/ + if(xd->xfer_peer_idstring) { + xfer = g_hash_table_lookup(yd->xfer_peer_idstring_map, xd->xfer_peer_idstring); + if(xfer) + g_hash_table_remove(yd->xfer_peer_idstring_map, xd->xfer_peer_idstring); + } + + /*empty file & filesize list*/ + for (l = xd->filename_list; l; l = l->next) { + g_free(l->data); + l->data=NULL; + } + for (l = xd->size_list; l; l = l->next) { + g_free(l->data); + l->data=NULL; + } + g_slist_free(xd->filename_list); + g_slist_free(xd->size_list); + g_free(xd->host); g_free(xd->path); g_free(xd->txbuf); - g_free(xd->token); - g_free(xd->tid); + g_free(xd->xfer_peer_idstring); + g_free(xd->xfer_idstring_for_relay); if (xd->tx_handler) purple_input_remove(xd->tx_handler); g_free(xd); } - -static void yahoo_xfer_y7_request_next_file(PurpleXfer *xfer) -{ - struct yahoo_packet *pack; - struct yahoo_xfer_data *xd = xfer->data; - PurpleConnection *gc = xd->gc; - struct yahoo_data *yd = gc->proto_data; - - g_return_if_fail(xd->y7); - - pack = yahoo_packet_new(YAHOO_SERVICE_Y7_FILETRANSFER_ACCEPT, YAHOO_STATUS_AVAILABLE, 0); - yahoo_packet_hash(pack, "sssi", - 1, purple_connection_get_display_name(xd->gc), - 5, xfer->who, - 265, xd->tid, - 271, 1); - yahoo_packet_send_and_free(pack, yd); -} - -static void yahoo_xfer_y7_cancel_receive(PurpleXfer *xfer) -{ - struct yahoo_packet *pack; - struct yahoo_xfer_data *xd = xfer->data; - PurpleConnection *gc = xd->gc; - struct yahoo_data *yd = gc->proto_data; - - g_return_if_fail(xd->y7); - - pack = yahoo_packet_new(YAHOO_SERVICE_Y7_FILETRANSFER_ACCEPT, -1, 0); - yahoo_packet_hash(pack, "sssi", - 1, purple_connection_get_display_name(gc), - 5, xfer->who, - 265, xd->tid, - 66, -1); - yahoo_packet_send_and_free(pack, yd); -} - -static void yahoo_xfer_y7_accept_file(PurpleXfer *xfer) -{ - struct yahoo_packet *pack; - struct yahoo_xfer_data *xd = xfer->data; - PurpleConnection *gc = xd->gc; - struct yahoo_data *yd = gc->proto_data; - - g_return_if_fail(xd->y7); - - pack = yahoo_packet_new(YAHOO_SERVICE_Y7_FILETRANSFER_ACCEPT, YAHOO_STATUS_AVAILABLE, 0); - yahoo_packet_hash(pack, "ssssis", - 1, purple_connection_get_display_name(gc), - 5, xfer->who, /* XXX this needs an accessor */ - 265, xd->tid, - 27, purple_xfer_get_filename(xfer), /* XXX this might be of incorrect encoding */ - 249, 3, - 251, xd->token); - yahoo_packet_send_and_free(pack, yd); -} - static void yahoo_receivefile_send_cb(gpointer data, gint source, PurpleInputCondition condition) { PurpleXfer *xfer; @@ -160,7 +146,6 @@ { PurpleXfer *xfer; struct yahoo_xfer_data *xd; - struct yahoo_data *yd; purple_debug(PURPLE_DEBUG_INFO, "yahoo", "AAA - in yahoo_receivefile_connected\n"); @@ -176,22 +161,11 @@ } xfer->fd = source; - yd = xd->gc->proto_data; /* The first time we get here, assemble the tx buffer */ if (xd->txbuflen == 0) { - if (!xd->y7) - xd->txbuf = g_strdup_printf("GET /%s HTTP/1.0\r\nHost: %s\r\n\r\n", - xd->path, xd->host); - else - xd->txbuf = g_strdup_printf("GET /%s HTTP/1.0\r\n" - "Connection: close\r\n" - "Accept: */*\r\n" - "Host: %s\r\n" - "Cookie: Y=%s; T=%s\r\n" - "\r\n", - xd->path, xd->host, yd->cookie_y, yd->cookie_t); - purple_debug(PURPLE_DEBUG_INFO, "yahoo_filexfer", "HTTP request: [%s]\n", xd->txbuf); + xd->txbuf = g_strdup_printf("GET /%s HTTP/1.0\r\nHost: %s\r\n\r\n", + xd->path, xd->host); xd->txbuflen = strlen(xd->txbuf); xd->txbuf_written = 0; } @@ -356,9 +330,6 @@ } } } else { - if (xfer_data->y7) - yahoo_xfer_y7_accept_file(xfer); - xfer->fd = -1; if (purple_proxy_connect(NULL, account, xfer_data->host, xfer_data->port, yahoo_receivefile_connected, xfer) == NULL) { @@ -369,23 +340,67 @@ } } +static void yahoo_xfer_init_15(PurpleXfer *xfer) +{ + struct yahoo_xfer_data *xfer_data; + PurpleConnection *gc; + PurpleAccount *account; + struct yahoo_data *yd; + struct yahoo_packet *pkt; + + xfer_data = xfer->data; + gc = xfer_data->gc; + yd = gc->proto_data; + account = purple_connection_get_account(gc); + + if (purple_xfer_get_type(xfer) == PURPLE_XFER_SEND) { + gchar *filename; + filename = g_path_get_basename(purple_xfer_get_local_filename(xfer)); + pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_15, + YAHOO_STATUS_AVAILABLE, + yd->session_id); + yahoo_packet_hash(pkt, "sssiiiisiii", + 1, purple_normalize(account, purple_account_get_username(account)), + 5, xfer->who, + 265, xfer_data->xfer_peer_idstring, + 222, 1, + 266, 1, + 302, 268, + 300, 268, + 27, filename, + 28, xfer->size, + 301, 268, + 303, 268); + g_free(filename); + } else { + if(xfer_data->firstoflist == TRUE) { + pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_15, + YAHOO_STATUS_AVAILABLE, yd->session_id); + + yahoo_packet_hash(pkt, "sssi", + 1, purple_normalize(account, purple_account_get_username(account)), + 5, xfer->who, + 265, xfer_data->xfer_peer_idstring, + 222, 3); + } else { + pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_ACC_15, + YAHOO_STATUS_AVAILABLE, yd->session_id); + + yahoo_packet_hash(pkt, "sssi", + 1, purple_normalize(account, purple_account_get_username(account)), + 5, xfer->who, + 265, xfer_data->xfer_peer_idstring, + 271, 1); + } + } + yahoo_packet_send_and_free(pkt, yd); +} + static void yahoo_xfer_start(PurpleXfer *xfer) { /* We don't need to do anything here, do we? */ } -static void yahoo_xfer_end(PurpleXfer *xfer) -{ - struct yahoo_xfer_data *xfer_data; - - xfer_data = xfer->data; - - if (xfer_data) - yahoo_xfer_data_free(xfer_data); - xfer->data = NULL; - -} - static guint calculate_length(const gchar *l, size_t len) { int i; @@ -418,8 +433,6 @@ if ((purple_xfer_get_size(xfer) > 0) && (purple_xfer_get_bytes_sent(xfer) >= purple_xfer_get_size(xfer))) { purple_xfer_set_completed(xfer, TRUE); - if (xd->y7) - yahoo_xfer_y7_request_next_file(xfer); return 0; } else return -1; @@ -499,6 +512,42 @@ xfer_data = xfer->data; + if(purple_xfer_get_status(xfer) == PURPLE_XFER_STATUS_CANCEL_LOCAL && xfer_data->version == 15) + { + PurpleConnection *gc; + PurpleAccount *account; + struct yahoo_data *yd; + struct yahoo_packet *pkt; + + gc = xfer_data->gc; + yd = gc->proto_data; + account = purple_connection_get_account(gc); + if(xfer_data->xfer_idstring_for_relay) /* hack to see if file trans acc/info packet has been received */ + { + pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_INFO_15, + YAHOO_STATUS_DISCONNECTED, + yd->session_id); + yahoo_packet_hash(pkt, "sssi", + 1, purple_normalize(account, purple_account_get_username(account)), + 5, xfer->who, + 265, xfer_data->xfer_peer_idstring, + 66, -1); + } + else + { + pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_15, + YAHOO_STATUS_AVAILABLE, + yd->session_id); + yahoo_packet_hash(pkt, "sssi", + 1, purple_normalize(account, purple_account_get_username(account)), + 5, xfer->who, + 265, xfer_data->xfer_peer_idstring, + 222, 2); + } + yahoo_packet_send_and_free(pkt, yd); + } + + if (xfer_data) yahoo_xfer_data_free(xfer_data); xfer->data = NULL; @@ -510,22 +559,145 @@ xfer_data = xfer->data; - if (xfer_data) { - if (xfer_data->y7) - yahoo_xfer_y7_cancel_receive(xfer); + if(purple_xfer_get_status(xfer) == PURPLE_XFER_STATUS_CANCEL_LOCAL && xfer_data->version == 15) + { + + PurpleConnection *gc; + PurpleAccount *account; + struct yahoo_data *yd; + struct yahoo_packet *pkt; + + gc = xfer_data->gc; + yd = gc->proto_data; + account = purple_connection_get_account(gc); + if(!xfer_data->xfer_idstring_for_relay) /* hack to see if file trans acc/info packet has been received */ + { + pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_15, + YAHOO_STATUS_AVAILABLE, + yd->session_id); + yahoo_packet_hash(pkt, "sssi", + 1, purple_normalize(account, purple_account_get_username(account)), + 5, xfer->who, + 265, xfer_data->xfer_peer_idstring, + 222, 4); + } + else + { + pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_15, + YAHOO_STATUS_DISCONNECTED, + yd->session_id); + yahoo_packet_hash(pkt, "sssi", + 1, purple_normalize(account, purple_account_get_username(account)), + 5, xfer->who, + 265, xfer_data->xfer_peer_idstring, + 66, -1); + } + yahoo_packet_send_and_free(pkt, yd); + } + + if (xfer_data) yahoo_xfer_data_free(xfer_data); - } xfer->data = NULL; } -static void yahoo_xfer_request_denied(PurpleXfer *xfer) +static void yahoo_xfer_end(PurpleXfer *xfer_old) { struct yahoo_xfer_data *xfer_data; + PurpleXfer *xfer = NULL; + PurpleConnection *gc; + struct yahoo_data *yd; - xfer_data = xfer->data; + xfer_data = xfer_old->data; + if(xfer_data && xfer_data->version == 15 + && purple_xfer_get_type(xfer_old) == PURPLE_XFER_RECEIVE + && xfer_data->filename_list) { + + /* removing top of filename & size list completely */ + g_free( xfer_data->filename_list->data ); + g_free( xfer_data->size_list->data ); + + xfer_data->filename_list->data = NULL; + xfer_data->size_list->data = NULL; + + xfer_data->filename_list = g_slist_delete_link(xfer_data->filename_list, xfer_data->filename_list); + xfer_data->size_list = g_slist_delete_link(xfer_data->size_list, xfer_data->size_list); + + /* if there are still more files */ + if(xfer_data->filename_list) + { + gchar* filename; + long filesize; + + filename = xfer_data->filename_list->data; + filesize = atol( xfer_data->size_list->data ); + + gc = xfer_data->gc; + yd = gc->proto_data; - if (xfer_data->y7) - yahoo_xfer_y7_cancel_receive(xfer); + /* setting up xfer_data for next file's tranfer */ + g_free(xfer_data->host); + g_free(xfer_data->path); + g_free(xfer_data->txbuf); + g_free(xfer_data->rxqueue); + g_free(xfer_data->xfer_idstring_for_relay); + if (xfer_data->tx_handler) + purple_input_remove(xfer_data->tx_handler); + xfer_data->host = NULL; + xfer_data->host = NULL; + xfer_data->port = 0; + xfer_data->expires = 0; + xfer_data->started = FALSE; + xfer_data->txbuf = NULL; + xfer_data->txbuflen = 0; + xfer_data->txbuf_written = 0; + xfer_data->tx_handler = 0; + xfer_data->rxqueue = NULL; + xfer_data->rxlen = 0; + xfer_data->xfer_idstring_for_relay = NULL; + xfer_data->info_val_249 = 0; + xfer_data->status_15 = STARTED; + xfer_data->firstoflist = FALSE; + + /* Dereference xfer_data from old xfer */ + xfer_old->data = NULL; + + /* Build the file transfer handle. */ + xfer = purple_xfer_new(gc->account, PURPLE_XFER_RECEIVE, xfer_old->who); + + + if (xfer) { + /* Set the info about the incoming file. */ + char *utf8_filename = yahoo_string_decode(gc, filename, TRUE); + purple_xfer_set_filename(xfer, utf8_filename); + g_free(utf8_filename); + purple_xfer_set_size(xfer, filesize); + + xfer->data = xfer_data; + + /* Setup our I/O op functions */ + purple_xfer_set_init_fnc(xfer, yahoo_xfer_init_15); + purple_xfer_set_start_fnc(xfer, yahoo_xfer_start); + purple_xfer_set_end_fnc(xfer, yahoo_xfer_end); + purple_xfer_set_cancel_send_fnc(xfer, yahoo_xfer_cancel_send); + purple_xfer_set_cancel_recv_fnc(xfer, yahoo_xfer_cancel_recv); + purple_xfer_set_read_fnc(xfer, yahoo_xfer_read); + purple_xfer_set_write_fnc(xfer, yahoo_xfer_write); + purple_xfer_set_request_denied_fnc(xfer,yahoo_xfer_cancel_recv); + + /*update map to current xfer*/ + g_hash_table_remove(yd->xfer_peer_idstring_map, xfer_data->xfer_peer_idstring); + g_hash_table_insert(yd->xfer_peer_idstring_map, xfer_data->xfer_peer_idstring, xfer); + + /* Now perform the request */ + purple_xfer_request(xfer); + } + return; + } + } + if (xfer_data) + yahoo_xfer_data_free(xfer_data); + xfer_old->data = NULL; + } void yahoo_process_p2pfilexfer(PurpleConnection *gc, struct yahoo_packet *pkt) @@ -721,165 +893,6 @@ } } -void yahoo_process_y7_filetransfer(PurpleConnection *gc, struct yahoo_packet *pkt) -{ - struct yahoo_data *yd = gc->proto_data; - char *who = NULL, *name = NULL; - int ttype = 0; - char *tid = NULL; - GSList *l = pkt->hash; - - while (l) { - struct yahoo_pair *pair = l->data; - - switch (pair->key) { - case 4: - /* them */ - who = pair->value; - break; - case 5: - /* us */ - name = pair->value; - break; - case 222: - /* 1=send, 2=cancel, 3=accept, 4=reject */ - if(pair->value) - ttype = atoi(pair->value); - break; - case 265: - /* transfer ID */ - tid = pair->value; - break; - case 266: - /* number of files */ - break; - case 27: - /* filename */ - break; - case 28: - /* filesize */ - break; - } - - l = l->next; - } - if (ttype == 1 && tid) { - /* We auto-accept all offers here, and ask the user about each individual - * file in yahoo_process_y7_filetransfer_info. This works fine for receiving - * a single file; when receiving multiple canceling one in the middle - * will also cancel the rest of them. - * Maybe TODO: UI and API allowing transfer of multiple files as a package. */ - struct yahoo_packet *pack; - pack = yahoo_packet_new(YAHOO_SERVICE_Y7_FILETRANSFER, YAHOO_STATUS_AVAILABLE, 0); - yahoo_packet_hash(pack, "sssi", 1, name, 5, who, 265, tid, 222, 3); - yahoo_packet_send_and_free(pack, yd); - } -} - -void yahoo_process_y7_filetransfer_info(PurpleConnection *gc, struct yahoo_packet *pkt) -{ - struct yahoo_data *yd = gc->proto_data; - char *who = NULL, *name = NULL; - int medium = 0; - char *tid = NULL, *server_host = NULL, *server_token = NULL, *filename = NULL; - GSList *l = pkt->hash; - struct yahoo_packet *pack; - PurpleXfer *xfer; - struct yahoo_xfer_data *xfer_data; - - while (l) { - struct yahoo_pair *pair = l->data; - - switch (pair->key) { - case 4: - /* them */ - who = pair->value; - break; - case 5: - /* us */ - name = pair->value; - break; - case 249: - /* 1=p2p, 3=reflection server */ - if(pair->value) - medium = atoi(pair->value); - break; - case 265: - /* transfer ID */ - tid = pair->value; - break; - case 27: - filename = pair->value; - break; - case 250: - server_host = pair->value; - break; - case 251: - server_token = pair->value; - break; - } - - l = l->next; - } - if (medium == 1) { - /* reject P2P transfers */ - pack = yahoo_packet_new(YAHOO_SERVICE_Y7_FILETRANSFER_ACCEPT, YAHOO_STATUS_AVAILABLE, 0); - yahoo_packet_hash(pack, "sssi", 1, name, 5, who, 265, tid, 66, -3); - yahoo_packet_send_and_free(pack, yd); - return; - } - - if (medium != 3) { - purple_debug_error("yahoo", "Unexpected medium %d.\n", medium); - /* weird */ - return; - } - - /* Setup the Yahoo-specific file transfer data */ - xfer_data = g_new0(struct yahoo_xfer_data, 1); - xfer_data->gc = gc; - xfer_data->host = g_strdup(server_host); - xfer_data->token = g_strdup(server_token); - xfer_data->tid = g_strdup(tid); - xfer_data->port = 80; - xfer_data->y7 = TRUE; - - /* TODO: full urlencode here */ - server_token = purple_strreplace(server_token, "\002", "%02"); - xfer_data->path = g_strdup_printf("relay?token=%s&sender=%s&recver=%s", - server_token, who, name); - g_free(server_token); - - purple_debug_misc("yahoo_filexfer", "Host is %s, port is %d, path is %s.\n", - xfer_data->host, xfer_data->port, xfer_data->path); - - /* Build the file transfer handle. */ - xfer = purple_xfer_new(gc->account, PURPLE_XFER_RECEIVE, who); - xfer->data = xfer_data; - - /* Set the info about the incoming file. */ - { - char *utf8_filename = yahoo_string_decode(gc, filename, TRUE); - purple_xfer_set_filename(xfer, utf8_filename); - g_free(utf8_filename); - } - - /* purple_xfer_set_size(xfer, filesize); */ - - /* Setup our I/O op functions */ - purple_xfer_set_init_fnc(xfer, yahoo_xfer_init); - purple_xfer_set_start_fnc(xfer, yahoo_xfer_start); - purple_xfer_set_end_fnc(xfer, yahoo_xfer_end); - purple_xfer_set_cancel_send_fnc(xfer, yahoo_xfer_cancel_send); - purple_xfer_set_cancel_recv_fnc(xfer, yahoo_xfer_cancel_recv); - purple_xfer_set_read_fnc(xfer, yahoo_xfer_read); - purple_xfer_set_write_fnc(xfer, yahoo_xfer_write); - purple_xfer_set_request_denied_fnc(xfer, yahoo_xfer_request_denied); - - /* Now perform the request */ - purple_xfer_request(xfer); -} - PurpleXfer *yahoo_new_xfer(PurpleConnection *gc, const char *who) { PurpleXfer *xfer; @@ -909,15 +922,641 @@ return xfer; } +static gchar* yahoo_xfer_new_xfer_id(void) +{ + gchar *ans; + int i,j; + ans = g_strnfill(24, ' '); + ans[23] = '$'; + ans[22] = '$'; + for(i = 0; i < 22; i++) + { + j = g_random_int_range (0,61); + if(j < 26) + ans[i] = j + 'a'; + else if(j < 52) + ans[i] = j - 26 + 'A'; + else + ans[i] = j - 52 + '0'; + } + return ans; +} + +static void yahoo_xfer_dns_connected_15(GSList *hosts, gpointer data, const char *error_message) +{ + PurpleXfer *xfer; + struct yahoo_xfer_data *xd; + struct sockaddr_in *addr; + struct yahoo_packet *pkt; + long actaddr; + long a,b,c,d; + PurpleConnection *gc; + PurpleAccount *account; + struct yahoo_data *yd; + gchar *url; + gchar *filename; + + if (!(xfer = data)) + return; + if (!(xd = xfer->data)) + return; + gc = xd->gc; + account = purple_connection_get_account(gc); + yd = gc->proto_data; + + if(!hosts) + { + purple_debug_error("yahoo", "Unable to find an IP address for relay.msg.yahoo.com\n"); + purple_xfer_cancel_remote(xfer); + return; + } + + /* Discard the length... */ + hosts = g_slist_remove(hosts, hosts->data); + if(!hosts) + { + purple_debug_error("yahoo", "Unable to find an IP address for relay.msg.yahoo.com\n"); + purple_xfer_cancel_remote(xfer); + return; + } + + /*TODO:actually, u must try with addr no.1 , if its not working addr no.2 .....*/ + addr = hosts->data; + actaddr = addr->sin_addr.s_addr; + d = actaddr % 256; + actaddr = (actaddr - d) / 256; + c = actaddr % 256; + actaddr = (actaddr - c) / 256; + b = actaddr % 256; + actaddr = (actaddr - b) / 256; + a = actaddr; + if(yd->jp) + xd->port = YAHOOJP_XFER_RELAY_PORT; + else + xd->port = YAHOO_XFER_RELAY_PORT; + + url = g_strdup_printf("%ld.%ld.%ld.%ld", d, c, b, a); + if (!purple_url_parse(url, &(xd->host), &(xd->port), &(xd->path), NULL, NULL)) { + purple_xfer_cancel_remote(xfer); + return; + } + g_free(url); + /* Free the address... */ + g_free(hosts->data); + hosts = g_slist_remove(hosts, hosts->data); + addr = NULL; + while (hosts != NULL) + { + /* Discard the length... */ + hosts = g_slist_remove(hosts, hosts->data); + /* Free the address... */ + g_free(hosts->data); + hosts = g_slist_remove(hosts, hosts->data); + } + + pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_INFO_15, YAHOO_STATUS_AVAILABLE, yd->session_id); + filename = g_path_get_basename(purple_xfer_get_local_filename(xfer)); + + yahoo_packet_hash(pkt, "ssssis", + 1, purple_normalize(account, purple_account_get_username(account)), + 5, xfer->who, + 265, xd->xfer_peer_idstring, + 27, filename, + 249, 3, + 250, xd->host); + + g_free(filename); + yahoo_packet_send_and_free(pkt, yd); +} + + void yahoo_send_file(PurpleConnection *gc, const char *who, const char *file) { + struct yahoo_xfer_data *xfer_data; + struct yahoo_data *yd; + int ver = 0; PurpleXfer *xfer = yahoo_new_xfer(gc, who); + YahooFriend *yf = yahoo_friend_find(gc, who); + /* To determine whether client uses ymsg 15 i.e. client is higher than YM 7 */ + if(yf && yf->version_id > 500000) + ver=15; g_return_if_fail(xfer != NULL); + if(ver == 15) { + yd = gc->proto_data; + xfer_data = xfer->data; + xfer_data->status_15 = STARTED; + purple_xfer_set_init_fnc(xfer, yahoo_xfer_init_15); + xfer_data->version = 15; + xfer_data->xfer_peer_idstring = yahoo_xfer_new_xfer_id(); + g_hash_table_insert(yd->xfer_peer_idstring_map, xfer_data->xfer_peer_idstring, xfer); + } + /* Now perform the request */ if (file) purple_xfer_request_accepted(xfer, file); else purple_xfer_request(xfer); } + +static void yahoo_xfer_connected_15(gpointer data, gint source, const gchar *error_message);/*using this in recv_cb*/ +static void yahoo_xfer_recv_cb_15(gpointer data, gint source, PurpleInputCondition condition) +{ + PurpleXfer *xfer; + struct yahoo_xfer_data *xd; + int did; + gchar* buf; + gchar* t; + PurpleAccount *account; + PurpleConnection *gc; + + xfer = data; + xd = xfer->data; + account = purple_connection_get_account(xd->gc); + gc = xd->gc; + + buf=g_strnfill(1000, 0); + while((did = read(source, buf, 998)) > 0) + { + xd->txbuflen += did; + buf[did] = '\0'; + t = xd->txbuf; + xd->txbuf = g_strconcat(t,buf,NULL); + g_free(t); + } + g_free(buf); + + if (did < 0 && errno == EAGAIN) return; + else if (did < 0) { + purple_debug_error("yahoo", "Unable to write in order to start ft errno = %d\n", errno); + purple_xfer_cancel_remote(xfer); + return; + } + + purple_input_remove(xd->tx_handler); + xd->tx_handler = 0; + xd->txbuflen = 0; + + if(xd->status_15 == HEAD_REQUESTED) { + xd->status_15 = HEAD_REPLY_RECEIVED; + close(source);/*Is this required?*/ + g_free(xd->txbuf); + xd->txbuf = NULL; + if (purple_proxy_connect(NULL, account, xd->host, xd->port, yahoo_xfer_connected_15, xfer) == NULL) + { + purple_notify_error(gc, NULL, _("File Transfer Failed"), + _("Unable to establish file descriptor.")); + purple_xfer_cancel_remote(xfer); + } + } else { + purple_debug_error("yahoo","Unrecognized yahoo file transfer mode and stage (ymsg15):%d,%d\n", + purple_xfer_get_type(xfer), + xd->status_15); + return; + } +} + +static void yahoo_xfer_send_cb_15(gpointer data, gint source, PurpleInputCondition condition) +{ + PurpleXfer *xfer; + struct yahoo_xfer_data *xd; + int remaining, written; + + xfer = data; + xd = xfer->data; + remaining = xd->txbuflen - xd->txbuf_written; + written = write(source, xd->txbuf + xd->txbuf_written, remaining); + + if (written < 0 && errno == EAGAIN) + written = 0; + else if (written <= 0) { + purple_debug_error("yahoo", "Unable to write in order to start ft errno = %d\n", errno); + purple_xfer_cancel_remote(xfer); + return; + } + + if (written < remaining) { + xd->txbuf_written += written; + return; + } + + purple_input_remove(xd->tx_handler); + xd->tx_handler = 0; + g_free(xd->txbuf); + xd->txbuf = NULL; + xd->txbuflen = 0; + xd->txbuf_written = 0; + + if(purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE && xd->status_15 == STARTED) + { + xd->status_15 = HEAD_REQUESTED; + xd->tx_handler = purple_input_add(source, PURPLE_INPUT_READ, yahoo_xfer_recv_cb_15, xfer); + yahoo_xfer_recv_cb_15(xfer, source, PURPLE_INPUT_READ); + } + else if(purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE && xd->status_15 == HEAD_REPLY_RECEIVED) + { + xd->status_15 = TRANSFER_PHASE; + xfer->fd = source; + purple_xfer_start(xfer, source, NULL, 0); + } + else if(purple_xfer_get_type(xfer) == PURPLE_XFER_SEND && xd->status_15 == ACCEPTED) + { + xd->status_15 = TRANSFER_PHASE; + xfer->fd = source; + purple_xfer_start(xfer, source, NULL, 0); + } + else + { + purple_debug_error("yahoo", "Unrecognized yahoo file transfer mode and stage (ymsg15):%d,%d\n", purple_xfer_get_type(xfer), xd->status_15); + return; + } + +} + + +static void yahoo_xfer_connected_15(gpointer data, gint source, const gchar *error_message) +{ + PurpleXfer *xfer; + struct yahoo_xfer_data *xd; + PurpleAccount *account; + struct yahoo_data* yd; + + if (!(xfer = data)) + return; + if (!(xd = xfer->data)) + return; + yd = xd->gc->proto_data; + account = purple_connection_get_account(xd->gc); + if ((source < 0) || (xd->path == NULL) || (xd->host == NULL)) { + purple_xfer_error(PURPLE_XFER_RECEIVE, purple_xfer_get_account(xfer), + xfer->who, _("Unable to connect.")); + purple_xfer_cancel_remote(xfer); + return; + } + /* The first time we get here, assemble the tx buffer */ + if (xd->txbuflen == 0) + { + gchar* cookies; + cookies = yahoo_get_cookies(xd->gc); + if(purple_xfer_get_type(xfer) == PURPLE_XFER_SEND && xd->status_15 == ACCEPTED) + { + xd->txbuf = g_strdup_printf("POST /relay?token=%s&sender=%s&recver=%s HTTP/1.1\r\nCookie:%s\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.5)\r\nHost: %s\r\nContent-Length: %ld\r\nCache-Control: no-cache\r\n\r\n", + purple_url_encode(xd->xfer_idstring_for_relay), + purple_normalize(account, purple_account_get_username(account)), + xfer->who, + cookies, + xd->host, + (long int)xfer->size); + } + else if(purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE && xd->status_15 == STARTED) + { + xd->txbuf = g_strdup_printf("HEAD /relay?token=%s&sender=%s&recver=%s HTTP/1.1\r\nAccept:*/*\r\nCookie:%s\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.5)\r\nHost:%s\r\nContent-Length: 0\r\nCache-Control: no-cache\r\n\r\n", + purple_url_encode(xd->xfer_idstring_for_relay), + purple_normalize(account, purple_account_get_username(account)), + xfer->who, + cookies, + xd->host); + } + else if(purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE && xd->status_15 == HEAD_REPLY_RECEIVED) + { + xd->txbuf = g_strdup_printf("GET /relay?token=%s&sender=%s&recver=%s HTTP/1.1\r\nCookie:%s\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.5)\r\nHost:%s\r\nConnection: Keep-Alive\r\n\r\n", + purple_url_encode(xd->xfer_idstring_for_relay), + purple_normalize(account, purple_account_get_username(account)), + xfer->who, + cookies, + xd->host); + } + else + { + purple_debug_error("yahoo", "Unrecognized yahoo file transfer mode and stage (ymsg15):%d,%d\n", purple_xfer_get_type(xfer), xd->status_15); + g_free(cookies); + return; + } + xd->txbuflen = strlen(xd->txbuf); + xd->txbuf_written = 0; + g_free(cookies); + } + + if (!xd->tx_handler) + { + xd->tx_handler = purple_input_add(source, PURPLE_INPUT_WRITE, + yahoo_xfer_send_cb_15, xfer); + yahoo_xfer_send_cb_15(xfer, source, PURPLE_INPUT_WRITE); + } +} + +void yahoo_process_filetrans_15(PurpleConnection *gc, struct yahoo_packet *pkt) +{ + char *from = NULL; + char *to = NULL; + char *imv = NULL; + long val_222 = 0L; + PurpleXfer *xfer; + struct yahoo_data *yd; + struct yahoo_xfer_data *xfer_data; + char *service = NULL; + char *filename = NULL; + char *xfer_peer_idstring = NULL; + unsigned long filesize = 0L; + GSList *l; + GSList *filename_list = NULL; + GSList *size_list = NULL; + int nooffiles = 0; + + yd = gc->proto_data; + + for (l = pkt->hash; l; l = l->next) { + struct yahoo_pair *pair = l->data; + + switch (pair->key) { + case 4: + from = pair->value; + break; + case 5: + to = pair->value; + break; + case 265: + xfer_peer_idstring = pair->value; + break; + case 27: + filename_list = g_slist_prepend(filename_list, g_strdup(pair->value)); + nooffiles++; + break; + case 28: + size_list = g_slist_prepend(size_list, g_strdup(pair->value)); + break; + case 222: + val_222 = atol(pair->value); + /* 1=send, 2=cancel, 3=accept, 4=reject */ + break; + + /*check for p2p and imviron .... not sure it comes by this service packet. Since it was bundled with filexfer in old ymsg version, still keeping it.*/ + case 49: + service = pair->value; + break; + case 63: + imv = pair->value; + break; + /*end check*/ + + } + } + if(!xfer_peer_idstring) + return; + + if(val_222 == 2 || val_222 == 4) + { + xfer = g_hash_table_lookup(yd->xfer_peer_idstring_map, + xfer_peer_idstring); + if(!xfer) return; + purple_xfer_cancel_remote(xfer); + return; + } + if(val_222 == 3) + { + xfer = g_hash_table_lookup(yd->xfer_peer_idstring_map, + xfer_peer_idstring); + if(!xfer) + return; + /* + * In the file trans info packet tht we must reply with , we are supposed to mention the ip address... + * purple connect does not give me a way of finding the ip address... + * so, purple dnsquery is used... but retries, trying with next ip address etc. is not implemented..TODO + */ + if (yd->jp) + { + purple_dnsquery_a(YAHOOJP_XFER_RELAY_HOST, YAHOOJP_XFER_RELAY_PORT, yahoo_xfer_dns_connected_15, xfer); + } + else + { + purple_dnsquery_a(YAHOO_XFER_RELAY_HOST, YAHOO_XFER_RELAY_PORT, yahoo_xfer_dns_connected_15, xfer); + } + return; + } + + /*processing for p2p and imviron .... not sure it comes by this service packet. Since it was bundled with filexfer in old ymsg version, still keeping it.*/ + /* + * The remote user has changed their IMVironment. We + * record it for later use. + */ + if (from && imv && service && (strcmp("IMVIRONMENT", service) == 0)) { + g_hash_table_replace(yd->imvironments, g_strdup(from), g_strdup(imv)); + return; + } + + if (pkt->service == YAHOO_SERVICE_P2PFILEXFER) { + if (service && (strcmp("FILEXFER", service) != 0)) { + purple_debug_misc("yahoo", "unhandled service 0x%02x\n", pkt->service); + return; + } + } + /*end processing*/ + + if(!filename_list) + return; + /* have to change list into order in which client at other end sends */ + filename_list = g_slist_reverse(filename_list); + size_list = g_slist_reverse(size_list); + filename = filename_list->data; + filesize = atol(size_list->data); + + if(!from) return; + xfer_data = g_new0(struct yahoo_xfer_data, 1); + xfer_data->version = 15; + xfer_data->firstoflist = TRUE; + xfer_data->gc = gc; + xfer_data->xfer_peer_idstring = g_strdup(xfer_peer_idstring); + xfer_data->filename_list = filename_list; + xfer_data->size_list = size_list; + + /* Build the file transfer handle. */ + xfer = purple_xfer_new(gc->account, PURPLE_XFER_RECEIVE, from); + xfer->message = NULL; + + if (xfer) + { + /* Set the info about the incoming file. */ + char *utf8_filename = yahoo_string_decode(gc, filename, TRUE); + purple_xfer_set_filename(xfer, utf8_filename); + g_free(utf8_filename); + purple_xfer_set_size(xfer, filesize); + + xfer->data = xfer_data; + + + /* Setup our I/O op functions */ + purple_xfer_set_init_fnc(xfer, yahoo_xfer_init_15); + purple_xfer_set_start_fnc(xfer, yahoo_xfer_start); + purple_xfer_set_end_fnc(xfer, yahoo_xfer_end); + purple_xfer_set_cancel_send_fnc(xfer, yahoo_xfer_cancel_send); + purple_xfer_set_cancel_recv_fnc(xfer, yahoo_xfer_cancel_recv); + purple_xfer_set_read_fnc(xfer, yahoo_xfer_read); + purple_xfer_set_write_fnc(xfer, yahoo_xfer_write); + purple_xfer_set_request_denied_fnc(xfer,yahoo_xfer_cancel_recv); + + g_hash_table_insert(yd->xfer_peer_idstring_map, + xfer_data->xfer_peer_idstring, + xfer); + + if(nooffiles > 1) { + gchar* message; + message = g_strdup_printf(_("%s is trying to send you a group of %d files.\n"), xfer->who, nooffiles); + purple_xfer_conversation_write(xfer, message, FALSE); + g_free(message); + } + /* Now perform the request */ + purple_xfer_request(xfer); + } +} + +void yahoo_process_filetrans_info_15(PurpleConnection *gc, struct yahoo_packet *pkt) +{ + char *from = NULL; + char *to = NULL; + char *url = NULL; + long val_249 = 0; + long val_66 = 0; + PurpleXfer *xfer; + struct yahoo_data *yd; + struct yahoo_xfer_data *xfer_data; + char *filename = NULL; + char *xfer_peer_idstring = NULL; + char *xfer_idstring_for_relay = NULL; + GSList *l; + struct yahoo_packet *pkt_to_send; + PurpleAccount *account; + + yd = gc->proto_data; + + for (l = pkt->hash; l; l = l->next) { + struct yahoo_pair *pair = l->data; + + switch (pair->key) { + case 4: + from = pair->value; + break; + case 5: + to = pair->value; + break; + case 265: + xfer_peer_idstring = pair->value; + break; + case 27: + filename = pair->value; + break; + case 66: + val_66 = strtol(pair->value, NULL, 10); + break; + case 249: + val_249 = strtol(pair->value, NULL, 10); /* + * really pissed off with this- i hv seen 2 occurences of this + * being 1(its normally 3) - and in those cases, the url + * format and corresponding processing seems to be different + * (i havent tested - couldnt reproduce a 1), although i + * guess its easier. + */ + break; + case 250: + url = pair->value; + break; + case 251: + xfer_idstring_for_relay = pair->value; + break; + } + } + + if(!xfer_peer_idstring) + return; + + xfer = g_hash_table_lookup(yd->xfer_peer_idstring_map, xfer_peer_idstring); + + if(!xfer) return; + + if(val_66==-1) + { + purple_xfer_cancel_remote(xfer); + return; + } + + xfer_data = xfer->data; + + xfer_data->info_val_249 = val_249; + xfer_data->xfer_idstring_for_relay = g_strdup(xfer_idstring_for_relay); + if (!purple_url_parse(url, &(xfer_data->host), &(xfer_data->port), &(xfer_data->path), NULL, NULL)) { + purple_xfer_cancel_remote(xfer); + return; + } + + account = purple_connection_get_account(xfer_data->gc); + + pkt_to_send = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_ACC_15, + YAHOO_STATUS_AVAILABLE, yd->session_id); + + yahoo_packet_hash(pkt_to_send, "ssssisi", + 1, purple_normalize(account, purple_account_get_username(account)), + 5, xfer->who, + 265, xfer_data->xfer_peer_idstring, + 27, xfer->filename, + 249, xfer_data->info_val_249, + 251, xfer_data->xfer_idstring_for_relay, + 222, 3); + + yahoo_packet_send_and_free(pkt_to_send, yd); + if (purple_proxy_connect(NULL, account, xfer_data->host, xfer_data->port, + yahoo_xfer_connected_15, xfer) == NULL) { + purple_notify_error(gc, NULL, _("File Transfer Failed"), + _("Unable to establish file descriptor.")); + purple_xfer_cancel_remote(xfer); + } + +} +/*TODO: Check filename etc. No probs till some hacker comes in the way*/ +void yahoo_process_filetrans_acc_15(PurpleConnection *gc, struct yahoo_packet *pkt) +{ + gchar *xfer_peer_idstring = NULL; + gchar *xfer_idstring_for_relay = NULL; + PurpleXfer *xfer; + struct yahoo_data *yd; + struct yahoo_xfer_data *xfer_data; + GSList *l; + PurpleAccount *account; + long val_66 = 0; + + yd = gc->proto_data; + for (l = pkt->hash; l; l = l->next) { + struct yahoo_pair *pair = l->data; + + switch (pair->key) { + case 251: + xfer_idstring_for_relay = pair->value; + break; + case 265: + xfer_peer_idstring = pair->value; + break; + case 66: + val_66 = atol(pair->value); + } + } + + xfer = g_hash_table_lookup(yd->xfer_peer_idstring_map, xfer_peer_idstring); + if(!xfer) return; + + if(val_66 == -1 || !(xfer_idstring_for_relay)) + { + purple_xfer_cancel_remote(xfer); + return; + } + + xfer_data = xfer->data; + xfer_data->xfer_idstring_for_relay = g_strdup(xfer_idstring_for_relay); + xfer_data->status_15 = ACCEPTED; + account = purple_connection_get_account(gc); + + if (purple_proxy_connect(NULL, account, xfer_data->host, xfer_data->port, + yahoo_xfer_connected_15, xfer) == NULL) + { + purple_notify_error(gc, NULL, _("File Transfer Failed"),_("Unable to connect")); + purple_xfer_cancel_remote(xfer); + } +} diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/yahoo/yahoo_filexfer.h --- a/libpurple/protocols/yahoo/yahoo_filexfer.h Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/yahoo/yahoo_filexfer.h Wed Feb 06 03:35:04 2008 +0000 @@ -30,16 +30,6 @@ void yahoo_process_p2pfilexfer( PurpleConnection *gc, struct yahoo_packet *pkt ); /** - * Process ymsg version 7 file receive invites. - */ -void yahoo_process_y7_filetransfer(PurpleConnection *gc, struct yahoo_packet *pkt); - -/** - * Process ymsg version 7 file receive connection setups. - */ -void yahoo_process_y7_filetransfer_info(PurpleConnection *gc, struct yahoo_packet *pkt); - -/** * Process ymsg file receive invites. */ void yahoo_process_filetransfer(PurpleConnection *gc, struct yahoo_packet *pkt); @@ -61,4 +51,8 @@ */ void yahoo_send_file(PurpleConnection *gc, const char *who, const char *file); +void yahoo_process_filetrans_15(PurpleConnection *gc, struct yahoo_packet *pkt); +void yahoo_process_filetrans_info_15(PurpleConnection *gc, struct yahoo_packet *pkt); +void yahoo_process_filetrans_acc_15(PurpleConnection *gc, struct yahoo_packet *pkt); + #endif diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/yahoo/yahoo_friend.h --- a/libpurple/protocols/yahoo/yahoo_friend.h Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/yahoo/yahoo_friend.h Wed Feb 06 03:35:04 2008 +0000 @@ -48,6 +48,7 @@ gboolean bicon_sent_request; YahooPresenceVisibility presence; int protocol; /* 1=LCS, 2=MSN*/ + long int version_id; } YahooFriend; YahooFriend *yahoo_friend_find(PurpleConnection *gc, const char *name); diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/yahoo/yahoo_packet.h --- a/libpurple/protocols/yahoo/yahoo_packet.h Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/yahoo/yahoo_packet.h Wed Feb 06 03:35:04 2008 +0000 @@ -99,12 +99,12 @@ YAHOO_SERVICE_VERIFY_ID_EXISTS = 0xc8, YAHOO_SERVICE_AUDIBLE = 0xd0, YAHOO_SERVICE_AUTH_REQ_15 = 0xd6, - YAHOO_SERVICE_Y7_FILETRANSFER = 0xdc, - YAHOO_SERVICE_Y7_FILETRANSFER_INFO = 0xdd, - YAHOO_SERVICE_Y7_FILETRANSFER_ACCEPT = 0xde, YAHOO_SERVICE_CHGRP_15 = 0xe7, YAHOO_SERVICE_STATUS_15 = 0xf0, YAHOO_SERVICE_LIST_15 = 0xf1, + YAHOO_SERVICE_FILETRANS_15 = 0xdc, + YAHOO_SERVICE_FILETRANS_INFO_15 = 0xdd, + YAHOO_SERVICE_FILETRANS_ACC_15 = 0xde, YAHOO_SERVICE_WEBLOGIN = 0x0226, YAHOO_SERVICE_SMS_MSG = 0x02ea }; diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/yahoo/yahoochat.c --- a/libpurple/protocols/yahoo/yahoochat.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/yahoo/yahoochat.c Wed Feb 06 03:35:04 2008 +0000 @@ -114,6 +114,7 @@ void yahoo_process_conference_invite(PurpleConnection *gc, struct yahoo_packet *pkt) { + PurpleAccount *account; GSList *l; char *room = NULL; char *who = NULL; @@ -124,6 +125,8 @@ if (pkt->status == 2) return; /* XXX */ + account = purple_connection_get_account(gc); + members = g_string_sized_new(512); for (l = pkt->hash; l; l = l->next) { @@ -159,8 +162,9 @@ return; } - if (!yahoo_privacy_check(gc, who) || - (purple_account_get_bool(purple_connection_get_account(gc), "ignore_invites", FALSE))) { + if (!purple_privacy_check(account, who) || + (purple_account_get_bool(account, "ignore_invites", FALSE))) + { purple_debug_info("yahoo", "Invite to conference %s from %s has been dropped.\n", room, who); g_free(room); @@ -203,7 +207,8 @@ break; } } - if (!yahoo_privacy_check(gc, who)) { + if (!purple_privacy_check(purple_connection_get_account(gc), who)) + { g_free(room); g_free(msg); return; @@ -664,11 +669,14 @@ void yahoo_process_chat_addinvite(PurpleConnection *gc, struct yahoo_packet *pkt) { + PurpleAccount *account; GSList *l; char *room = NULL; char *msg = NULL; char *who = NULL; + account = purple_connection_get_account(gc); + for (l = pkt->hash; l; l = l->next) { struct yahoo_pair *pair = l->data; @@ -696,8 +704,9 @@ if (room && who) { GHashTable *components; - if (!yahoo_privacy_check(gc, who) || - (purple_account_get_bool(purple_connection_get_account(gc), "ignore_invites", FALSE))) { + if (!purple_privacy_check(account, who) || + (purple_account_get_bool(account, "ignore_invites", FALSE))) + { purple_debug_info("yahoo", "Invite to room %s from %s has been dropped.\n", room, who); g_free(room); g_free(msg); @@ -1461,28 +1470,30 @@ PurpleRoomlist *yahoo_roomlist_get_list(PurpleConnection *gc) { - struct yahoo_roomlist *yrl; + PurpleAccount *account; PurpleRoomlist *rl; - const char *rll; + PurpleRoomlistField *f; + GList *fields = NULL; + struct yahoo_roomlist *yrl; + const char *rll, *rlurl; char *url; - GList *fields = NULL; - PurpleRoomlistField *f; - rll = purple_account_get_string(purple_connection_get_account(gc), - "room_list_locale", YAHOO_ROOMLIST_LOCALE); + account = purple_connection_get_account(gc); - if (rll != NULL && *rll != '\0') { - url = g_strdup_printf("%s?chatcat=0&intl=%s", - purple_account_get_string(purple_connection_get_account(gc), - "room_list", YAHOO_ROOMLIST_URL), rll); - } else { - url = g_strdup_printf("%s?chatcat=0", - purple_account_get_string(purple_connection_get_account(gc), - "room_list", YAHOO_ROOMLIST_URL)); + /* for Yahoo Japan, it appears there is only one valid URL and locale */ + if(purple_account_get_bool(account, "yahoojp", FALSE)) { + rll = YAHOOJP_ROOMLIST_LOCALE; + rlurl = YAHOOJP_ROOMLIST_URL; + } + else { /* but for the rest of the world that isn't the case */ + rll = purple_account_get_string(account, "room_list_locale", YAHOO_ROOMLIST_LOCALE); + rlurl = purple_account_get_string(account, "room_list", YAHOO_ROOMLIST_URL); } + url = g_strdup_printf("%s?chatcat=0&intl=%s", rlurl, rll); + yrl = g_new0(struct yahoo_roomlist, 1); - rl = purple_roomlist_new(purple_connection_get_account(gc)); + rl = purple_roomlist_new(account); yrl->list = rl; purple_url_parse(url, &(yrl->host), NULL, &(yrl->path), NULL, NULL); @@ -1508,7 +1519,7 @@ purple_roomlist_set_fields(rl, fields); - if (purple_proxy_connect(NULL, purple_connection_get_account(gc), yrl->host, 80, + if (purple_proxy_connect(NULL, account, yrl->host, 80, yahoo_roomlist_got_connected, yrl) == NULL) { purple_notify_error(gc, NULL, _("Connection problem"), _("Unable to fetch room list.")); diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/zephyr/Zinternal.c --- a/libpurple/protocols/zephyr/Zinternal.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/zephyr/Zinternal.c Wed Feb 06 03:35:04 2008 +0000 @@ -33,8 +33,6 @@ #include #endif -extern char *inet_ntoa (); - int __Zephyr_fd = -1; int __Zephyr_open; int __Zephyr_port = -1; @@ -144,7 +142,7 @@ /* Return 1 if there is a packet waiting, 0 otherwise */ -static int Z_PacketWaiting() +static int Z_PacketWaiting(void) { struct timeval tv; fd_set read; @@ -158,7 +156,7 @@ /* Wait for a complete notice to become available */ -Code_t Z_WaitForComplete() +Code_t Z_WaitForComplete(void) { Code_t retval; @@ -195,9 +193,7 @@ * notices that haven't been touched in a while */ -static struct _Z_InputQ *Z_SearchQueue(uid, kind) - ZUnique_Id_t *uid; - ZNotice_Kind_t kind; +static struct _Z_InputQ *Z_SearchQueue(ZUnique_Id_t *uid, ZNotice_Kind_t kind) { register struct _Z_InputQ *qptr; struct _Z_InputQ *next; diff -r f182cf94145c -r 00eaff9396ec libpurple/protocols/zephyr/zephyr.c --- a/libpurple/protocols/zephyr/zephyr.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/protocols/zephyr/zephyr.c Wed Feb 06 03:35:04 2008 +0000 @@ -53,7 +53,7 @@ extern Code_t ZGetLocations(ZLocations_t *, int *); extern Code_t ZSetLocation(char *); -extern Code_t ZUnsetLocation(); +extern Code_t ZUnsetLocation(void); extern Code_t ZGetSubscriptions(ZSubscription_t *, int*); extern char __Zephyr_realm[]; typedef struct _zframe zframe; @@ -156,13 +156,20 @@ #endif static Code_t zephyr_subscribe_to(zephyr_account* zephyr, char* class, char *instance, char *recipient, char* galaxy) { + size_t result; + Code_t ret_val = -1; if (use_tzc(zephyr)) { /* ((tzcfodder . subscribe) ("class" "instance" "recipient")) */ gchar *zsubstr = g_strdup_printf("((tzcfodder . subscribe) (\"%s\" \"%s\" \"%s\"))\n",class,instance,recipient); - write(zephyr->totzc[ZEPHYR_FD_WRITE],zsubstr,strlen(zsubstr)); + size_t len = strlen(zsubstr); + result = write(zephyr->totzc[ZEPHYR_FD_WRITE],zsubstr,len); + if (result != len) { + purple_debug_error("zephyr", "Unable to write a message: %s\n", g_strerror(errno)); + } else { + ret_val = ZERR_NONE; + } g_free(zsubstr); - return ZERR_NONE; } else { if (use_zeph02(zephyr)) { @@ -170,13 +177,10 @@ sub.zsub_class = class; sub.zsub_classinst = instance; sub.zsub_recipient = recipient; - return ZSubscribeTo(&sub,1,0); - } else { - /* This should not happen */ - return -1; + ret_val = ZSubscribeTo(&sub,1,0); } } - return -1; + return ret_val; } char *local_zephyr_normalize(zephyr_account* zephyr,const char *); @@ -854,52 +858,8 @@ if (!g_ascii_strcasecmp(notice.z_opcode,"PING")) serv_got_typing(gc,stripped_sender,ZEPHYR_TYPING_RECV_TIMEOUT, PURPLE_TYPING); - else { - /* Based on the values of - account->permit_deny, - account->permit, account>deny , and - the buddylist */ - - GSList* l; - gboolean in_deny; - - switch (gc->account->perm_deny) { - case PURPLE_PRIVACY_ALLOW_ALL: - in_deny = 0; break; - case PURPLE_PRIVACY_DENY_ALL: - in_deny = 1; break; - case PURPLE_PRIVACY_ALLOW_USERS: /* See if stripped_sender is in gc->account->permit and allow appropriately */ - in_deny = 1; - for(l=gc->account->permit;l!=NULL;l=l->next) { - if (!purple_utf8_strcasecmp(stripped_sender, purple_normalize(gc->account, (char *)l->data))) { - in_deny=0; - break; - } - } - break; - case PURPLE_PRIVACY_DENY_USERS: /* See if stripped_sender is in gc->account->deny and deny if so */ - in_deny = 0; - for(l=gc->account->deny;l!=NULL;l=l->next) { - if (!purple_utf8_strcasecmp(stripped_sender, purple_normalize(gc->account, (char *)l->data))) { - in_deny=1; - break; - } - } - break; - case PURPLE_PRIVACY_ALLOW_BUDDYLIST: - in_deny = 1; - if (purple_find_buddy(gc->account,stripped_sender)!=NULL) { - in_deny = 0; - } - break; - default: - in_deny=0; break; - } - - if (!in_deny) { - serv_got_im(gc, stripped_sender, buf3, flags, time(NULL)); - } - } + else + serv_got_im(gc, stripped_sender, buf3, flags, time(NULL)); g_free(stripped_sender); } else { @@ -1373,7 +1333,11 @@ } else if (use_tzc(zephyr)) { gchar *zlocstr = g_strdup_printf("((tzcfodder . zlocate) \"%s\")\n",chk); - write(zephyr->totzc[ZEPHYR_FD_WRITE],zlocstr,strlen(zlocstr)); + size_t len = strlen(zlocstr); + size_t result = write(zephyr->totzc[ZEPHYR_FD_WRITE],zlocstr,len); + if (result != len) { + purple_debug_error("zephyr", "Unable to write a message: %s\n", g_strerror(errno)); + } g_free(zlocstr); } } @@ -1386,7 +1350,7 @@ #endif /* WIN32 */ -static char *get_exposure_level() +static char *get_exposure_level(void) { /* XXX add real error reporting */ char *exposure = ZGetVariable("exposure"); @@ -2058,7 +2022,7 @@ static int zephyr_send_message(zephyr_account *zephyr,char* zclass, char* instance, char* recipient, const char *im, const char *sig, char *opcode) ; -static const char * zephyr_get_signature() +static const char * zephyr_get_signature(void) { /* XXX add zephyr error reporting */ const char * sig =ZGetVariable("zwrite-signature"); @@ -2193,6 +2157,8 @@ html_buf2 = purple_unescape_html(html_buf); if(use_tzc(zephyr)) { + size_t len; + size_t result; char* zsendstr; /* CMU cclub tzc doesn't grok opcodes for now */ char* tzc_sig = zephyr_tzc_escape_msg(sig); @@ -2200,7 +2166,14 @@ zsendstr = g_strdup_printf("((tzcfodder . send) (class . \"%s\") (auth . t) (recipients (\"%s\" . \"%s\")) (message . (\"%s\" \"%s\")) ) \n", zclass, instance, recipient, tzc_sig, tzc_body); /* fprintf(stderr,"zsendstr = %s\n",zsendstr); */ - write(zephyr->totzc[ZEPHYR_FD_WRITE],zsendstr,strlen(zsendstr)); + len = strlen(zsendstr); + result = write(zephyr->totzc[ZEPHYR_FD_WRITE], zsendstr, len); + if (result != len) { + g_free(zsendstr); + g_free(html_buf2); + g_free(html_buf); + return errno; + } g_free(zsendstr); } else if (use_zeph02(zephyr)) { ZNotice_t notice; @@ -2221,6 +2194,9 @@ purple_debug_info("zephyr","About to send notice\n"); if (! ZSendNotice(¬ice, ZAUTH) == ZERR_NONE) { /* XXX handle errors here */ + g_free(buf); + g_free(html_buf2); + g_free(html_buf); return 0; } purple_debug_info("zephyr","notice sent\n"); @@ -2252,12 +2228,32 @@ return buf; } +static const char *zephyr_normalize(const PurpleAccount *account, const char *who) +{ + static char buf[BUF_LEN]; + PurpleConnection *gc; + char *tmp; + + gc = purple_account_get_connection(account); + tmp = local_zephyr_normalize(gc->proto_data, who); + + if (strlen(tmp) >= sizeof(buf)) { + g_free(tmp); + return NULL; + } + + strcpy(buf, tmp); + g_free(tmp); + + return buf; +} + static void zephyr_zloc(PurpleConnection *gc, const char *who) { ZAsyncLocateData_t ald; zephyr_account *zephyr = gc->proto_data; gchar* normalized_who = local_zephyr_normalize(zephyr,who); - + if (use_zeph02(zephyr)) { if (ZRequestLocations(normalized_who, &ald, UNACKED, ZAUTH) == ZERR_NONE) { zephyr->pending_zloc_names = g_list_append(zephyr->pending_zloc_names, @@ -2266,14 +2262,22 @@ /* XXX deal with errors somehow */ } } else if (use_tzc(zephyr)) { + size_t len; + size_t result; char* zlocstr = g_strdup_printf("((tzcfodder . zlocate) \"%s\")\n",normalized_who); zephyr->pending_zloc_names = g_list_append(zephyr->pending_zloc_names, g_strdup(normalized_who)); - write(zephyr->totzc[ZEPHYR_FD_WRITE],zlocstr,strlen(zlocstr)); + len = strlen(zlocstr); + result = write(zephyr->totzc[ZEPHYR_FD_WRITE],zlocstr,len); + if (result != len) { + purple_debug_error("zephyr", "Unable to write a message: %s\n", g_strerror(errno)); + } g_free(zlocstr); } } static void zephyr_set_status(PurpleAccount *account, PurpleStatus *status) { + size_t len; + size_t result; zephyr_account *zephyr = purple_account_get_connection(account)->proto_data; PurpleStatusPrimitive primitive = purple_status_type_get_primitive(purple_status_get_type(status)); @@ -2291,7 +2295,11 @@ } else { char *zexpstr = g_strdup_printf("((tzcfodder . set-location) (hostname . \"%s\") (exposure . \"%s\"))\n",zephyr->ourhost,zephyr->exposure); - write(zephyr->totzc[ZEPHYR_FD_WRITE],zexpstr,strlen(zexpstr)); + len = strlen(zexpstr); + result = write(zephyr->totzc[ZEPHYR_FD_WRITE],zexpstr,len); + if (result != len) { + purple_debug_error("zephyr", "Unable to write message: %s\n", g_strerror(errno)); + } g_free(zexpstr); } } @@ -2301,7 +2309,11 @@ ZSetLocation(EXPOSE_OPSTAFF); } else { char *zexpstr = g_strdup_printf("((tzcfodder . set-location) (hostname . \"%s\") (exposure . \"%s\"))\n",zephyr->ourhost,EXPOSE_OPSTAFF); - write(zephyr->totzc[ZEPHYR_FD_WRITE],zexpstr,strlen(zexpstr)); + len = strlen(zexpstr); + result = write(zephyr->totzc[ZEPHYR_FD_WRITE],zexpstr,len); + if (result != len) { + purple_debug_error("zephyr", "Unable to write message: %s\n", g_strerror(errno)); + } g_free(zexpstr); } } @@ -2676,7 +2688,7 @@ return PURPLE_CMD_RET_FAILED; } -static void zephyr_register_slash_commands() +static void zephyr_register_slash_commands(void) { purple_cmd_register("msg","ws", PURPLE_CMD_P_PRPL, @@ -2746,36 +2758,6 @@ } -static void -zephyr_add_deny(PurpleConnection *gc, const char *who) -{ - purple_privacy_deny_add(gc->account,who,1); -} - -static void -zephyr_remove_deny(PurpleConnection *gc, const char *who) -{ - purple_privacy_deny_remove(gc->account,who,1); -} - -static void -zephyr_add_permit(PurpleConnection *gc, const char *who) -{ - purple_privacy_permit_add(gc->account,who,1); -} - -static void -zephyr_remove_permit(PurpleConnection *gc, const char *who) -{ - purple_privacy_permit_remove(gc->account,who,1); -} - -static void -zephyr_set_permit_deny(PurpleConnection *gc) -{ - /* This doesn't have to do anything, since really, we can just check account->perm_deny when deciding whether to di */ - return; -} static int zephyr_resubscribe(PurpleConnection *gc) { /* Resubscribe to the in-memory list of subscriptions and also @@ -2884,11 +2866,11 @@ NULL, /* add_buddies */ NULL, /* remove_buddy */ NULL, /* remove_buddies */ - zephyr_add_permit, /* add_permit */ - zephyr_add_deny, /* add_deny */ - zephyr_remove_permit, /* remove_permit */ - zephyr_remove_deny, /* remove_deny */ - zephyr_set_permit_deny, /* set_permit_deny */ + NULL, /* add_permit */ + NULL, /* add_deny */ + NULL, /* remove_permit */ + NULL, /* remove_deny */ + NULL, /* set_permit_deny */ zephyr_join_chat, /* join_chat */ NULL, /* reject_chat -- No chat invites*/ zephyr_get_chat_name, /* get_chat_name */ @@ -2905,7 +2887,7 @@ NULL, /* rename_group */ NULL, /* buddy_free */ NULL, /* convo_closed */ - NULL, /* normalize */ + zephyr_normalize, /* normalize */ NULL, /* XXX set_buddy_icon */ NULL, /* remove_group */ NULL, /* XXX get_cb_real_name */ diff -r f182cf94145c -r 00eaff9396ec libpurple/prpl.c --- a/libpurple/prpl.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/prpl.c Wed Feb 06 03:35:04 2008 +0000 @@ -29,6 +29,107 @@ #include "util.h" /**************************************************************************/ +/** @name Attention Type API */ +/**************************************************************************/ +PurpleAttentionType * +purple_attention_type_new(const char *ulname, const char *name, + const char *inc_desc, const char *out_desc) +{ + PurpleAttentionType *attn = g_new0(PurpleAttentionType, 1); + + purple_attention_type_set_name(attn, name); + purple_attention_type_set_incoming_desc(attn, inc_desc); + purple_attention_type_set_outgoing_desc(attn, out_desc); + purple_attention_type_set_unlocalized_name(attn, ulname); + + return attn; +} + + +void +purple_attention_type_set_name(PurpleAttentionType *type, const char *name) +{ + g_return_if_fail(type != NULL); + + type->name = name; +} + +void +purple_attention_type_set_incoming_desc(PurpleAttentionType *type, const char *desc) +{ + g_return_if_fail(type != NULL); + + type->incoming_description = desc; +} + +void +purple_attention_type_set_outgoing_desc(PurpleAttentionType *type, const char *desc) +{ + g_return_if_fail(type != NULL); + + type->outgoing_description = desc; +} + +void +purple_attention_type_set_icon_name(PurpleAttentionType *type, const char *name) +{ + g_return_if_fail(type != NULL); + + type->icon_name = name; +} + +void +purple_attention_type_set_unlocalized_name(PurpleAttentionType *type, const char *ulname) +{ + g_return_if_fail(type != NULL); + + type->unlocalized_name = ulname; +} + +const char * +purple_attention_type_get_name(const PurpleAttentionType *type) +{ + g_return_val_if_fail(type != NULL, NULL); + + return type->name; +} + +const char * +purple_attention_type_get_incoming_desc(const PurpleAttentionType *type) +{ + g_return_val_if_fail(type != NULL, NULL); + + return type->incoming_description; +} + +const char * +purple_attention_type_get_outgoing_desc(const PurpleAttentionType *type) +{ + g_return_val_if_fail(type != NULL, NULL); + + return type->outgoing_description; +} + +const char * +purple_attention_type_get_icon_name(const PurpleAttentionType *type) +{ + g_return_val_if_fail(type != NULL, NULL); + + if(type->icon_name == NULL || *(type->icon_name) == '\0') + return NULL; + + return type->icon_name; +} + +const char * +purple_attention_type_get_unlocalized_name(const PurpleAttentionType *type) +{ + g_return_val_if_fail(type != NULL, NULL); + + return type->unlocalized_name; +} + +/**************************************************************************/ /** @name Protocol Plugin API */ /**************************************************************************/ void diff -r f182cf94145c -r 00eaff9396ec libpurple/prpl.h --- a/libpurple/prpl.h Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/prpl.h Wed Feb 06 03:35:04 2008 +0000 @@ -99,9 +99,9 @@ const char *incoming_description; /**< Shown when sent */ const char *outgoing_description; /**< Shown when receied */ const char *icon_name; /**< Icon to display (optional) */ + const char *unlocalized_name; /**< Unlocalized name for UIs needing it */ /* Reserved fields for future purposes */ - gpointer _reserved1; gpointer _reserved2; gpointer _reserved3; gpointer _reserved4; @@ -412,6 +412,127 @@ #endif /**************************************************************************/ +/** @name Attention Type API */ +/**************************************************************************/ +/*@{*/ + +/** + * Creates a new #PurpleAttentionType object and sets its mandatory parameters. + * + * @param ulname A non-localized string that can be used by UIs in need of such + * non-localized strings. This should be the same as @a name, + * without localization. + * @param name A localized string that the UI may display for the event. This + * should be the same string as @a ulname, with localization. + * @param inc_desc A localized description shown when the event is received. + * @param out_desc A localized description shown when the event is sent. + * @return A pointer to the new object. + * @since 2.4.0 + */ +PurpleAttentionType *purple_attention_type_new(const char *ulname, const char *name, + const char *inc_desc, const char *out_desc); + +/** + * Sets the displayed name of the attention-demanding event. + * + * @param type The attention type. + * @param name The localized name that will be displayed by UIs. This should be + * the same string given as the unlocalized name, but with + * localization. + * @since 2.4.0 + */ +void purple_attention_type_set_name(PurpleAttentionType *type, const char *name); + +/** + * Sets the description of the attention-demanding event shown in conversations + * when the event is received. + * + * @param type The attention type. + * @param desc The localized description for incoming events. + * @since 2.4.0 + */ +void purple_attention_type_set_incoming_desc(PurpleAttentionType *type, const char *desc); + +/** + * Sets the description of the attention-demanding event shown in conversations + * when the event is sent. + * + * @param type The attention type. + * @param desc The localized description for outgoing events. + * @since 2.4.0 + */ +void purple_attention_type_set_outgoing_desc(PurpleAttentionType *type, const char *desc); + +/** + * Sets the name of the icon to display for the attention event; this is optional. + * + * @param type The attention type. + * @param name The icon's name. + * @note Icons are optional for attention events. + * @since 2.4.0 + */ +void purple_attention_type_set_icon_name(PurpleAttentionType *type, const char *name); + +/** + * Sets the unlocalized name of the attention event; some UIs may need this, + * thus it is required. + * + * @param type The attention type. + * @param ulname The unlocalized name. This should be the same string given as + * the localized name, but without localization. + * @since 2.4.0 + */ +void purple_attention_type_set_unlocalized_name(PurpleAttentionType *type, const char *ulname); + +/** + * Get the attention type's name as displayed by the UI. + * + * @param type The attention type. + * @return The name. + * @since 2.4.0 + */ +const char *purple_attention_type_get_name(const PurpleAttentionType *type); + +/** + * Get the attention type's description shown when the event is received. + * + * @param type The attention type. + * @return The description. + * @since 2.4.0 + */ +const char *purple_attention_type_get_incoming_desc(const PurpleAttentionType *type); + +/** + * Get the attention type's description shown when the event is sent. + * + * @param type The attention type. + * @return The description. + * @since 2.4.0 + */ +const char *purple_attention_type_get_outgoing_desc(const PurpleAttentionType *type); + +/** + * Get the attention type's icon name. + * + * @param type The attention type. + * @return The icon name or @c NULL if unset/empty. + * @note Icons are optional for attention events. + * @since 2.4.0 + */ +const char *purple_attention_type_get_icon_name(const PurpleAttentionType *type); + +/** + * Get the attention type's unlocalized name; this is useful for some UIs. + * + * @param type The attention type + * @return The unlocalized name. + * @since 2.4.0 + */ +const char *purple_attention_type_get_unlocalized_name(const PurpleAttentionType *type); + +/*@}*/ + +/**************************************************************************/ /** @name Protocol Plugin API */ /**************************************************************************/ /*@{*/ diff -r f182cf94145c -r 00eaff9396ec libpurple/purple-remote --- a/libpurple/purple-remote Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/purple-remote Wed Feb 06 03:35:04 2008 +0000 @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python import dbus import re diff -r f182cf94145c -r 00eaff9396ec libpurple/purple-send --- a/libpurple/purple-send Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/purple-send Wed Feb 06 03:35:04 2008 +0000 @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh METHOD_NAME=$1 diff -r f182cf94145c -r 00eaff9396ec libpurple/purple-send-async --- a/libpurple/purple-send-async Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/purple-send-async Wed Feb 06 03:35:04 2008 +0000 @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh METHOD_NAME=$1 diff -r f182cf94145c -r 00eaff9396ec libpurple/purple-url-handler --- a/libpurple/purple-url-handler Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/purple-url-handler Wed Feb 06 03:35:04 2008 +0000 @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python import dbus import re diff -r f182cf94145c -r 00eaff9396ec libpurple/request.h --- a/libpurple/request.h Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/request.h Wed Feb 06 03:35:04 2008 +0000 @@ -1318,6 +1318,8 @@ * @param secondary Secondary information, or @c NULL if there is none. * @param default_action The default action, zero-indexed; if the third action * supplied should be the default, supply 2. + * The should be the action that users are most likely + * to select. * @param account The #PurpleAccount associated with this request, or @c * NULL if none is. * @param who The username of the buddy associated with this request, @@ -1356,6 +1358,8 @@ * @param secondary Secondary information, or @c NULL if there is none. * @param default_action The default action, zero-indexed; if the third action * supplied should be the default, supply 2. + * The should be the action that users are most likely + * to select. * @param account The #PurpleAccount associated with this request, or @c * NULL if none is. * @param who The username of the buddy associated with this request, diff -r f182cf94145c -r 00eaff9396ec libpurple/roomlist.c --- a/libpurple/roomlist.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/roomlist.c Wed Feb 06 03:35:04 2008 +0000 @@ -169,20 +169,25 @@ PurpleRoomlist *purple_roomlist_get_list(PurpleConnection *gc) { + PurplePlugin *prpl = NULL; PurplePluginProtocolInfo *prpl_info = NULL; g_return_val_if_fail(gc != NULL, NULL); - if (gc->prpl != NULL) - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); + prpl = purple_connection_get_prpl(gc); - if (prpl_info && prpl_info->roomlist_get_list) + if(prpl != NULL) + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); + + if(prpl_info && prpl_info->roomlist_get_list) return prpl_info->roomlist_get_list(gc); + return NULL; } void purple_roomlist_cancel_get_list(PurpleRoomlist *list) { + PurplePlugin *prpl = NULL; PurplePluginProtocolInfo *prpl_info = NULL; PurpleConnection *gc; @@ -192,15 +197,19 @@ g_return_if_fail(gc != NULL); - if (gc != NULL && gc->prpl != NULL) - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); + if(gc) + prpl = purple_connection_get_prpl(gc); - if (prpl_info && prpl_info->roomlist_cancel) + if(prpl) + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); + + if(prpl_info && prpl_info->roomlist_cancel) prpl_info->roomlist_cancel(list); } void purple_roomlist_expand_category(PurpleRoomlist *list, PurpleRoomlistRoom *category) { + PurplePlugin *prpl = NULL; PurplePluginProtocolInfo *prpl_info = NULL; PurpleConnection *gc; @@ -211,13 +220,21 @@ gc = purple_account_get_connection(list->account); g_return_if_fail(gc != NULL); - if (gc->prpl != NULL) - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); + if(gc) + prpl = purple_connection_get_prpl(gc); + + if(prpl) + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); - if (prpl_info && prpl_info->roomlist_expand_category) + if(prpl_info && prpl_info->roomlist_expand_category) prpl_info->roomlist_expand_category(list, category); } +GList * purple_roomlist_get_fields(PurpleRoomlist *list) +{ + return list->fields; +} + /*@}*/ /**************************************************************************/ @@ -293,6 +310,26 @@ g_hash_table_destroy(components); } +PurpleRoomlistRoomType purple_roomlist_room_get_type(PurpleRoomlistRoom *room) +{ + return room->type; +} + +const char * purple_roomlist_room_get_name(PurpleRoomlistRoom *room) +{ + return room->name; +} + +PurpleRoomlistRoom * purple_roomlist_room_get_parent(PurpleRoomlistRoom *room) +{ + return room->parent; +} + +GList * purple_roomlist_room_get_fields(PurpleRoomlistRoom *room) +{ + return room->fields; +} + /*@}*/ /**************************************************************************/ @@ -319,6 +356,21 @@ return f; } +PurpleRoomlistFieldType purple_roomlist_field_get_type(PurpleRoomlistField *field) +{ + return field->type; +} + +const char * purple_roomlist_field_get_label(PurpleRoomlistField *field) +{ + return field->label; +} + +gboolean purple_roomlist_field_get_hidden(PurpleRoomlistField *field) +{ + return field->hidden; +} + /*@}*/ /**************************************************************************/ diff -r f182cf94145c -r 00eaff9396ec libpurple/roomlist.h --- a/libpurple/roomlist.h Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/roomlist.h Wed Feb 06 03:35:04 2008 +0000 @@ -237,6 +237,15 @@ */ void purple_roomlist_expand_category(PurpleRoomlist *list, PurpleRoomlistRoom *category); +/** + * Get the list of fields for a roomlist. + * + * @param roomlist The roomlist, which must not be @c NULL. + * @constreturn A list of fields + * @since 2.4.0 + */ +GList * purple_roomlist_get_fields(PurpleRoomlist *roomlist); + /*@}*/ /**************************************************************************/ @@ -273,6 +282,39 @@ */ void purple_roomlist_room_join(PurpleRoomlist *list, PurpleRoomlistRoom *room); +/** + * Get the type of a room. + * @param room The room, which must not be @c NULL. + * @return The type of the room. + * @since 2.4.0 + */ +PurpleRoomlistRoomType purple_roomlist_room_get_type(PurpleRoomlistRoom *room); + +/** + * Get the name of a room. + * @param room The room, which must not be @c NULL. + * @return The name of the room. + * @since 2.4.0 + */ +const char * purple_roomlist_room_get_name(PurpleRoomlistRoom *room); + +/** + * Get the parent of a room. + * @param room The room, which must not be @c NULL. + * @return The parent of the room, which can be @c NULL. + * @since 2.4.0 + */ +PurpleRoomlistRoom * purple_roomlist_room_get_parent(PurpleRoomlistRoom *room); + +/** + * Get the list of fields for a room. + * + * @param room The room, which must not be @c NULL. + * @constreturn A list of fields + * @since 2.4.0 + */ +GList * purple_roomlist_room_get_fields(PurpleRoomlistRoom *room); + /*@}*/ /**************************************************************************/ @@ -294,6 +336,36 @@ PurpleRoomlistField *purple_roomlist_field_new(PurpleRoomlistFieldType type, const gchar *label, const gchar *name, gboolean hidden); + +/** + * Get the type of a field. + * + * @param field A PurpleRoomlistField, which must not be @c NULL. + * + * @return The type of the field. + * @since 2.4.0 + */ +PurpleRoomlistFieldType purple_roomlist_field_get_type(PurpleRoomlistField *field); + +/** + * Get the label of a field. + * + * @param field A PurpleRoomlistField, which must not be @c NULL. + * + * @return The label of the field. + * @since 2.4.0 + */ +const char * purple_roomlist_field_get_label(PurpleRoomlistField *field); + +/** + * Check whether a roomlist-field is hidden. + * @param field A PurpleRoomlistField, which must not be @c NULL. + * + * @return @c TRUE if the field is hidden, @c FALSE otherwise. + * @since 2.4.0 + */ +gboolean purple_roomlist_field_get_hidden(PurpleRoomlistField *field); + /*@}*/ /**************************************************************************/ diff -r f182cf94145c -r 00eaff9396ec libpurple/savedstatuses.c --- a/libpurple/savedstatuses.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/savedstatuses.c Wed Feb 06 03:35:04 2008 +0000 @@ -190,7 +190,7 @@ * does the expiration. */ static void -remove_old_transient_statuses() +remove_old_transient_statuses(void) { GList *l, *next; PurpleSavedStatus *saved_status, *current_status; diff -r f182cf94145c -r 00eaff9396ec libpurple/server.c --- a/libpurple/server.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/server.c Wed Feb 06 03:35:04 2008 +0000 @@ -44,12 +44,16 @@ unsigned int serv_send_typing(PurpleConnection *gc, const char *name, PurpleTypingState state) { + PurplePlugin *prpl = NULL; PurplePluginProtocolInfo *prpl_info = NULL; - if (gc != NULL && gc->prpl != NULL) - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); + if(gc) + prpl = purple_connection_get_prpl(gc); - if (prpl_info && prpl_info->send_typing) + if(prpl) + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); + + if(prpl_info && prpl_info->send_typing) return prpl_info->send_typing(gc, name, state); return 0; @@ -117,24 +121,28 @@ int serv_send_im(PurpleConnection *gc, const char *name, const char *message, PurpleMessageFlags flags) { - PurpleConversation *conv; - PurpleAccount *account; - PurplePresence *presence; - PurplePluginProtocolInfo *prpl_info; + PurpleConversation *conv = NULL; + PurpleAccount *account = NULL; + PurplePresence *presence = NULL; + PurplePlugin *prpl = NULL; + PurplePluginProtocolInfo *prpl_info = NULL; int val = -EINVAL; - const gchar *auto_reply_pref; + const gchar *auto_reply_pref = NULL; g_return_val_if_fail(gc != NULL, val); - g_return_val_if_fail(gc->prpl != NULL, val); + + prpl = purple_connection_get_prpl(gc); - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); + g_return_val_if_fail(prpl != NULL, val); + + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); account = purple_connection_get_account(gc); presence = purple_account_get_presence(account); - conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, name, gc->account); + conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, name, account); - if (prpl_info && prpl_info->send_im) + if(prpl_info && prpl_info->send_im) val = prpl_info->send_im(gc, name, message, flags); /* @@ -142,7 +150,7 @@ * this only reset lar->sent if we're away AND idle? */ auto_reply_pref = purple_prefs_get_string("/purple/away/auto_reply"); - if ((gc->flags & PURPLE_CONNECTION_AUTO_RESP) && + if((gc->flags & PURPLE_CONNECTION_AUTO_RESP) && flags & PURPLE_MESSAGE_AUTO_RESP && !purple_presence_is_available(presence) && strcmp(auto_reply_pref, "never")) { @@ -152,7 +160,7 @@ lar->sent = time(NULL); } - if (conv && purple_conv_im_get_send_typed_timeout(PURPLE_CONV_IM(conv))) + if(conv && purple_conv_im_get_send_typed_timeout(PURPLE_CONV_IM(conv))) purple_conv_im_stop_send_typed_timeout(PURPLE_CONV_IM(conv)); return val; @@ -160,28 +168,36 @@ void serv_get_info(PurpleConnection *gc, const char *name) { + PurplePlugin *prpl = NULL; PurplePluginProtocolInfo *prpl_info = NULL; - if (gc != NULL && gc->prpl != NULL) - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); + if(gc) + prpl = purple_connection_get_prpl(gc); + + if(prpl) + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); - if (gc && prpl_info && prpl_info->get_info) + if(gc && prpl_info && prpl_info->get_info) prpl_info->get_info(gc, name); } void serv_set_info(PurpleConnection *gc, const char *info) { + PurplePlugin *prpl = NULL; PurplePluginProtocolInfo *prpl_info = NULL; - PurpleAccount *account; + PurpleAccount *account = NULL;; - if (gc != NULL && gc->prpl != NULL) - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); + if(gc) + prpl = purple_connection_get_prpl(gc); + + if(prpl) + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); - if (prpl_info && prpl_info->set_info) { + if(prpl_info && prpl_info->set_info) { account = purple_connection_get_account(gc); - if (purple_signal_emit_return_1(purple_accounts_get_handle(), + if(purple_signal_emit_return_1(purple_accounts_get_handle(), "account-setting-info", account, info)) return; @@ -197,30 +213,45 @@ */ void serv_alias_buddy(PurpleBuddy *b) { + PurpleAccount *account = NULL; + PurpleConnection *gc = NULL; + PurplePlugin *prpl = NULL; PurplePluginProtocolInfo *prpl_info = NULL; - if (b != NULL && b->account->gc && b->account->gc->prpl != NULL) - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(b->account->gc->prpl); + if(b) + account = purple_buddy_get_account(b); + + if(account) + gc = purple_account_get_connection(account); - if (b && prpl_info && prpl_info->alias_buddy) { - prpl_info->alias_buddy(b->account->gc, b->name, b->alias); + if(gc) + prpl = purple_connection_get_prpl(gc); + + if(prpl) + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); + + if(b && prpl_info && prpl_info->alias_buddy) { + prpl_info->alias_buddy(gc, b->name, b->alias); } } void serv_got_alias(PurpleConnection *gc, const char *who, const char *alias) { - PurpleAccount *account = purple_connection_get_account(gc); - GSList *buddies = purple_find_buddies(account, who); + PurpleAccount *account; + GSList *buddies; PurpleBuddy *b; PurpleConversation *conv; + account = purple_connection_get_account(gc); + buddies = purple_find_buddies(account, who); + while (buddies != NULL) { b = buddies->data; buddies = g_slist_delete_link(buddies, buddies); - if ((b->server_alias == NULL && alias == NULL) || + if((b->server_alias == NULL && alias == NULL) || (b->server_alias && alias && !strcmp(b->server_alias, alias))) { continue; @@ -229,7 +260,7 @@ purple_blist_server_alias_buddy(b, alias); conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, b->name, account); - if (conv != NULL && alias != NULL && strcmp(alias, who)) + if(conv != NULL && alias != NULL && strcmp(alias, who)) { char *tmp = g_strdup_printf(_("%s is now known as %s.\n"), who, alias); @@ -296,8 +327,8 @@ else alias = who; - if (attn && attn->outgoing_description) { - description = g_strdup_printf(attn->outgoing_description, alias); + if (attn && purple_attention_type_get_outgoing_desc(attn)) { + description = g_strdup_printf(purple_attention_type_get_outgoing_desc(attn), alias); } else { description = g_strdup_printf(_("Requesting %s's attention..."), alias); } @@ -341,8 +372,8 @@ else alias = who; - if (attn && attn->incoming_description) { - description = g_strdup_printf(attn->incoming_description, alias); + if (attn && purple_attention_type_get_incoming_desc(attn)) { + description = g_strdup_printf(purple_attention_type_get_incoming_desc(attn), alias); } else { description = g_strdup_printf(_("%s has requested your attention!"), alias); } @@ -367,72 +398,101 @@ */ void serv_move_buddy(PurpleBuddy *b, PurpleGroup *og, PurpleGroup *ng) { + PurpleAccount *account = NULL; + PurpleConnection *gc = NULL; + PurplePlugin *prpl = NULL; PurplePluginProtocolInfo *prpl_info = NULL; g_return_if_fail(b != NULL); g_return_if_fail(og != NULL); g_return_if_fail(ng != NULL); - if (b->account->gc != NULL && b->account->gc->prpl != NULL) - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(b->account->gc->prpl); + account = purple_buddy_get_account(b); + gc = purple_account_get_connection(account); + + if(gc) + prpl = purple_connection_get_prpl(gc); - if (b->account->gc && og && ng) { + if(prpl) + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); + + if(gc && og && ng) { if (prpl_info && prpl_info->group_buddy) { - prpl_info->group_buddy(b->account->gc, b->name, og->name, ng->name); + prpl_info->group_buddy(gc, b->name, og->name, ng->name); } } } -void serv_add_permit(PurpleConnection *g, const char *name) +void serv_add_permit(PurpleConnection *gc, const char *name) { + PurplePlugin *prpl = NULL; PurplePluginProtocolInfo *prpl_info = NULL; - if (g != NULL && g->prpl != NULL) - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(g->prpl); + if(gc) + prpl = purple_connection_get_prpl(gc); - if (prpl_info && prpl_info->add_permit) - prpl_info->add_permit(g, name); + if(prpl) + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); + + if(prpl_info && prpl_info->add_permit) + prpl_info->add_permit(gc, name); } -void serv_add_deny(PurpleConnection *g, const char *name) +void serv_add_deny(PurpleConnection *gc, const char *name) { + PurplePlugin *prpl = NULL; PurplePluginProtocolInfo *prpl_info = NULL; - if (g != NULL && g->prpl != NULL) - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(g->prpl); + if(gc) + prpl = purple_connection_get_prpl(gc); - if (prpl_info && prpl_info->add_deny) - prpl_info->add_deny(g, name); + if(prpl) + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); + + if(prpl_info && prpl_info->add_deny) + prpl_info->add_deny(gc, name); } -void serv_rem_permit(PurpleConnection *g, const char *name) +void serv_rem_permit(PurpleConnection *gc, const char *name) { + PurplePlugin *prpl = NULL; PurplePluginProtocolInfo *prpl_info = NULL; - if (g != NULL && g->prpl != NULL) - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(g->prpl); + if(gc) + prpl = purple_connection_get_prpl(gc); - if (prpl_info && prpl_info->rem_permit) - prpl_info->rem_permit(g, name); + if(prpl) + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); + + if(prpl_info && prpl_info->rem_permit) + prpl_info->rem_permit(gc, name); } -void serv_rem_deny(PurpleConnection *g, const char *name) +void serv_rem_deny(PurpleConnection *gc, const char *name) { + PurplePlugin *prpl = NULL; PurplePluginProtocolInfo *prpl_info = NULL; - if (g != NULL && g->prpl != NULL) - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(g->prpl); + if(gc) + prpl = purple_connection_get_prpl(gc); - if (prpl_info && prpl_info->rem_deny) - prpl_info->rem_deny(g, name); + if(prpl) + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); + + if(prpl_info && prpl_info->rem_deny) + prpl_info->rem_deny(gc, name); } -void serv_set_permit_deny(PurpleConnection *g) +void serv_set_permit_deny(PurpleConnection *gc) { + PurplePlugin *prpl = NULL; PurplePluginProtocolInfo *prpl_info = NULL; - if (g != NULL && g->prpl != NULL) - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(g->prpl); + if(gc) + prpl = purple_connection_get_prpl(gc); + + if(prpl) + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); /* * this is called when either you import a buddy list, and make lots @@ -440,52 +500,64 @@ * in the prefs. In either case you should probably be resetting and * resending the permit/deny info when you get this. */ - if (prpl_info && prpl_info->set_permit_deny) - prpl_info->set_permit_deny(g); + if(prpl_info && prpl_info->set_permit_deny) + prpl_info->set_permit_deny(gc); } -void serv_join_chat(PurpleConnection *g, GHashTable *data) +void serv_join_chat(PurpleConnection *gc, GHashTable *data) { + PurplePlugin *prpl = NULL; PurplePluginProtocolInfo *prpl_info = NULL; - if (g != NULL && g->prpl != NULL) - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(g->prpl); + if(gc) + prpl = purple_connection_get_prpl(gc); - if (prpl_info && prpl_info->join_chat) - prpl_info->join_chat(g, data); + if(prpl) + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); + + if(prpl_info && prpl_info->join_chat) + prpl_info->join_chat(gc, data); } -void serv_reject_chat(PurpleConnection *g, GHashTable *data) +void serv_reject_chat(PurpleConnection *gc, GHashTable *data) { + PurplePlugin *prpl = NULL; PurplePluginProtocolInfo *prpl_info = NULL; - if (g != NULL && g->prpl != NULL) - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(g->prpl); + if(gc) + prpl = purple_connection_get_prpl(gc); - if (prpl_info && prpl_info->reject_chat) - prpl_info->reject_chat(g, data); + if(prpl) + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); + + if(prpl_info && prpl_info->reject_chat) + prpl_info->reject_chat(gc, data); } -void serv_chat_invite(PurpleConnection *g, int id, const char *message, const char *name) +void serv_chat_invite(PurpleConnection *gc, int id, const char *message, const char *name) { + PurplePlugin *prpl = NULL; PurplePluginProtocolInfo *prpl_info = NULL; PurpleConversation *conv; char *buffy = message && *message ? g_strdup(message) : NULL; - conv = purple_find_chat(g, id); + conv = purple_find_chat(gc, id); - if (conv == NULL) + if(conv == NULL) return; - if (g != NULL && g->prpl != NULL) - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(g->prpl); + if(gc) + prpl = purple_connection_get_prpl(gc); + + if(prpl) + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); purple_signal_emit(purple_conversations_get_handle(), "chat-inviting-user", conv, name, &buffy); if (prpl_info && prpl_info->chat_invite) - prpl_info->chat_invite(g, id, buffy, name); + prpl_info->chat_invite(gc, id, buffy, name); purple_signal_emit(purple_conversations_get_handle(), "chat-invited-user", conv, name, buffy); @@ -499,37 +571,47 @@ * to leave a chat without destroying the conversation. */ -void serv_chat_leave(PurpleConnection *g, int id) +void serv_chat_leave(PurpleConnection *gc, int id) { + PurplePlugin *prpl = NULL; PurplePluginProtocolInfo *prpl_info = NULL; - if (g->prpl != NULL) - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(g->prpl); + prpl = purple_connection_get_prpl(gc); - if (prpl_info && prpl_info->chat_leave) - prpl_info->chat_leave(g, id); + if(prpl) + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); + + if(prpl_info && prpl_info->chat_leave) + prpl_info->chat_leave(gc, id); } -void serv_chat_whisper(PurpleConnection *g, int id, const char *who, const char *message) +void serv_chat_whisper(PurpleConnection *gc, int id, const char *who, const char *message) { + PurplePlugin *prpl = NULL; PurplePluginProtocolInfo *prpl_info = NULL; - if (g != NULL && g->prpl != NULL) - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(g->prpl); + if(gc) + prpl = purple_connection_get_prpl(gc); - if (prpl_info && prpl_info->chat_whisper) - prpl_info->chat_whisper(g, id, who, message); + if(prpl) + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); + + if(prpl_info && prpl_info->chat_whisper) + prpl_info->chat_whisper(gc, id, who, message); } int serv_chat_send(PurpleConnection *gc, int id, const char *message, PurpleMessageFlags flags) { int val = -EINVAL; + PurplePlugin *prpl = NULL; PurplePluginProtocolInfo *prpl_info = NULL; - if (gc->prpl != NULL) - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); + prpl = purple_connection_get_prpl(gc); - if (prpl_info && prpl_info->chat_send) + if(prpl) + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); + + if(prpl_info && prpl_info->chat_send) val = prpl_info->chat_send(gc, id, message, flags); return val; @@ -552,7 +634,7 @@ account = purple_connection_get_account(gc); - if (PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->set_permit_deny == NULL) { + if (PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc))->set_permit_deny == NULL) { /* protocol does not support privacy, handle it ourselves */ if (!purple_privacy_check(account, who)) return; @@ -772,7 +854,7 @@ int plugin_return; account = purple_connection_get_account(gc); - if (PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->set_permit_deny == NULL) { + if (PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc))->set_permit_deny == NULL) { /* protocol does not support privacy, handle it ourselves */ if (!purple_privacy_check(account, who)) return; @@ -920,10 +1002,14 @@ void serv_send_file(PurpleConnection *gc, const char *who, const char *file) { + PurplePlugin *prpl = NULL; PurplePluginProtocolInfo *prpl_info = NULL; - if (gc != NULL && gc->prpl != NULL) - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); + if(gc) + prpl = purple_connection_get_prpl(gc); + + if(prpl) + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); if (prpl_info && prpl_info->send_file) { if (!prpl_info->can_receive_file || prpl_info->can_receive_file(gc, who)) { diff -r f182cf94145c -r 00eaff9396ec libpurple/signals.h --- a/libpurple/signals.h Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/signals.h Wed Feb 06 03:35:04 2008 +0000 @@ -44,11 +44,24 @@ /**************************************************************************/ /*@{*/ -/** - * Signal Connect Priorities +/** The priority of a signal connected using purple_signal_connect(). + * + * @see purple_signal_connect_priority() */ #define PURPLE_SIGNAL_PRIORITY_DEFAULT 0 +/** The largest signal priority; signals with this priority will be called + * last. (This is highest as in numerical value, not as in order of + * importance.) + * + * @see purple_signal_connect_priority(). + */ #define PURPLE_SIGNAL_PRIORITY_HIGHEST 9999 +/** The smallest signal priority; signals with this priority will be called + * first. (This is lowest as in numerical value, not as in order of + * importance.) + * + * @see purple_signal_connect_priority(). + */ #define PURPLE_SIGNAL_PRIORITY_LOWEST -9999 /** @@ -109,19 +122,21 @@ * @param handle The handle of the receiver. * @param func The callback function. * @param data The data to pass to the callback function. - * @param priority The priority with which the handler should be called. Signal handlers are called - * in order from PURPLE_SIGNAL_PRIORITY_LOWEST to PURPLE_SIGNAL_PRIORITY_HIGHEST. + * @param priority The priority with which the handler should be called. Signal + * handlers are called in ascending numerical order of @a + * priority from #PURPLE_SIGNAL_PRIORITY_LOWEST to + * #PURPLE_SIGNAL_PRIORITY_HIGHEST. * * @return The signal handler ID. * * @see purple_signal_disconnect() */ gulong purple_signal_connect_priority(void *instance, const char *signal, - void *handle, PurpleCallback func, void *data, int priority); + void *handle, PurpleCallback func, void *data, int priority); /** * Connects a signal handler to a signal for a particular object. - * (priority defaults to 0) + * (Its priority defaults to 0, aka #PURPLE_SIGNAL_PRIORITY_DEFAULT.) * * Take care not to register a handler function twice. Purple will * not correct any mistakes for you in this area. @@ -137,7 +152,7 @@ * @see purple_signal_disconnect() */ gulong purple_signal_connect(void *instance, const char *signal, - void *handle, PurpleCallback func, void *data); + void *handle, PurpleCallback func, void *data); /** * Connects a signal handler to a signal for a particular object. @@ -153,18 +168,22 @@ * @param handle The handle of the receiver. * @param func The callback function. * @param data The data to pass to the callback function. - * @param priority The order in which the signal should be added to the list + * @param priority The priority with which the handler should be called. Signal + * handlers are called in ascending numerical order of @a + * priority from #PURPLE_SIGNAL_PRIORITY_LOWEST to + * #PURPLE_SIGNAL_PRIORITY_HIGHEST. * * @return The signal handler ID. * * @see purple_signal_disconnect() */ gulong purple_signal_connect_priority_vargs(void *instance, const char *signal, - void *handle, PurpleCallback func, void *data, int priority); + void *handle, PurpleCallback func, void *data, int priority); /** * Connects a signal handler to a signal for a particular object. - * (priority defaults to 0) + * (Its priority defaults to 0, aka #PURPLE_SIGNAL_PRIORITY_DEFAULT.) + * * The signal handler will take a va_args of arguments, instead of * individual arguments. * @@ -182,7 +201,7 @@ * @see purple_signal_disconnect() */ gulong purple_signal_connect_vargs(void *instance, const char *signal, - void *handle, PurpleCallback func, void *data); + void *handle, PurpleCallback func, void *data); /** * Disconnects a signal handler from a signal on an object. diff -r f182cf94145c -r 00eaff9396ec libpurple/status.c --- a/libpurple/status.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/status.c Wed Feb 06 03:35:04 2008 +0000 @@ -1310,7 +1310,8 @@ else if (purple_presence_get_context(presence) == PURPLE_PRESENCE_CONTEXT_ACCOUNT) { PurpleAccount *account; - PurpleConnection *gc; + PurpleConnection *gc = NULL; + PurplePlugin *prpl = NULL; PurplePluginProtocolInfo *prpl_info = NULL; account = purple_presence_get_account(presence); @@ -1339,9 +1340,11 @@ gc = purple_account_get_connection(account); - if (gc != NULL && PURPLE_CONNECTION_IS_CONNECTED(gc) && - gc->prpl != NULL) - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); + if(gc) + prpl = purple_connection_get_prpl(gc); + + if(PURPLE_CONNECTION_IS_CONNECTED(gc) && prpl != NULL) + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); if (prpl_info && prpl_info->set_idle) prpl_info->set_idle(gc, (idle ? (current_time - idle_time) : 0)); diff -r f182cf94145c -r 00eaff9396ec libpurple/stringref.c --- a/libpurple/stringref.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/stringref.c Wed Feb 06 03:35:04 2008 +0000 @@ -31,6 +31,7 @@ #include #include "debug.h" +#include "eventloop.h" #include "stringref.h" /** @@ -87,7 +88,7 @@ newref->ref = 0x80000000; if (gclist == NULL) - g_idle_add(gs_idle_cb, NULL); + purple_timeout_add(0, gs_idle_cb, NULL); gclist = g_list_prepend(gclist, newref); return newref; diff -r f182cf94145c -r 00eaff9396ec libpurple/stun.c --- a/libpurple/stun.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/stun.c Wed Feb 06 03:35:04 2008 +0000 @@ -104,7 +104,7 @@ g_free(sc); } -static void do_callbacks() { +static void do_callbacks(void) { while(callbacks) { StunCallback cb = callbacks->data; if(cb) diff -r f182cf94145c -r 00eaff9396ec libpurple/tests/test_util.c --- a/libpurple/tests/test_util.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/tests/test_util.c Wed Feb 06 03:35:04 2008 +0000 @@ -71,6 +71,14 @@ START_TEST(test_util_email_is_valid) { fail_unless(purple_email_is_valid("purple-devel@lists.sf.net")); + fail_if(purple_email_is_valid("purple-devel@@lists.sf.net")); + fail_if(purple_email_is_valid("purple@devel@lists.sf.net")); + fail_if(purple_email_is_valid("purple-devel@list..sf.net")); + fail_if(purple_email_is_valid("purple-devel")); + fail_if(purple_email_is_valid("purple-devel@")); + fail_if(purple_email_is_valid("@lists.sf.net")); + fail_if(purple_email_is_valid("")); + fail_if(purple_email_is_valid("totally bogus")); } END_TEST diff -r f182cf94145c -r 00eaff9396ec libpurple/upnp.c --- a/libpurple/upnp.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/upnp.c Wed Feb 06 03:35:04 2008 +0000 @@ -777,7 +777,7 @@ /* TODO: This could be exported */ static const gchar * -purple_upnp_get_internal_ip() +purple_upnp_get_internal_ip(void) { if (control_info.status == PURPLE_UPNP_STATUS_DISCOVERED && control_info.internalip diff -r f182cf94145c -r 00eaff9396ec libpurple/util.c --- a/libpurple/util.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/util.c Wed Feb 06 03:35:04 2008 +0000 @@ -1445,7 +1445,6 @@ ALLOW_TAG("pre"); ALLOW_TAG("q"); ALLOW_TAG("span"); - ALLOW_TAG("strong"); ALLOW_TAG("ul"); @@ -1465,9 +1464,14 @@ plain = g_string_append_c(plain, '\n'); continue; } - if(!g_ascii_strncasecmp(c, "", 3) || !g_ascii_strncasecmp(c, "", strlen(""))) { + if(!g_ascii_strncasecmp(c, "", 3) || !g_ascii_strncasecmp(c, "", strlen("")) || !g_ascii_strncasecmp(c, "", strlen(""))) { struct purple_parse_tag *pt = g_new0(struct purple_parse_tag, 1); - pt->src_tag = *(c+2) == '>' ? "b" : "bold"; + if (*(c+2) == '>') + pt->src_tag = "b"; + else if (*(c+2) == 'o') + pt->src_tag = "bold"; + else + pt->src_tag = "strong"; pt->dest_tag = "span"; tags = g_list_prepend(tags, pt); c = strchr(c, '>') + 1; @@ -4628,3 +4632,67 @@ #endif /* HAVE_SIGNAL_H */ #endif /* !_WIN32 */ } + +static void +set_status_with_attrs(PurpleStatus *status, ...) +{ + va_list args; + va_start(args, status); + purple_status_set_active_with_attrs(status, TRUE, args); + va_end(args); +} + +void purple_util_set_current_song(const char *title, const char *artist, const char *album) +{ + GList *list = purple_accounts_get_all(); + for (; list; list = list->next) { + PurplePresence *presence; + PurpleStatus *tune; + PurpleAccount *account = list->data; + if (!purple_account_get_enabled(account, purple_core_get_ui())) + continue; + + presence = purple_account_get_presence(account); + tune = purple_presence_get_status(presence, "tune"); + if (!tune) + continue; + if (title) { + set_status_with_attrs(tune, + PURPLE_TUNE_TITLE, title, + PURPLE_TUNE_ARTIST, artist, + PURPLE_TUNE_ALBUM, album, + NULL); + } else { + purple_status_set_active(tune, FALSE); + } + } +} + +char * purple_util_format_song_info(const char *title, const char *artist, const char *album, gpointer unused) +{ + GString *string; + char *esc; + + if (!title || !*title) + return NULL; + + esc = g_markup_escape_text(title, -1); + string = g_string_new(""); + g_string_append_printf(string, "%s", esc); + g_free(esc); + + if (artist && *artist) { + esc = g_markup_escape_text(artist, -1); + g_string_append_printf(string, _(" - %s"), esc); + g_free(esc); + } + + if (album && *album) { + esc = g_markup_escape_text(album, -1); + g_string_append_printf(string, _(" (%s)"), esc); + g_free(esc); + } + + return g_string_free(string, FALSE); +} + diff -r f182cf94145c -r 00eaff9396ec libpurple/util.h --- a/libpurple/util.h Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/util.h Wed Feb 06 03:35:04 2008 +0000 @@ -85,6 +85,31 @@ */ void purple_menu_action_free(PurpleMenuAction *act); +/** + * Set the appropriate presence values for the currently playing song. + * + * @param title The title of the song, @c NULL to unset the value. + * @param artist The artist of the song, can be @c NULL. + * @param album The album of the song, can be @c NULL. + * @since 2.4.0 + */ +void purple_util_set_current_song(const char *title, const char *artist, + const char *album); + +/** + * Format song information. + * + * @param title The title of the song, @c NULL to unset the value. + * @param artist The artist of the song, can be @c NULL. + * @param album The album of the song, can be @c NULL. + * @param unused Currently unused, must be @c NULL. + * + * @return The formatted string. The caller must #g_free the returned string. + * @since 2.4.0 + */ +char * purple_util_format_song_info(const char *title, const char *artist, + const char *album, gpointer unused); + /**************************************************************************/ /** @name Utility Subsystem */ /**************************************************************************/ diff -r f182cf94145c -r 00eaff9396ec libpurple/whiteboard.c --- a/libpurple/whiteboard.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/whiteboard.c Wed Feb 06 03:35:04 2008 +0000 @@ -59,7 +59,8 @@ wb->state = state; wb->who = g_strdup(who); - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(account->gc->prpl); + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl( + purple_account_get_connection(account))); purple_whiteboard_set_prpl_ops(wb, prpl_info->whiteboard_prpl_ops); /* Start up protocol specifics */ diff -r f182cf94145c -r 00eaff9396ec libpurple/xmlnode.c --- a/libpurple/xmlnode.c Sun Jan 13 00:29:56 2008 +0000 +++ b/libpurple/xmlnode.c Wed Feb 06 03:35:04 2008 +0000 @@ -552,6 +552,9 @@ g_strdup_printf("" NEWLINE_S NEWLINE_S "%s", xml); g_free(xml); + if (len) + *len += sizeof("" NEWLINE_S NEWLINE_S) - 1; + return xml_with_declaration; } diff -r f182cf94145c -r 00eaff9396ec pidgin/gtkaccount.c --- a/pidgin/gtkaccount.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/gtkaccount.c Wed Feb 06 03:35:04 2008 +0000 @@ -158,25 +158,7 @@ add_pref_box(AccountPrefsDialog *dialog, GtkWidget *parent, const char *text, GtkWidget *widget) { - GtkWidget *hbox; - GtkWidget *label; - - hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); - gtk_box_pack_start(GTK_BOX(parent), hbox, FALSE, FALSE, 0); - gtk_widget_show(hbox); - - label = gtk_label_new_with_mnemonic(text); - gtk_size_group_add_widget(dialog->sg, label); - gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); - gtk_label_set_mnemonic_widget(GTK_LABEL(label), widget); - gtk_widget_show(label); - - gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, PIDGIN_HIG_BORDER); - gtk_widget_show(widget); - pidgin_set_accessible_label (widget, label); - - return hbox; + return pidgin_add_widget_to_vbox(GTK_BOX(parent), text, dialog->sg, widget, TRUE, NULL); } static void @@ -259,7 +241,7 @@ gtk_widget_grab_focus(dialog->protocol_menu); - if (!dialog->prpl_info || !dialog->prpl_info->register_user || + if (!dialog->prpl_info || !dialog->prpl_info->register_user || g_object_get_data(G_OBJECT(item), "fake")) { gtk_widget_hide(dialog->register_button); } else { @@ -1759,16 +1741,14 @@ } } -static gint +static gboolean accedit_win_destroy_cb(GtkWidget *w, GdkEvent *event, AccountsWindow *dialog) { - /* Since this is called as the window is closing, we don't need - * pidgin_accounts_window_hide() to also dispose of the window */ dialog->window = NULL; pidgin_accounts_window_hide(); - return 0; + return FALSE; } static gboolean @@ -1853,7 +1833,8 @@ purple_account_get_username(account)); purple_request_close_with_handle(account); - purple_request_action(account, NULL, buf, NULL, 0, + purple_request_action(account, NULL, buf, NULL, + PURPLE_DEFAULT_ACTION_NONE, account, NULL, NULL, account, 2, _("Delete"), delete_account_cb, @@ -2102,24 +2083,24 @@ GtkTreeViewColumn *column; GtkTreeIter iter; PurpleAccount *account; - const gchar *title; dialog = (AccountsWindow *)user_data; + if (event->window != gtk_tree_view_get_bin_window(treeview)) + return FALSE; + /* Figure out which node was clicked */ if (!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(dialog->treeview), event->x, event->y, &path, &column, NULL, NULL)) return FALSE; - title = gtk_tree_view_column_get_title(column); - /* The -1 is required because the first two columns of the list - * store are displayed as only one column in the tree view. */ - column = gtk_tree_view_get_column(treeview, COLUMN_ENABLED-1); + if (column == gtk_tree_view_get_column(treeview, 0)) + return FALSE; + gtk_tree_model_get_iter(GTK_TREE_MODEL(dialog->model), &iter, path); gtk_tree_path_free(path); gtk_tree_model_get(GTK_TREE_MODEL(dialog->model), &iter, COLUMN_DATA, &account, -1); if ((account != NULL) && (event->button == 1) && - (event->type == GDK_2BUTTON_PRESS) && - (strcmp(gtk_tree_view_column_get_title(column), title))) + (event->type == GDK_2BUTTON_PRESS)) { pidgin_account_dialog_show(PIDGIN_MODIFY_ACCOUNT_DIALOG, account); return TRUE; @@ -2197,6 +2178,7 @@ treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(dialog->model)); dialog->treeview = treeview; gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(treeview), TRUE); + g_object_unref(G_OBJECT(dialog->model)); sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); gtk_tree_selection_set_mode(sel, GTK_SELECTION_MULTIPLE); @@ -2498,6 +2480,7 @@ _("Authorize"), authorize_and_add_cb, _("Deny"), deny_no_add_cb, NULL); + g_object_set_data(G_OBJECT(alert), "auth_and_add", aa); } else { alert = pidgin_make_mini_dialog(gc, PIDGIN_STOCK_DIALOG_QUESTION, _("Authorize buddy?"), buffer, user_data, @@ -2509,13 +2492,20 @@ g_free(buffer); - return NULL; + return alert; } static void pidgin_accounts_request_close(void *ui_handle) { - + /* This is super ugly, but without API changes, this is how it works */ + struct auth_and_add *aa = g_object_get_data(G_OBJECT(ui_handle), "auth_and_add"); + if (aa != NULL) { + g_free(aa->username); + g_free(aa->alias); + g_free(aa); + } + gtk_widget_destroy(GTK_WIDGET(ui_handle)); } static PurpleAccountUiOps ui_ops = diff -r f182cf94145c -r 00eaff9396ec pidgin/gtkblist.c --- a/pidgin/gtkblist.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/gtkblist.c Wed Feb 06 03:35:04 2008 +0000 @@ -177,7 +177,7 @@ } PidginBlistNode; static char dim_grey_string[8] = ""; -static char *dim_grey() +static char *dim_grey(void) { if (!gtkblist) return "dim grey"; @@ -708,12 +708,12 @@ pidgin_blist_update(purple_get_blist(), node); } -static void gtk_blist_show_systemlog_cb() +static void gtk_blist_show_systemlog_cb(void) { pidgin_syslog_show(); } -static void gtk_blist_show_onlinehelp_cb() +static void gtk_blist_show_onlinehelp_cb(void) { purple_notify_uri(NULL, PURPLE_WEBSITE "documentation"); } @@ -843,20 +843,10 @@ for (tmp = list; tmp; tmp = tmp->next) { - GtkWidget *label; - GtkWidget *rowbox; GtkWidget *input; pce = tmp->data; - rowbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER); - gtk_box_pack_start(GTK_BOX(data->entries_box), rowbox, FALSE, FALSE, 0); - - label = gtk_label_new_with_mnemonic(pce->label); - gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); - gtk_size_group_add_widget(data->sg, label); - gtk_box_pack_start(GTK_BOX(rowbox), label, FALSE, FALSE, 0); - if (pce->is_int) { GtkObject *adjust; @@ -864,7 +854,7 @@ 1, 10, 10); input = gtk_spin_button_new(GTK_ADJUSTMENT(adjust), 1, 0); gtk_widget_set_size_request(input, 50, -1); - gtk_box_pack_end(GTK_BOX(rowbox), input, FALSE, FALSE, 0); + pidgin_add_widget_to_vbox(GTK_BOX(data->entries_box), pce->label, data->sg, input, FALSE, NULL); } else { @@ -880,7 +870,7 @@ if (gtk_entry_get_invisible_char(GTK_ENTRY(input)) == '*') gtk_entry_set_invisible_char(GTK_ENTRY(input), PIDGIN_INVISIBLE_CHAR); } - gtk_box_pack_end(GTK_BOX(rowbox), input, TRUE, TRUE, 0); + pidgin_add_widget_to_vbox(GTK_BOX(data->entries_box), pce->label, data->sg, input, TRUE, NULL); g_signal_connect(G_OBJECT(input), "changed", G_CALLBACK(joinchat_set_sensitive_if_input_cb), data); } @@ -891,8 +881,6 @@ gtk_widget_grab_focus(input); focus = FALSE; } - gtk_label_set_mnemonic_widget(GTK_LABEL(label), input); - pidgin_set_accessible_label(input, label); g_object_set_data(G_OBJECT(input), "identifier", (gpointer)pce->identifier); g_object_set_data(G_OBJECT(input), "is_spin", GINT_TO_POINTER(pce->is_int)); g_object_set_data(G_OBJECT(input), "required", GINT_TO_POINTER(pce->required)); @@ -949,7 +937,6 @@ pidgin_blist_joinchat_show(void) { GtkWidget *hbox, *vbox; - GtkWidget *rowbox; GtkWidget *label; PidginBuddyList *gtkblist; GtkWidget *img = NULL; @@ -988,23 +975,13 @@ gtk_misc_set_alignment(GTK_MISC(label), 0, 0); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); - rowbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER); - gtk_box_pack_start(GTK_BOX(vbox), rowbox, TRUE, TRUE, 0); - data->sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); - label = gtk_label_new_with_mnemonic(_("_Account:")); - gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); - gtk_box_pack_start(GTK_BOX(rowbox), label, FALSE, FALSE, 0); - gtk_size_group_add_widget(data->sg, label); - data->account_menu = pidgin_account_option_menu_new(NULL, FALSE, G_CALLBACK(joinchat_select_account_cb), chat_account_filter_func, data); - gtk_box_pack_start(GTK_BOX(rowbox), data->account_menu, TRUE, TRUE, 0); - gtk_label_set_mnemonic_widget(GTK_LABEL(label), - GTK_WIDGET(data->account_menu)); - pidgin_set_accessible_label (data->account_menu, label); + + pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("_Account:"), data->sg, data->account_menu, TRUE, NULL); data->entries_box = gtk_vbox_new(FALSE, 5); gtk_container_add(GTK_CONTAINER(vbox), data->entries_box); @@ -1117,7 +1094,7 @@ } } -static void pidgin_blist_add_chat_cb() +static void pidgin_blist_add_chat_cb(void) { GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkblist->treeview)); GtkTreeIter iter; @@ -1137,7 +1114,7 @@ } } -static void pidgin_blist_add_buddy_cb() +static void pidgin_blist_add_buddy_cb(void) { GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkblist->treeview)); GtkTreeIter iter; @@ -2576,6 +2553,35 @@ int height; }; +static PangoLayout * create_pango_layout(const char *markup, int *width, int *height) +{ + PangoLayout *layout; + int w, h; + + layout = gtk_widget_create_pango_layout(gtkblist->tipwindow, NULL); + pango_layout_set_markup(layout, markup, -1); + pango_layout_set_wrap(layout, PANGO_WRAP_WORD); + pango_layout_set_width(layout, 300000); + + pango_layout_get_size (layout, &w, &h); + if (width) + *width = PANGO_PIXELS(w); + if (height) + *height = PANGO_PIXELS(h); + return layout; +} + +static struct tooltip_data * create_tip_for_account(PurpleAccount *account) +{ + struct tooltip_data *td = g_new0(struct tooltip_data, 1); + td->status_icon = pidgin_create_prpl_icon(account, PIDGIN_PRPL_ICON_SMALL); + /* Yes, status_icon, not prpl_icon */ + if (purple_account_is_disconnected(account)) + gdk_pixbuf_saturate_and_pixelate(td->status_icon, td->status_icon, 0.0, FALSE); + td->layout = create_pango_layout(purple_account_get_username(account), &td->width, &td->height); + return td; +} + static struct tooltip_data * create_tip_for_node(PurpleBlistNode *node, gboolean full) { struct tooltip_data *td = g_new0(struct tooltip_data, 1); @@ -2594,8 +2600,9 @@ td->prpl_icon = pidgin_create_prpl_icon(account, PIDGIN_PRPL_ICON_SMALL); } tooltip_text = pidgin_get_tooltip_text(node, full); - td->layout = gtk_widget_create_pango_layout(gtkblist->tipwindow, NULL); - td->name_layout = gtk_widget_create_pango_layout(gtkblist->tipwindow, NULL); + if (tooltip_text && *tooltip_text) { + td->layout = create_pango_layout(tooltip_text, &td->width, &td->height); + } if (PURPLE_BLIST_NODE_IS_BUDDY(node)) { tmp = g_markup_escape_text(purple_buddy_get_name((PurpleBuddy*)node), -1); @@ -2612,21 +2619,9 @@ node_name = g_strdup_printf("%s", tmp); g_free(tmp); - pango_layout_set_markup(td->layout, tooltip_text, -1); - pango_layout_set_wrap(td->layout, PANGO_WRAP_WORD); - pango_layout_set_width(td->layout, 300000); - - pango_layout_get_size (td->layout, &td->width, &td->height); - td->width = PANGO_PIXELS(td->width); - td->height = PANGO_PIXELS(td->height); - - pango_layout_set_markup(td->name_layout, node_name, -1); - pango_layout_set_wrap(td->name_layout, PANGO_WRAP_WORD); - pango_layout_set_width(td->name_layout, 300000); - - pango_layout_get_size (td->name_layout, &td->name_width, &td->name_height); - td->name_width = PANGO_PIXELS(td->name_width) + SMALL_SPACE + PRPL_SIZE; - td->name_height = MAX(PANGO_PIXELS(td->name_height), PRPL_SIZE + SMALL_SPACE); + td->name_layout = create_pango_layout(node_name, &td->name_width, &td->name_height); + td->name_width += SMALL_SPACE + PRPL_SIZE; + td->name_height = MAX(td->name_height, PRPL_SIZE + SMALL_SPACE); #if 0 /* PRPL Icon as avatar */ if(!td->avatar && full) { td->avatar = pidgin_create_prpl_icon(account, PIDGIN_PRPL_ICON_LARGE); @@ -2654,13 +2649,12 @@ GList *l; int prpl_col = 0; GtkTextDirection dir = gtk_widget_get_direction(widget); + int status_size = 0; if(gtkblist->tooltipdata == NULL) return FALSE; style = gtkblist->tipwindow->style; - gtk_paint_flat_box(style, gtkblist->tipwindow->window, GTK_STATE_NORMAL, GTK_SHADOW_OUT, - NULL, gtkblist->tipwindow, "tooltip", 0, 0, -1, -1); max_text_width = 0; max_avatar_width = 0; @@ -2672,13 +2666,15 @@ max_text_width = MAX(max_text_width, MAX(td->width, td->name_width)); max_avatar_width = MAX(max_avatar_width, td->avatar_width); - } - - max_width = TOOLTIP_BORDER + STATUS_SIZE + SMALL_SPACE + max_text_width + SMALL_SPACE + max_avatar_width + TOOLTIP_BORDER; + if (td->status_icon) + status_size = STATUS_SIZE; + } + + max_width = TOOLTIP_BORDER + status_size + SMALL_SPACE + max_text_width + SMALL_SPACE + max_avatar_width + TOOLTIP_BORDER; if (dir == GTK_TEXT_DIR_RTL) prpl_col = TOOLTIP_BORDER + max_avatar_width + SMALL_SPACE; else - prpl_col = TOOLTIP_BORDER + STATUS_SIZE + SMALL_SPACE + max_text_width - PRPL_SIZE; + prpl_col = TOOLTIP_BORDER + status_size + SMALL_SPACE + max_text_width - PRPL_SIZE; current_height = 12; for(l = gtkblist->tooltipdata; l; l = l->next) @@ -2702,11 +2698,12 @@ if (td->status_icon) { if (dir == GTK_TEXT_DIR_RTL) gdk_draw_pixbuf(GDK_DRAWABLE(gtkblist->tipwindow->window), NULL, td->status_icon, - 0, 0, max_width - TOOLTIP_BORDER - STATUS_SIZE, current_height, -1, -1, GDK_RGB_DITHER_NONE, 0, 0); + 0, 0, max_width - TOOLTIP_BORDER - status_size, current_height, -1, -1, GDK_RGB_DITHER_NONE, 0, 0); else gdk_draw_pixbuf(GDK_DRAWABLE(gtkblist->tipwindow->window), NULL, td->status_icon, 0, 0, TOOLTIP_BORDER, current_height, -1 , -1, GDK_RGB_DITHER_NONE, 0, 0); } + if(td->avatar) { if (dir == GTK_TEXT_DIR_RTL) gdk_draw_pixbuf(GDK_DRAWABLE(gtkblist->tipwindow->window), NULL, @@ -2717,7 +2714,7 @@ current_height, -1 , -1, GDK_RGB_DITHER_NONE, 0, 0); } - if (!td->avatar_is_prpl_icon) + if (!td->avatar_is_prpl_icon && td->prpl_icon) gdk_draw_pixbuf(GDK_DRAWABLE(gtkblist->tipwindow->window), NULL, td->prpl_icon, 0, 0, prpl_col, @@ -2734,26 +2731,31 @@ max_width - (td->avatar_width + TOOLTIP_BORDER), current_height, -1, -1, GDK_RGB_DITHER_NONE, 0, 0); #endif - if (dir == GTK_TEXT_DIR_RTL) { - gtk_paint_layout(style, gtkblist->tipwindow->window, GTK_STATE_NORMAL, FALSE, - NULL, gtkblist->tipwindow, "tooltip", - max_width -(TOOLTIP_BORDER + STATUS_SIZE +SMALL_SPACE) - PANGO_PIXELS(300000), - current_height, td->name_layout); - } else { - gtk_paint_layout (style, gtkblist->tipwindow->window, GTK_STATE_NORMAL, FALSE, - NULL, gtkblist->tipwindow, "tooltip", - TOOLTIP_BORDER + STATUS_SIZE + SMALL_SPACE, current_height, td->name_layout); + if (td->name_layout) { + if (dir == GTK_TEXT_DIR_RTL) { + gtk_paint_layout(style, gtkblist->tipwindow->window, GTK_STATE_NORMAL, FALSE, + NULL, gtkblist->tipwindow, "tooltip", + max_width -(TOOLTIP_BORDER + status_size + SMALL_SPACE) - PANGO_PIXELS(300000), + current_height, td->name_layout); + } else { + gtk_paint_layout (style, gtkblist->tipwindow->window, GTK_STATE_NORMAL, FALSE, + NULL, gtkblist->tipwindow, "tooltip", + TOOLTIP_BORDER + status_size + SMALL_SPACE, current_height, td->name_layout); + } } - if (dir != GTK_TEXT_DIR_RTL) { - gtk_paint_layout (style, gtkblist->tipwindow->window, GTK_STATE_NORMAL, FALSE, - NULL, gtkblist->tipwindow, "tooltip", - TOOLTIP_BORDER + STATUS_SIZE + SMALL_SPACE, current_height + td->name_height, td->layout); - } else { - gtk_paint_layout(style, gtkblist->tipwindow->window, GTK_STATE_NORMAL, FALSE, - NULL, gtkblist->tipwindow, "tooltip", - max_width - (TOOLTIP_BORDER + STATUS_SIZE + SMALL_SPACE) - PANGO_PIXELS(300000), - current_height + td->name_height, - td->layout); + + if (td->layout) { + if (dir != GTK_TEXT_DIR_RTL) { + gtk_paint_layout (style, gtkblist->tipwindow->window, GTK_STATE_NORMAL, FALSE, + NULL, gtkblist->tipwindow, "tooltip", + TOOLTIP_BORDER + status_size + SMALL_SPACE, current_height + td->name_height, td->layout); + } else { + gtk_paint_layout(style, gtkblist->tipwindow->window, GTK_STATE_NORMAL, FALSE, + NULL, gtkblist->tipwindow, "tooltip", + max_width - (TOOLTIP_BORDER + status_size + SMALL_SPACE) - PANGO_PIXELS(300000), + current_height + td->name_height, + td->layout); + } } current_height += MAX(td->name_height + td->height, td->avatar_height) + TOOLTIP_BORDER; @@ -2762,7 +2764,7 @@ } static void -pidgin_blist_destroy_tooltip_data() +pidgin_blist_destroy_tooltip_data(void) { while(gtkblist->tooltipdata) { struct tooltip_data *td = gtkblist->tooltipdata->data; @@ -2773,8 +2775,10 @@ g_object_unref(td->status_icon); if(td->prpl_icon) g_object_unref(td->prpl_icon); - g_object_unref(td->layout); - g_object_unref(td->name_layout); + if (td->layout) + g_object_unref(td->layout); + if (td->name_layout) + g_object_unref(td->name_layout); g_free(td); gtkblist->tooltipdata = g_list_delete_link(gtkblist->tooltipdata, gtkblist->tooltipdata); } @@ -2791,22 +2795,38 @@ { PurpleBlistNode *node = data; int width, height; + GList *list; + int max_text_width = 0; + int max_avatar_width = 0; + int status_size = 0; + + if (gtkblist->tooltipdata) { + gtkblist->tipwindow = NULL; + pidgin_blist_destroy_tooltip_data(); + } gtkblist->tipwindow = widget; - if(PURPLE_BLIST_NODE_IS_CHAT(node) || - PURPLE_BLIST_NODE_IS_BUDDY(node) || - PURPLE_BLIST_NODE_IS_GROUP(node)) { + if (PURPLE_BLIST_NODE_IS_CHAT(node) || + PURPLE_BLIST_NODE_IS_BUDDY(node)) { struct tooltip_data *td = create_tip_for_node(node, TRUE); gtkblist->tooltipdata = g_list_append(gtkblist->tooltipdata, td); - width = TOOLTIP_BORDER + STATUS_SIZE + SMALL_SPACE + - MAX(td->width, td->name_width) + SMALL_SPACE + td->avatar_width + TOOLTIP_BORDER; - height = TOOLTIP_BORDER + MAX(td->height + td->name_height, MAX(STATUS_SIZE, td->avatar_height)) - + TOOLTIP_BORDER; - } else if(PURPLE_BLIST_NODE_IS_CONTACT(node)) { + } else if (PURPLE_BLIST_NODE_IS_GROUP(node)) { + PurpleGroup *group = (PurpleGroup*)node; + GSList *accounts; + struct tooltip_data *td = create_tip_for_node(node, TRUE); + gtkblist->tooltipdata = g_list_append(gtkblist->tooltipdata, td); + + /* Accounts with buddies in group */ + accounts = purple_group_get_accounts(group); + for (; accounts != NULL; + accounts = g_slist_delete_link(accounts, accounts)) { + PurpleAccount *account = accounts->data; + td = create_tip_for_account(account); + gtkblist->tooltipdata = g_list_append(gtkblist->tooltipdata, td); + } + } else if (PURPLE_BLIST_NODE_IS_CONTACT(node)) { PurpleBlistNode *child; PurpleBuddy *b = purple_contact_get_priority_buddy((PurpleContact *)node); - int max_text_width = 0; - int max_avatar_width = 0; width = height = 0; for(child = node->child; child; child = child->next) @@ -2818,18 +2838,25 @@ } else { gtkblist->tooltipdata = g_list_append(gtkblist->tooltipdata, td); } - max_text_width = MAX(max_text_width, MAX(td->width, td->name_width)); - max_avatar_width = MAX(max_avatar_width, td->avatar_width); - height += MAX(TOOLTIP_BORDER + MAX(STATUS_SIZE,td->avatar_height), - TOOLTIP_BORDER + td->height + td->name_height); } } - height += TOOLTIP_BORDER; - width = TOOLTIP_BORDER + STATUS_SIZE + SMALL_SPACE + max_text_width + SMALL_SPACE + max_avatar_width + TOOLTIP_BORDER; } else { return FALSE; } + height = width = 0; + for (list = gtkblist->tooltipdata; list; list = list->next) { + struct tooltip_data *td = list->data; + max_text_width = MAX(max_text_width, MAX(td->width, td->name_width)); + max_avatar_width = MAX(max_avatar_width, td->avatar_width); + height += MAX(TOOLTIP_BORDER + MAX(STATUS_SIZE, td->avatar_height), + TOOLTIP_BORDER + td->height + td->name_height); + if (td->status_icon) + status_size = MAX(status_size, STATUS_SIZE); + } + height += TOOLTIP_BORDER; + width = TOOLTIP_BORDER + status_size + SMALL_SPACE + max_text_width + SMALL_SPACE + max_avatar_width + TOOLTIP_BORDER; + if (w) *w = width; if (h) @@ -3096,7 +3123,7 @@ if (g_list_length(purple_connections_get_all()) > 1) { tmp = g_markup_escape_text(chat->account->username, -1); - g_string_append_printf(str, _("\nAccount: %s"), tmp); + g_string_append_printf(str, _("Account: %s"), tmp); g_free(tmp); } @@ -3289,7 +3316,6 @@ purple_notify_user_info_destroy(user_info); } else if (PURPLE_BLIST_NODE_IS_GROUP(node)) { - GSList *accounts; PurpleGroup *group = (PurpleGroup*)node; PurpleNotifyUserInfo *user_info; @@ -3309,14 +3335,6 @@ tmp); g_free(tmp); - /* Accounts with buddies in group */ - accounts = purple_group_get_accounts(group); - for (; accounts != NULL; - accounts = g_slist_delete_link(accounts, accounts)) { - PurpleAccount *account = accounts->data; - purple_notify_user_info_add_pair(user_info, _("Account"), purple_account_get_username(account)); - } - tmp = purple_notify_user_info_get_text_with_newline(user_info, "\n"); g_string_append(str, tmp); g_free(tmp); @@ -3746,7 +3764,7 @@ return text; } -static void pidgin_blist_restore_position() +static void pidgin_blist_restore_position(void) { int blist_x, blist_y, blist_width, blist_height; @@ -3893,7 +3911,7 @@ } static void -unseen_conv_menu() +unseen_conv_menu(void) { static GtkWidget *menu = NULL; GList *convs = NULL; @@ -4125,12 +4143,11 @@ static void pidgin_blist_new_list(PurpleBuddyList *blist) { PidginBuddyList *gtkblist; - PidginBuddyListPrivate *priv; gtkblist = g_new0(PidginBuddyList, 1); gtkblist->connection_errors = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, g_free); - gtkblist->priv = priv = g_new0(PidginBuddyListPrivate, 1); + gtkblist->priv = g_new0(PidginBuddyListPrivate, 1); blist->ui_data = gtkblist; } @@ -4179,7 +4196,8 @@ pidgin_blist_sort_method_set(purple_prefs_get_string(PIDGIN_PREFS_ROOT "/blist/sort_type")); } -static void _prefs_change_redo_list() +static void _prefs_change_redo_list(const char *name, PurplePrefType type, + gconstpointer val, gpointer data) { GtkTreeSelection *sel; GtkTreeIter iter; @@ -4849,6 +4867,9 @@ #endif gtk_tooltips_force_window (tooltips); +#if GTK_CHECK_VERSION(2, 12, 0) + gtk_widget_set_name (tooltips->tip_window, "gtk-tooltips"); +#endif gtk_widget_ensure_style (tooltips->tip_window); style = gtk_widget_get_style (tooltips->tip_window); @@ -5033,8 +5054,9 @@ gtk_label_set_line_wrap(GTK_LABEL(gtkblist->headline_label), TRUE); gtk_box_pack_start(GTK_BOX(gtkblist->headline_hbox), gtkblist->headline_image, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(gtkblist->headline_hbox), gtkblist->headline_label, TRUE, TRUE, 0); - g_signal_connect(gtkblist->headline_hbox, - "style-set", + g_signal_connect(gtkblist->headline_label, /* connecting on headline_hbox doesn't work, because + the signal is not emitted when theme is changed */ + "style-set", G_CALLBACK(headline_style_set), NULL); g_signal_connect (gtkblist->headline_hbox, @@ -6046,6 +6068,7 @@ gtkblist->timeout = 0; gtkblist->drag_timeout = 0; gtkblist->window = gtkblist->vbox = gtkblist->treeview = NULL; + g_object_unref(G_OBJECT(gtkblist->treemodel)); gtkblist->treemodel = NULL; g_object_unref(G_OBJECT(gtkblist->ift)); g_object_unref(G_OBJECT(gtkblist->empty_avatar)); @@ -6471,20 +6494,10 @@ for (tmp = list; tmp; tmp = tmp->next) { - GtkWidget *label; - GtkWidget *rowbox; GtkWidget *input; pce = tmp->data; - rowbox = gtk_hbox_new(FALSE, 5); - gtk_box_pack_start(GTK_BOX(data->entries_box), rowbox, FALSE, FALSE, 0); - - label = gtk_label_new_with_mnemonic(pce->label); - gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); - gtk_size_group_add_widget(data->sg, label); - gtk_box_pack_start(GTK_BOX(rowbox), label, FALSE, FALSE, 0); - if (pce->is_int) { GtkObject *adjust; @@ -6492,7 +6505,7 @@ 1, 10, 10); input = gtk_spin_button_new(GTK_ADJUSTMENT(adjust), 1, 0); gtk_widget_set_size_request(input, 50, -1); - gtk_box_pack_end(GTK_BOX(rowbox), input, FALSE, FALSE, 0); + pidgin_add_widget_to_vbox(GTK_BOX(data->entries_box), pce->label, data->sg, input, FALSE, NULL); } else { @@ -6508,7 +6521,7 @@ if (gtk_entry_get_invisible_char(GTK_ENTRY(input)) == '*') gtk_entry_set_invisible_char(GTK_ENTRY(input), PIDGIN_INVISIBLE_CHAR); } - gtk_box_pack_end(GTK_BOX(rowbox), input, TRUE, TRUE, 0); + pidgin_add_widget_to_vbox(GTK_BOX(data->entries_box), pce->label, data->sg, input, TRUE, NULL); g_signal_connect(G_OBJECT(input), "changed", G_CALLBACK(addchat_set_sensitive_if_input_cb), data); } @@ -6519,8 +6532,6 @@ gtk_widget_grab_focus(input); focus = FALSE; } - gtk_label_set_mnemonic_widget(GTK_LABEL(label), input); - pidgin_set_accessible_label(input, label); g_object_set_data(G_OBJECT(input), "identifier", (gpointer)pce->identifier); g_object_set_data(G_OBJECT(input), "is_spin", GINT_TO_POINTER(pce->is_int)); g_object_set_data(G_OBJECT(input), "required", GINT_TO_POINTER(pce->required)); @@ -6563,7 +6574,6 @@ GList *l; PurpleConnection *gc; GtkWidget *label; - GtkWidget *rowbox; GtkWidget *hbox; GtkWidget *vbox; GtkWidget *img; @@ -6639,20 +6649,10 @@ gtk_misc_set_alignment(GTK_MISC(label), 0, 0); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); - rowbox = gtk_hbox_new(FALSE, 5); - gtk_box_pack_start(GTK_BOX(vbox), rowbox, FALSE, FALSE, 0); - - label = gtk_label_new_with_mnemonic(_("_Account:")); - gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); - gtk_size_group_add_widget(data->sg, label); - gtk_box_pack_start(GTK_BOX(rowbox), label, FALSE, FALSE, 0); - data->account_menu = pidgin_account_option_menu_new(account, FALSE, G_CALLBACK(addchat_select_account_cb), chat_account_filter_func, data); - gtk_box_pack_start(GTK_BOX(rowbox), data->account_menu, TRUE, TRUE, 0); - gtk_label_set_mnemonic_widget(GTK_LABEL(label), data->account_menu); - pidgin_set_accessible_label (data->account_menu, label); + pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("_Account:"), data->sg, data->account_menu, TRUE, NULL); data->entries_box = gtk_vbox_new(FALSE, 5); gtk_container_set_border_width(GTK_CONTAINER(data->entries_box), 0); @@ -6660,36 +6660,17 @@ rebuild_addchat_entries(data); - rowbox = gtk_hbox_new(FALSE, 5); - gtk_box_pack_start(GTK_BOX(vbox), rowbox, FALSE, FALSE, 0); - - label = gtk_label_new_with_mnemonic(_("A_lias:")); - gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); - gtk_size_group_add_widget(data->sg, label); - gtk_box_pack_start(GTK_BOX(rowbox), label, FALSE, FALSE, 0); - data->alias_entry = gtk_entry_new(); if (alias != NULL) gtk_entry_set_text(GTK_ENTRY(data->alias_entry), alias); - gtk_box_pack_end(GTK_BOX(rowbox), data->alias_entry, TRUE, TRUE, 0); gtk_entry_set_activates_default(GTK_ENTRY(data->alias_entry), TRUE); - gtk_label_set_mnemonic_widget(GTK_LABEL(label), data->alias_entry); - pidgin_set_accessible_label (data->alias_entry, label); + + pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("A_lias:"), data->sg, data->alias_entry, TRUE, NULL); if (name != NULL) gtk_widget_grab_focus(data->alias_entry); - rowbox = gtk_hbox_new(FALSE, 5); - gtk_box_pack_start(GTK_BOX(vbox), rowbox, FALSE, FALSE, 0); - - label = gtk_label_new_with_mnemonic(_("_Group:")); - gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); - gtk_size_group_add_widget(data->sg, label); - gtk_box_pack_start(GTK_BOX(rowbox), label, FALSE, FALSE, 0); - data->group_combo = pidgin_text_combo_box_entry_new(group ? group->name : NULL, groups_tree()); - gtk_label_set_mnemonic_widget(GTK_LABEL(label), GTK_BIN(data->group_combo)->child); - pidgin_set_accessible_label (data->group_combo, label); - gtk_box_pack_end(GTK_BOX(rowbox), data->group_combo, TRUE, TRUE, 0); + pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("_Group:"), data->sg, data->group_combo, TRUE, NULL); data->autojoin = gtk_check_button_new_with_mnemonic(_("Auto_join when account becomes online.")); data->persistent = gtk_check_button_new_with_mnemonic(_("_Hide chat when the window is closed.")); @@ -6963,7 +6944,8 @@ pidgin_blist_update_sort_methods(); } -void pidgin_blist_sort_method_unreg(const char *id){ +void pidgin_blist_sort_method_unreg(const char *id) +{ GList *l = pidgin_blist_sort_methods; while(l) { @@ -6975,6 +6957,7 @@ g_free(method); break; } + l = l->next; } pidgin_blist_update_sort_methods(); } diff -r f182cf94145c -r 00eaff9396ec pidgin/gtkcertmgr.c --- a/pidgin/gtkcertmgr.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/gtkcertmgr.c Wed Feb 06 03:35:04 2008 +0000 @@ -84,10 +84,10 @@ GtkTreeView *listview = tpm_dat->listview; PurpleCertificatePool *tls_peers; GList *idlist, *l; - + GtkListStore *store = GTK_LIST_STORE( gtk_tree_view_get_model(GTK_TREE_VIEW(listview))); - + /* First, delete everything in the list */ gtk_list_store_clear(store); @@ -199,7 +199,7 @@ NULL, NULL, NULL, /* No account/who/conv*/ crt /* Pass cert instance to callback*/ ); - + g_free(default_hostname); } else { /* Errors! Oh no! */ @@ -235,7 +235,7 @@ PurpleCertificate *crt = (PurpleCertificate *) data; g_assert(filename); - + if (!purple_certificate_export(filename, crt)) { /* Errors! Oh no! */ /* TODO: Perhaps find a way to be specific about what just @@ -260,7 +260,7 @@ /* Pressing cancel just frees the duplicated certificate */ purple_certificate_destroy(crt); } - + static void tls_peers_mgmt_export_cb(GtkWidget *button, gpointer data) { @@ -293,7 +293,6 @@ } g_free(id); - /* TODO: inform user that it will be a PEM? */ purple_request_file(tpm_dat, _("PEM X.509 Certificate Export"), @@ -327,10 +326,10 @@ /* Now retrieve the certificate */ crt = purple_certificate_pool_retrieve(tpm_dat->tls_peers, id); g_return_if_fail(crt); - + /* Fire the notification */ purple_certificate_display_x509(crt); - + g_free(id); purple_certificate_destroy(crt); } @@ -350,7 +349,7 @@ g_free(id); } - + static void tls_peers_mgmt_delete_cb(GtkWidget *button, gpointer data) { @@ -370,17 +369,17 @@ /* Prompt to confirm deletion */ primary = g_strdup_printf( _("Really delete certificate for %s?"), id ); - + purple_request_yes_no(tpm_dat, _("Confirm certificate delete"), primary, NULL, /* Can this be NULL? */ - 2, /* NO is default action */ + 0, /* "yes" is the default action */ NULL, NULL, NULL, id, /* id ownership passed to callback */ tls_peers_mgmt_delete_confirm_cb, tls_peers_mgmt_delete_confirm_cb ); - + g_free(primary); - + } else { purple_debug_warning("gtkcertmgr/tls_peers_mgmt", "Delete clicked with no selection?\n"); @@ -393,6 +392,7 @@ { GtkWidget *bbox; GtkListStore *store; + GtkWidget *sw; /* This block of variables will end up in tpm_dat */ GtkTreeView *listview; @@ -406,10 +406,12 @@ /* Create a struct to store context information about this window */ tpm_dat = g_new0(tls_peers_mgmt_data, 1); - + tpm_dat->mgmt_widget = mgmt_widget = gtk_hbox_new(FALSE, /* Non-homogeneous */ - PIDGIN_HIG_BORDER); + PIDGIN_HIG_BOX_SPACE); + gtk_container_set_border_width(GTK_CONTAINER(mgmt_widget), + PIDGIN_HIG_BOX_SPACE); gtk_widget_show(mgmt_widget); /* Ensure that everything gets cleaned up when the dialog box @@ -417,12 +419,23 @@ g_signal_connect(G_OBJECT(mgmt_widget), "destroy", G_CALLBACK(tls_peers_mgmt_destroy), NULL); + /* Scrolled window */ + sw = gtk_scrolled_window_new(NULL,NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), + GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN); + gtk_box_pack_start(GTK_BOX(mgmt_widget), GTK_WIDGET(sw), + TRUE, TRUE, /* Take up lots of space */ + 0); + gtk_widget_show(GTK_WIDGET(sw)); + /* List view */ store = gtk_list_store_new(TPM_N_COLUMNS, G_TYPE_STRING); - + tpm_dat->listview = listview = GTK_TREE_VIEW(gtk_tree_view_new_with_model(GTK_TREE_MODEL(store))); - + g_object_unref(G_OBJECT(store)); + { GtkCellRenderer *renderer; GtkTreeViewColumn *column; @@ -430,7 +443,7 @@ /* Set up the display columns */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes( - "Hostname", + _("Hostname"), renderer, "text", TPM_HOSTNAME_COLUMN, NULL); @@ -439,11 +452,11 @@ gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store), TPM_HOSTNAME_COLUMN, GTK_SORT_ASCENDING); } - + /* Get the treeview selector into the struct */ tpm_dat->listselect = select = gtk_tree_view_get_selection(GTK_TREE_VIEW(listview)); - + /* Force the selection mode */ gtk_tree_selection_set_mode(select, GTK_SELECTION_SINGLE); @@ -451,20 +464,18 @@ something is selected */ g_signal_connect(G_OBJECT(select), "changed", G_CALLBACK(tls_peers_mgmt_select_chg_cb), NULL); - - gtk_box_pack_start(GTK_BOX(mgmt_widget), GTK_WIDGET(listview), - TRUE, TRUE, /* Take up lots of space */ - 0); /* TODO: this padding is wrong */ + + gtk_container_add(GTK_CONTAINER(sw), GTK_WIDGET(listview)); gtk_widget_show(GTK_WIDGET(listview)); /* Fill the list for the first time */ tls_peers_mgmt_repopulate_list(); - + /* Right-hand side controls box */ bbox = gtk_vbutton_box_new(); gtk_box_pack_end(GTK_BOX(mgmt_widget), bbox, FALSE, FALSE, /* Do not take up space */ - 0); /* TODO: this padding is probably wrong */ + 0); gtk_box_set_spacing(GTK_BOX(bbox), PIDGIN_HIG_BOX_SPACE); gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_START); gtk_widget_show(bbox); @@ -512,7 +523,7 @@ /* Bind us to the tls_peers pool */ tpm_dat->tls_peers = purple_certificate_find_pool("x509", "tls_peers"); - + /**** libpurple signals ****/ /* Respond to certificate add/remove by just reloading everything */ purple_signal_connect(tpm_dat->tls_peers, "certificate-stored", @@ -521,7 +532,7 @@ purple_signal_connect(tpm_dat->tls_peers, "certificate-deleted", tpm_dat, PURPLE_CALLBACK(tls_peers_mgmt_mod_cb), NULL); - + return mgmt_widget; } @@ -570,7 +581,7 @@ poollist = poollist->next ) { PurpleCertificatePool *pool = poollist->data; GList *l; - + purple_debug_info("gtkcertmgr", "Pool %s found for scheme %s -" "Enumerating certificates:\n", @@ -587,7 +598,7 @@ } /* poollist */ } - + /* If the manager is already open, bring it to the front */ if (certmgr_dialog != NULL) { gtk_window_present(GTK_WINDOW(certmgr_dialog->window)); @@ -606,7 +617,7 @@ g_signal_connect(G_OBJECT(win), "delete_event", G_CALLBACK(certmgr_close_cb), dlg); - + /* TODO: Retrieve the user-set window size and use it */ gtk_window_set_default_size(GTK_WINDOW(win), 400, 400); diff -r f182cf94145c -r 00eaff9396ec pidgin/gtkconn.c --- a/pidgin/gtkconn.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/gtkconn.c Wed Feb 06 03:35:04 2008 +0000 @@ -162,11 +162,6 @@ if (info != NULL) g_hash_table_remove(auto_reconns, account); - /* - * TODO: Do we really want to disable the account when it's - * disconnected by wants_to_die? This happens when you sign - * on from somewhere else, or when you enter an invalid password. - */ purple_account_set_enabled(account, PIDGIN_UI, FALSE); } @@ -182,7 +177,7 @@ } } -static void pidgin_connection_network_connected () +static void pidgin_connection_network_connected (void) { GList *list, *l; PidginBuddyList *gtkblist = pidgin_blist_get_default_gtk_blist(); @@ -201,7 +196,7 @@ g_list_free(list); } -static void pidgin_connection_network_disconnected () +static void pidgin_connection_network_disconnected (void) { GList *list, *l; PidginBuddyList *gtkblist = pidgin_blist_get_default_gtk_blist(); diff -r f182cf94145c -r 00eaff9396ec pidgin/gtkconv.c --- a/pidgin/gtkconv.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/gtkconv.c Wed Feb 06 03:35:04 2008 +0000 @@ -67,6 +67,7 @@ #include "gtkthemes.h" #include "gtkutils.h" #include "pidginstock.h" +#include "pidgintooltip.h" #include "gtknickcolors.h" @@ -164,12 +165,11 @@ static void focus_out_from_menubar(GtkWidget *wid, PidginWindow *win); static void pidgin_conv_tab_pack(PidginWindow *win, PidginConversation *gtkconv); static gboolean infopane_press_cb(GtkWidget *widget, GdkEventButton *e, PidginConversation *conv); -static gboolean pidgin_userlist_motion_cb (GtkWidget *w, GdkEventMotion *event, PidginConversation *gtkconv); -static gboolean pidgin_conv_leave_cb (GtkWidget *w, GdkEventCrossing *e, PidginConversation *gtkconv); static void hide_conv(PidginConversation *gtkconv, gboolean closetimer); static void pidgin_conv_set_position_size(PidginWindow *win, int x, int y, int width, int height); +static gboolean pidgin_conv_xy_to_right_infopane(PidginWindow *win, int x, int y); static GdkColor *get_nick_color(PidginConversation *gtkconv, const char *name) { static GdkColor col; @@ -442,6 +442,13 @@ cmdline = cmd + strlen(prefix); + if (strcmp(cmdline, "xyzzy") == 0) { + purple_conversation_write(conv, "", "Nothing happens", + PURPLE_MESSAGE_NO_LOG, time(NULL)); + g_free(cmd); + return TRUE; + } + gtk_text_iter_forward_chars(&start, g_utf8_strlen(prefix, -1)); gtk_text_buffer_get_end_iter(GTK_IMHTML(gtkconv->entry)->text_buffer, &end); markup = gtk_imhtml_get_markup_range(GTK_IMHTML(gtkconv->entry), &start, &end); @@ -1351,6 +1358,7 @@ PidginWindow *win = data; PurpleConversation *conv; gboolean logging; + PurpleBlistNode *node; conv = pidgin_conv_window_get_active_conversation(win); @@ -1361,6 +1369,8 @@ if (logging == purple_conversation_is_logging(conv)) return; + + node = get_conversation_blist_node(conv); if (logging) { @@ -1384,6 +1394,27 @@ /* Disable the logging second, so that the above message can be logged. */ purple_conversation_set_logging(conv, FALSE); } + + /* Save the setting IFF it's different than the pref. */ + switch (conv->type) + { + case PURPLE_CONV_TYPE_IM: + if (logging == purple_prefs_get_bool("/purple/logging/log_ims")) + purple_blist_node_remove_setting(node, "enable-logging"); + else + purple_blist_node_set_bool(node, "enable-logging", logging); + break; + + case PURPLE_CONV_TYPE_CHAT: + if (logging == purple_prefs_get_bool("/purple/logging/log_chats")) + purple_blist_node_remove_setting(node, "enable-logging"); + else + purple_blist_node_set_bool(node, "enable-logging", logging); + break; + + default: + break; + } } static void @@ -2421,7 +2452,6 @@ { PidginConversation *gtkconv; PidginWindow *win; - PurpleBuddy *b; GList *l; GdkPixbuf *status = NULL; GdkPixbuf *infopane_status = NULL; @@ -2434,13 +2464,18 @@ if (conv != gtkconv->active_conv) return; - status = pidgin_conv_get_tab_icon(conv, TRUE); infopane_status = pidgin_conv_get_tab_icon(conv, FALSE); - b = purple_find_buddy(conv->account, conv->name); - if (b) - emblem = pidgin_blist_get_emblem((PurpleBlistNode*)b); + if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { + PurpleBuddy *b = purple_find_buddy(conv->account, conv->name); + if (b) + emblem = pidgin_blist_get_emblem((PurpleBlistNode*)b); + } else { + PurpleChat *c = purple_blist_find_chat(conv->account, conv->name); + if (c) + emblem = pidgin_blist_get_emblem((PurpleBlistNode*)c); + } g_return_if_fail(status != NULL); @@ -3338,6 +3373,7 @@ } } +#if 0 static gboolean typing_animation(gpointer data) { PidginConversation *gtkconv = data; @@ -3376,6 +3412,7 @@ gtk_widget_show(gtkwin->menu.typing_icon); return TRUE; } +#endif static void update_typing_message(PidginConversation *gtkconv, const char *message) @@ -3392,9 +3429,14 @@ gtk_text_buffer_delete_mark(buffer, stmark); gtk_text_buffer_delete_mark(buffer, enmark); gtk_text_buffer_delete(buffer, &start, &end); - } else if (message && *message == '\n' && !*(message + 1)) + } else if (message && *message == '\n' && message[1] == ' ' && message[2] == '\0') message = NULL; +#ifdef RESERVE_LINE + if (!message) + message = "\n "; /* The blank space is required to avoid a GTK+/Pango bug */ +#endif + if (message) { GtkTextIter iter; gtk_text_buffer_get_end_iter(buffer, &iter); @@ -3411,8 +3453,6 @@ PidginWindow *gtkwin; PurpleConvIm *im = NULL; PurpleConversation *conv = gtkconv->active_conv; - char *stock_id; - const char *tooltip; char *message = NULL; gtkwin = gtkconv->win; @@ -3420,55 +3460,24 @@ if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) im = PURPLE_CONV_IM(conv); - if (gtkwin->menu.typing_icon) { - gtk_widget_hide(gtkwin->menu.typing_icon); - } - if (im == NULL) return; if (purple_conv_im_get_typing_state(im) == PURPLE_NOT_TYPING) { - if (gtkconv->u.im->typing_timer != 0) { - g_source_remove(gtkconv->u.im->typing_timer); - gtkconv->u.im->typing_timer = 0; - } - update_typing_message(gtkconv, "\n"); +#ifdef RESERVE_LINE + update_typing_message(gtkconv, NULL); +#else + update_typing_message(gtkconv, "\n "); +#endif return; } if (purple_conv_im_get_typing_state(im) == PURPLE_TYPING) { - if (gtkconv->u.im->typing_timer == 0) { - gtkconv->u.im->typing_timer = g_timeout_add(250, typing_animation, gtkconv); - } - stock_id = PIDGIN_STOCK_ANIMATION_TYPING1; - tooltip = _("User is typing..."); message = g_strdup_printf(_("\n%s is typing..."), purple_conversation_get_title(conv)); } else { - stock_id = PIDGIN_STOCK_ANIMATION_TYPING5; - tooltip = _("User has typed something and stopped"); - message = g_strdup_printf(_("\n%s has typed something and stopped"), purple_conversation_get_title(conv)); - if (gtkconv->u.im->typing_timer != 0) { - g_source_remove(gtkconv->u.im->typing_timer); - gtkconv->u.im->typing_timer = 0; - } - } - - if (gtkwin->menu.typing_icon == NULL) - { - gtkwin->menu.typing_icon = gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_MENU); - pidgin_menu_tray_append(PIDGIN_MENU_TRAY(gtkwin->menu.tray), - gtkwin->menu.typing_icon, - tooltip); - } - else - { - gtk_image_set_from_stock(GTK_IMAGE(gtkwin->menu.typing_icon), stock_id, GTK_ICON_SIZE_MENU); - pidgin_menu_tray_set_tooltip(PIDGIN_MENU_TRAY(gtkwin->menu.tray), - gtkwin->menu.typing_icon, - tooltip); - } - - gtk_widget_show(gtkwin->menu.typing_icon); + message = g_strdup_printf(_("\n%s has stopped typing"), purple_conversation_get_title(conv)); + } + update_typing_message(gtkconv, message); g_free(message); } @@ -4434,6 +4443,36 @@ } } +static gboolean +pidgin_conv_userlist_create_tooltip(GtkWidget *tipwindow, GtkTreePath *path, + gpointer userdata, int *w, int *h) +{ + PidginConversation *gtkconv = userdata; + GtkTreeIter iter; + GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkconv->u.chat->list)); + PurpleConversation *conv = gtkconv->active_conv; + PurpleBlistNode *node; + PurplePluginProtocolInfo *prpl_info; + PurpleAccount *account = purple_conversation_get_account(conv); + char *who = NULL; + + if (account->gc == NULL) + return FALSE; + + if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, path)) + return FALSE; + + gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, CHAT_USERS_NAME_COLUMN, &who, -1); + + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(account->gc->prpl); + node = (PurpleBlistNode*)(purple_find_buddy(conv->account, who)); + if (node && prpl_info && (prpl_info->options & OPT_PROTO_UNIQUE_CHATNAME)) + pidgin_blist_draw_tooltip(node, gtkconv->infopane); + + g_free(who); + return FALSE; +} + static void setup_chat_userlist(PidginConversation *gtkconv, GtkWidget *hpaned) { @@ -4488,14 +4527,13 @@ g_signal_connect(G_OBJECT(list), "button_press_event", G_CALLBACK(right_click_chat_cb), gtkconv); - g_signal_connect(G_OBJECT(list), "motion-notify-event", - G_CALLBACK(pidgin_userlist_motion_cb), gtkconv); - g_signal_connect(G_OBJECT(list), "leave-notify-event", - G_CALLBACK(pidgin_conv_leave_cb), gtkconv); g_signal_connect(G_OBJECT(list), "popup-menu", G_CALLBACK(gtkconv_chat_popup_menu_cb), gtkconv); g_signal_connect(G_OBJECT(lbox), "size-allocate", G_CALLBACK(lbox_size_allocate_cb), gtkconv); + pidgin_tooltip_setup_for_treeview(list, gtkconv, + pidgin_conv_userlist_create_tooltip, NULL); + rend = gtk_cell_renderer_text_new(); g_object_set(rend, "foreground-set", TRUE, @@ -4531,32 +4569,12 @@ gtk_container_add(GTK_CONTAINER(sw), list); } -/* Stuff used to display tooltips on the infopane */ -static struct { - int timeout; - PidginConversation *gtkconv; /* This is the Pidgin conversation that - triggered the tooltip */ - int userlistx; - int userlisty; -} tooltip; - -static void -reset_tooltip() -{ - if (tooltip.timeout != 0) { - g_source_remove(tooltip.timeout); - tooltip.timeout = 0; - } - tooltip.gtkconv = NULL; -} - static gboolean -pidgin_conv_tooltip_timeout(PidginConversation *gtkconv) +pidgin_conv_create_tooltip(GtkWidget *tipwindow, gpointer userdata, int *w, int *h) { PurpleBlistNode *node = NULL; PurpleConversation *conv; - - g_return_val_if_fail (tooltip.gtkconv == gtkconv, FALSE); + PidginConversation *gtkconv = userdata; conv = gtkconv->active_conv; if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) { @@ -4579,103 +4597,6 @@ return FALSE; } -static gboolean -pidgin_conv_leave_cb (GtkWidget *w, GdkEventCrossing *e, PidginConversation *gtkconv) -{ - pidgin_blist_tooltip_destroy(); - reset_tooltip(); - return FALSE; -} - -static gboolean -pidgin_conv_motion_cb (GtkWidget *infopane, GdkEventMotion *event, PidginConversation *gtkconv) -{ - int delay = purple_prefs_get_int(PIDGIN_PREFS_ROOT "/blist/tooltip_delay"); - - pidgin_blist_tooltip_destroy(); - if (delay == 0) - return FALSE; - - if (tooltip.timeout != 0) - g_source_remove(tooltip.timeout); - - tooltip.timeout = g_timeout_add(delay, (GSourceFunc)pidgin_conv_tooltip_timeout, gtkconv); - tooltip.gtkconv = gtkconv; - return FALSE; -} - -static gboolean -pidgin_userlist_tooltip_timeout(PidginConversation *gtkconv) -{ - PurplePluginProtocolInfo *prpl_info; - PurpleConversation *conv = gtkconv->active_conv; - PidginChatPane *gtkchat; - PurpleBlistNode *node = NULL; - PurpleAccount *account; - GtkTreePath *path; - GtkTreeIter iter; - GtkTreeModel *model; - GtkTreeViewColumn *column; - gchar *who; - int x, y; - - gtkchat = gtkconv->u.chat; - account = purple_conversation_get_account(conv); - - if (account->gc == NULL) - return FALSE; - - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(account->gc->prpl); - - model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list)); - - if (!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(gtkchat->list), - tooltip.userlistx, tooltip.userlisty, &path, &column, &x, &y)) - return FALSE; - - gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, path); - gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, CHAT_USERS_NAME_COLUMN, &who, -1); - - node = (PurpleBlistNode*)(purple_find_buddy(conv->account, who)); - if (node && prpl_info && (prpl_info->options & OPT_PROTO_UNIQUE_CHATNAME)) - pidgin_blist_draw_tooltip(node, gtkconv->infopane); - - g_free(who); - gtk_tree_path_free(path); - - - return FALSE; -} - -static gboolean -pidgin_userlist_motion_cb (GtkWidget *w, GdkEventMotion *event, PidginConversation *gtkconv) -{ - PurpleConversation *conv; - PurpleAccount *account; - int delay = purple_prefs_get_int(PIDGIN_PREFS_ROOT "/blist/tooltip_delay"); - - pidgin_blist_tooltip_destroy(); - if (delay == 0) - return FALSE; - - if (tooltip.timeout != 0) - g_source_remove(tooltip.timeout); - tooltip.timeout = 0; - - conv = gtkconv->active_conv; - account = purple_conversation_get_account(conv); - - if (account->gc == NULL) - return FALSE; - - tooltip.timeout = g_timeout_add(delay, (GSourceFunc)pidgin_userlist_tooltip_timeout, gtkconv); - tooltip.gtkconv = gtkconv; - tooltip.userlistx = event->x; - tooltip.userlisty = event->y; - - return FALSE; -} - static GtkWidget * setup_common_pane(PidginConversation *gtkconv) { @@ -4705,10 +4626,8 @@ g_signal_connect(G_OBJECT(event_box), "button-press-event", G_CALLBACK(infopane_press_cb), gtkconv); - g_signal_connect(G_OBJECT(event_box), "motion-notify-event", - G_CALLBACK(pidgin_conv_motion_cb), gtkconv); - g_signal_connect(G_OBJECT(event_box), "leave-notify-event", - G_CALLBACK(pidgin_conv_leave_cb), gtkconv); + pidgin_tooltip_setup_for_widget(event_box, gtkconv, + pidgin_conv_create_tooltip, NULL); gtkconv->infopane = gtk_cell_view_new(); gtkconv->infopane_model = gtk_list_store_new(CONV_NUM_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING, GDK_TYPE_PIXBUF, GDK_TYPE_PIXBUF); @@ -4998,6 +4917,7 @@ GtkWidget *pane = NULL; GtkWidget *tab_cont; PurpleBlistNode *convnode; + PurpleValue *value; if (conv_type == PURPLE_CONV_TYPE_IM && (gtkconv = pidgin_conv_find_gtkconv(conv))) { conv->ui_data = gtkconv; @@ -5070,7 +4990,7 @@ gtk_text_buffer_create_tag(GTK_IMHTML(gtkconv->imhtml)->text_buffer, "TYPING-NOTIFICATION", "foreground", "#888888", "justification", GTK_JUSTIFY_LEFT, /* XXX: RTL'ify */ - "weight", PANGO_WEIGHT_BOLD, + "weight", PANGO_WEIGHT_LIGHT, "scale", PANGO_SCALE_SMALL, NULL); @@ -5085,6 +5005,13 @@ if (convnode == NULL || !purple_blist_node_get_bool(convnode, "gtk-mute-sound")) gtkconv->make_sound = TRUE; + if (convnode != NULL && + (value = g_hash_table_lookup(convnode->settings, "enable-logging")) && + purple_value_get_type(value) == PURPLE_TYPE_BOOLEAN) + { + purple_conversation_set_logging(conv, purple_value_get_boolean(value)); + } + if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/show_formatting_toolbar")) gtk_widget_show(gtkconv->toolbar); else @@ -5214,9 +5141,6 @@ g_source_remove(gtkconv->attach.timer); } - if (tooltip.gtkconv == gtkconv) - reset_tooltip(); - g_free(gtkconv); } @@ -6652,7 +6576,7 @@ pango_attr_list_unref(list); } else gtk_label_set_attributes(GTK_LABEL(gtkconv->tab_label), NULL); - + if (pidgin_conv_window_is_active_conversation(conv)) update_typing_icon(gtkconv); @@ -6925,10 +6849,8 @@ GDK_POINTER_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK); g_signal_connect(G_OBJECT(event), "button-press-event", G_CALLBACK(icon_menu), gtkconv); - g_signal_connect(G_OBJECT(event), "motion-notify-event", - G_CALLBACK(pidgin_conv_motion_cb), gtkconv); - g_signal_connect(G_OBJECT(event), "leave-notify-event", - G_CALLBACK(pidgin_conv_leave_cb), gtkconv); + + pidgin_tooltip_setup_for_widget(event, gtkconv, pidgin_conv_create_tooltip, NULL); gtk_widget_show(event); gtkconv->u.im->icon = gtk_image_new_from_pixbuf(scale); @@ -6964,6 +6886,18 @@ gray_stuff_out(PIDGIN_CONVERSATION(conv)); } +static gboolean +pidgin_conv_xy_to_right_infopane(PidginWindow *win, int x, int y) +{ + gint pane_x, pane_y, x_rel; + PidginConversation *gtkconv; + + gdk_window_get_origin(win->notebook->window, &pane_x, &pane_y); + x_rel = x - pane_x; + gtkconv = pidgin_conv_window_get_active_gtkconv(win); + return (x_rel > gtkconv->infopane->allocation.x + gtkconv->infopane->allocation.width / 2); +} + int pidgin_conv_get_tab_at_xy(PidginWindow *win, int x, int y, gboolean *to_right) { @@ -6999,7 +6933,7 @@ tab = gtk_notebook_get_tab_label(GTK_NOTEBOOK(notebook), page); /* Make sure the tab is not hidden beyond an arrow */ - if (!GTK_WIDGET_DRAWABLE(tab)) + if (!GTK_WIDGET_DRAWABLE(tab) && gtk_notebook_get_show_tabs(notebook)) continue; if (horiz) { @@ -8258,7 +8192,6 @@ GtkWidget *tab; gint page_num; gboolean horiz_tabs = FALSE; - PidginConversation *gtkconv; gboolean to_right = FALSE; /* Get the window that the cursor is over. */ @@ -8272,20 +8205,27 @@ dest_notebook = GTK_NOTEBOOK(dest_win->notebook); - page_num = pidgin_conv_get_tab_at_xy(dest_win, - e->x_root, e->y_root, &to_right); - to_right = to_right && (win != dest_win); + if (gtk_notebook_get_show_tabs(dest_notebook)) { + page_num = pidgin_conv_get_tab_at_xy(dest_win, + e->x_root, e->y_root, &to_right); + to_right = to_right && (win != dest_win); + tab = pidgin_conv_window_get_gtkconv_at_index(dest_win, page_num)->tabby; + } else { + page_num = 0; + to_right = pidgin_conv_xy_to_right_infopane(dest_win, e->x_root, e->y_root); + tab = pidgin_conv_window_get_gtkconv_at_index(dest_win, page_num)->infopane; + } if (gtk_notebook_get_tab_pos(dest_notebook) == GTK_POS_TOP || gtk_notebook_get_tab_pos(dest_notebook) == GTK_POS_BOTTOM) { horiz_tabs = TRUE; } - gtkconv = pidgin_conv_window_get_gtkconv_at_index(dest_win, page_num); - tab = gtkconv->tabby; - if (gtk_notebook_get_show_tabs(dest_notebook) == FALSE) { - dnd_hints_show_relative(HINT_ARROW_DOWN, gtkconv->infopane, HINT_POSITION_CENTER, HINT_POSITION_TOP); - dnd_hints_show_relative(HINT_ARROW_UP, gtkconv->infopane, HINT_POSITION_CENTER, HINT_POSITION_BOTTOM); + if (gtk_notebook_get_show_tabs(dest_notebook) == FALSE && win == dest_win) + { + /* dragging a tab from a single-tabbed window over its own window */ + dnd_hints_hide_all(); + return TRUE; } else if (horiz_tabs) { if (((gpointer)win == (gpointer)dest_win && win->drag_tab < page_num) || to_right) { dnd_hints_show_relative(HINT_ARROW_DOWN, tab, HINT_POSITION_RIGHT, HINT_POSITION_TOP); @@ -8482,6 +8422,7 @@ notebook_release_cb(GtkWidget *widget, GdkEventButton *e, PidginWindow *win) { PidginWindow *dest_win; + GtkNotebook *dest_notebook; PurpleConversation *conv; PidginConversation *gtkconv; gint dest_page_num = 0; @@ -8557,9 +8498,16 @@ "conversation-dragging", win, dest_win); /* Get the destination page number. */ - if (!new_window) - dest_page_num = pidgin_conv_get_tab_at_xy(dest_win, - e->x_root, e->y_root, &to_right); + if (!new_window) { + dest_notebook = GTK_NOTEBOOK(dest_win->notebook); + if (gtk_notebook_get_show_tabs(dest_notebook)) { + dest_page_num = pidgin_conv_get_tab_at_xy(dest_win, + e->x_root, e->y_root, &to_right); + } else { + dest_page_num = 0; + to_right = pidgin_conv_xy_to_right_infopane(dest_win, e->x_root, e->y_root); + } + } gtkconv = pidgin_conv_window_get_gtkconv_at_index(win, win->drag_tab); @@ -8798,7 +8746,7 @@ PurpleConversation *conv = gtkconv->active_conv; const char *text = NULL; - if (!GTK_WIDGET_VISIBLE(gtkconv->tab_label)) { + if (!GTK_WIDGET_VISIBLE(gtkconv->infopane)) { /* There's already an entry for alias. Let's not create another one. */ return FALSE; } diff -r f182cf94145c -r 00eaff9396ec pidgin/gtkdebug.c --- a/pidgin/gtkdebug.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/gtkdebug.c Wed Feb 06 03:35:04 2008 +0000 @@ -686,13 +686,11 @@ width = purple_prefs_get_int(PIDGIN_PREFS_ROOT "/debug/width"); height = purple_prefs_get_int(PIDGIN_PREFS_ROOT "/debug/height"); - PIDGIN_DIALOG(win->window); + win->window = pidgin_create_dialog(_("Debug Window"), 0, "debug", TRUE); purple_debug_info("gtkdebug", "Setting dimensions to %d, %d\n", width, height); gtk_window_set_default_size(GTK_WINDOW(win->window), width, height); - gtk_window_set_role(GTK_WINDOW(win->window), "debug"); - gtk_window_set_title(GTK_WINDOW(win->window), _("Debug Window")); g_signal_connect(G_OBJECT(win->window), "delete_event", G_CALLBACK(debug_window_destroy), NULL); @@ -700,7 +698,7 @@ G_CALLBACK(configure_cb), win); handle = pidgin_debug_get_handle(); - + #ifdef HAVE_REGEX_H /* the list store for all the messages */ win->store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT); @@ -716,8 +714,7 @@ #endif /* HAVE_REGEX_H */ /* Setup the vbox */ - vbox = gtk_vbox_new(FALSE, 0); - gtk_container_add(GTK_CONTAINER(win->window), vbox); + vbox = pidgin_dialog_get_vbox(GTK_DIALOG(win->window)); if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/debug/toolbar")) { /* Setup our top button bar thingie. */ diff -r f182cf94145c -r 00eaff9396ec pidgin/gtkdialogs.c --- a/pidgin/gtkdialogs.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/gtkdialogs.c Wed Feb 06 03:35:04 2008 +0000 @@ -288,7 +288,7 @@ } } -static void destroy_about() +static void destroy_about(void) { if (about != NULL) gtk_widget_destroy(about); @@ -337,12 +337,10 @@ void pidgin_dialogs_about() { - GtkWidget *hbox; GtkWidget *vbox; GtkWidget *logo; GtkWidget *frame; GtkWidget *text; - GtkWidget *bbox; GtkWidget *button; GtkTextIter iter; GString *str; @@ -357,20 +355,12 @@ return; } - PIDGIN_DIALOG(about); tmp = g_strdup_printf(_("About %s"), PIDGIN_NAME); - gtk_window_set_title(GTK_WINDOW(about), tmp); + about = pidgin_create_dialog(tmp, PIDGIN_HIG_BORDER, "about", TRUE); g_free(tmp); - gtk_window_set_role(GTK_WINDOW(about), "about"); - gtk_window_set_resizable(GTK_WINDOW(about), TRUE); gtk_window_set_default_size(GTK_WINDOW(about), 340, 450); - hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER); - gtk_container_set_border_width(GTK_CONTAINER(hbox), PIDGIN_HIG_BORDER); - gtk_container_add(GTK_CONTAINER(about), hbox); - - vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER); - gtk_container_add(GTK_CONTAINER(hbox), vbox); + vbox = pidgin_dialog_get_vbox_with_properties(GTK_DIALOG(about), FALSE, PIDGIN_HIG_BORDER); /* Generate a logo with a version number */ logo = gtk_window_new(GTK_WINDOW_TOPLEVEL); @@ -709,15 +699,9 @@ gtk_text_buffer_place_cursor(gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)), &iter); /* Close Button */ - bbox = gtk_hbutton_box_new(); - gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END); - gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0); + button = pidgin_dialog_add_button(GTK_DIALOG(about), GTK_STOCK_CLOSE, + G_CALLBACK(destroy_about), about); - button = gtk_button_new_from_stock(GTK_STOCK_CLOSE); - gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); - - g_signal_connect_swapped(G_OBJECT(button), "clicked", - G_CALLBACK(destroy_about), G_OBJECT(about)); g_signal_connect(G_OBJECT(about), "destroy", G_CALLBACK(destroy_about), G_OBJECT(about)); diff -r f182cf94145c -r 00eaff9396ec pidgin/gtkdialogs.h --- a/pidgin/gtkdialogs.h Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/gtkdialogs.h Wed Feb 06 03:35:04 2008 +0000 @@ -54,11 +54,10 @@ /* Everything after this should probably be moved elsewhere */ -/** - * Our UI's identifier. - */ +#ifndef PIDGIN_DISABLE_DEPRECATED #define PIDGIN_DIALOG(x) x = gtk_window_new(GTK_WINDOW_TOPLEVEL); \ gtk_window_set_type_hint(GTK_WINDOW(x), GDK_WINDOW_TYPE_HINT_DIALOG) +#endif #define PIDGIN_WINDOW_ICONIFIED(x) (gdk_window_get_state(GTK_WIDGET(x)->window) & GDK_WINDOW_STATE_ICONIFIED) #endif /* _PIDGINDIALOGS_H_ */ diff -r f182cf94145c -r 00eaff9396ec pidgin/gtkdocklet-x11.c --- a/pidgin/gtkdocklet-x11.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/gtkdocklet-x11.c Wed Feb 06 03:35:04 2008 +0000 @@ -48,7 +48,7 @@ static void docklet_x11_create(gboolean); static gboolean -docklet_x11_recreate_cb() +docklet_x11_recreate_cb(gpointer data) { docklet_x11_create(TRUE); @@ -147,7 +147,7 @@ } static void -docklet_x11_blank_icon() +docklet_x11_blank_icon(void) { if (!blank_icon) { GtkIconSize size = GTK_ICON_SIZE_LARGE_TOOLBAR; @@ -205,7 +205,7 @@ #endif static void -docklet_x11_destroy() +docklet_x11_destroy(void) { g_return_if_fail(docklet != NULL); @@ -230,7 +230,7 @@ } static gboolean -docklet_x11_embed_timeout_cb() +docklet_x11_embed_timeout_cb(gpointer data) { /* The docklet was not embedded within the timeout. * Remove it as a visibility manager, but leave the plugin @@ -301,7 +301,7 @@ } static void -docklet_x11_create_ui_op() +docklet_x11_create_ui_op(void) { docklet_x11_create(FALSE); } diff -r f182cf94145c -r 00eaff9396ec pidgin/gtkdocklet.c --- a/pidgin/gtkdocklet.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/gtkdocklet.c Wed Feb 06 03:35:04 2008 +0000 @@ -62,7 +62,7 @@ * docklet status and utility functions **************************************************************************/ static gboolean -docklet_blink_icon() +docklet_blink_icon(gpointer data) { static gboolean blinked = FALSE; gboolean ret = FALSE; /* by default, don't keep blinking */ @@ -108,7 +108,7 @@ } static gboolean -docklet_update_status() +docklet_update_status(void) { GList *convs, *l; int count; @@ -219,7 +219,7 @@ } static gboolean -online_account_supports_chat() +online_account_supports_chat(void) { GList *c = NULL; c = purple_connections_get_all(); @@ -523,7 +523,7 @@ } static GtkWidget * -docklet_status_submenu() +docklet_status_submenu(void) { GtkWidget *submenu, *menuitem; GList *popular_statuses, *cur; @@ -667,7 +667,8 @@ } static void -docklet_menu() { +docklet_menu(void) +{ static GtkWidget *menu = NULL; GtkWidget *menuitem; diff -r f182cf94145c -r 00eaff9396ec pidgin/gtkft.c --- a/pidgin/gtkft.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/gtkft.c Wed Feb 06 03:35:04 2008 +0000 @@ -156,15 +156,15 @@ } if (time_remaining != NULL) { - if (purple_xfer_get_size(xfer) == 0) { - *time_remaining = g_strdup(_("Unknown")); - } - else if (purple_xfer_is_completed(xfer)) { + if (purple_xfer_is_completed(xfer)) { *time_remaining = g_strdup(_("Finished")); } else if (purple_xfer_is_canceled(xfer)) { *time_remaining = g_strdup(_("Canceled")); } + else if (purple_xfer_get_size(xfer) == 0 || (kb_sent > 0 && kbps == 0)) { + *time_remaining = g_strdup(_("Unknown")); + } else if (kb_sent <= 0) { *time_remaining = g_strdup(_("Waiting for transfer to begin")); } diff -r f182cf94145c -r 00eaff9396ec pidgin/gtkidle.c --- a/pidgin/gtkidle.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/gtkidle.c Wed Feb 06 03:35:04 2008 +0000 @@ -69,7 +69,7 @@ */ #if defined(USE_SCREENSAVER) || defined(HAVE_IOKIT) static time_t -pidgin_get_time_idle() +pidgin_get_time_idle(void) { # ifdef HAVE_IOKIT /* Query the IOKit API */ diff -r f182cf94145c -r 00eaff9396ec pidgin/gtkimhtml.c --- a/pidgin/gtkimhtml.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/gtkimhtml.c Wed Feb 06 03:35:04 2008 +0000 @@ -289,7 +289,7 @@ #endif static GtkSmileyTree* -gtk_smiley_tree_new () +gtk_smiley_tree_new (void) { return g_new0 (GtkSmileyTree, 1); } @@ -1455,6 +1455,9 @@ gtk_text_buffer_create_tag(imhtml->text_buffer, "SUP", "rise", 5000, NULL); gtk_text_buffer_create_tag(imhtml->text_buffer, "PRE", "family", "Monospace", NULL); gtk_text_buffer_create_tag(imhtml->text_buffer, "search", "background", "#22ff00", "weight", "bold", NULL); +#if GTK_CHECK_VERSION(2,10,10) + gtk_text_buffer_create_tag(imhtml->text_buffer, "comment", "invisible", FALSE, NULL); +#endif /* When hovering over a link, we show the hand cursor--elsewhere we show the plain ol' pointer cursor */ imhtml->hand_cursor = gdk_cursor_new (GDK_HAND2); @@ -2981,10 +2984,15 @@ gtk_text_buffer_insert(imhtml->text_buffer, iter, ws, wpos); +#if GTK_CHECK_VERSION(2,10,10) + wpos = g_snprintf (ws, len, "%s", tag); + gtk_text_buffer_insert_with_tags_by_name(imhtml->text_buffer, iter, ws, wpos, "comment", NULL); +#else if (imhtml->show_comments && !(options & GTK_IMHTML_NO_COMMENTS)) { wpos = g_snprintf (ws, len, "%s", tag); gtk_text_buffer_insert(imhtml->text_buffer, iter, ws, wpos); } +#endif ws[0] = '\0'; wpos = 0; /* NEW_BIT (NEW_COMMENT_BIT); */ @@ -3130,6 +3138,12 @@ void gtk_imhtml_show_comments (GtkIMHtml *imhtml, gboolean show) { +#if GTK_CHECK_VERSION(2,10,10) + GtkTextTag *tag; + tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(imhtml->text_buffer), "comment"); + if (tag) + g_object_set(G_OBJECT(tag), "invisible", !show, NULL); +#endif imhtml->show_comments = show; } @@ -4277,33 +4291,6 @@ g_object_unref(object); } -static void populate_popup_cb(GtkTextView *textview, GtkMenu *menu, gpointer nul) -{ - GtkWidget *mi, *img; - - mi = gtk_menu_item_new(); - gtk_widget_show(mi); - gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), mi); - - img = gtk_image_new_from_stock(GTK_STOCK_BOLD, GTK_ICON_SIZE_MENU); - mi = gtk_image_menu_item_new_with_mnemonic(_("_Font")); - gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi), img); - gtk_widget_show(mi); - gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), mi); - - img = gtk_image_new_from_stock(PIDGIN_STOCK_TOOLBAR_INSERT, GTK_ICON_SIZE_MENU); - mi = gtk_image_menu_item_new_with_mnemonic(_("_Insert")); - gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi), img); - gtk_widget_show(mi); - gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), mi); - - img = gtk_image_new_from_stock(PIDGIN_STOCK_TOOLBAR_SMILEY, GTK_ICON_SIZE_MENU); - mi = gtk_image_menu_item_new_with_mnemonic(_("S_mile!")); - gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi), img); - gtk_widget_show(mi); - gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), mi); -} - static void imhtml_toggle_bold(GtkIMHtml *imhtml) { GtkTextIter start, end; diff -r f182cf94145c -r 00eaff9396ec pidgin/gtkimhtmltoolbar.c --- a/pidgin/gtkimhtmltoolbar.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/gtkimhtmltoolbar.c Wed Feb 06 03:35:04 2008 +0000 @@ -709,10 +709,8 @@ smileys = smileys->next; } - PIDGIN_DIALOG(dialog); + dialog = pidgin_create_dialog(_("Smile!"), 0, "smiley_dialog", FALSE); - gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); - gtk_window_set_role(GTK_WINDOW(dialog), "smiley_dialog"); gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_MOUSE); if (unique_smileys != NULL) { @@ -769,18 +767,15 @@ } g_signal_connect(G_OBJECT(dialog), "key-press-event", (GCallback)smiley_dialog_input_cb, toolbar); - gtk_container_add(GTK_CONTAINER(dialog), smiley_table); + gtk_container_add(GTK_CONTAINER(pidgin_dialog_get_vbox(GTK_DIALOG(dialog))), smiley_table); gtk_widget_show(smiley_table); - gtk_container_set_border_width(GTK_CONTAINER(dialog), 5); - /* connect signals */ g_signal_connect(G_OBJECT(dialog), "delete_event", G_CALLBACK(close_smiley_dialog), toolbar); /* show everything */ - gtk_window_set_title(GTK_WINDOW(dialog), _("Smile!")); gtk_widget_show_all(dialog); gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(toolbar)))); @@ -1317,6 +1312,7 @@ gtk_box_pack_start(GTK_BOX(hbox), box, FALSE, FALSE, 0); g_object_set_data(G_OBJECT(hbox), "lean-view", box); + gtk_widget_show(box); purple_prefs_connect_callback(toolbar, PIDGIN_PREFS_ROOT "/conversations/toolbar/wide", imhtmltoolbar_view_pref_changed, toolbar); diff -r f182cf94145c -r 00eaff9396ec pidgin/gtklog.c --- a/pidgin/gtklog.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/gtklog.c Wed Feb 06 03:35:04 2008 +0000 @@ -139,7 +139,7 @@ { /* Searching for the same term acts as "Find Next" */ gtk_imhtml_search_find(GTK_IMHTML(lv->imhtml), lv->search); - return; + return; } pidgin_set_cursor(lv->window, GDK_WATCH); @@ -242,8 +242,8 @@ { if (!purple_log_delete((PurpleLog *)data[2])) { - purple_notify_error(NULL, NULL, "Log Deletion Failed", - "Check permissions and try again."); + purple_notify_error(NULL, NULL, _("Log Deletion Failed"), + _("Check permissions and try again.")); } else { @@ -321,7 +321,7 @@ data2[0] = lv->treestore; data2[1] = data[3]; /* iter */ data2[2] = log; - purple_request_action(lv, NULL, "Delete Log?", tmp, 0, + purple_request_action(lv, NULL, _("Delete Log?"), tmp, 0, NULL, NULL, NULL, data2, 2, _("Delete"), delete_log_cb, @@ -332,7 +332,7 @@ static void log_show_popup_menu(GtkWidget *treeview, GdkEventButton *event, gpointer *data) { GtkWidget *menu = gtk_menu_new(); - GtkWidget *menuitem = gtk_menu_item_new_with_label("Delete Log..."); + GtkWidget *menuitem = gtk_menu_item_new_with_label(_("Delete Log...")); if (!purple_log_is_deletable((PurpleLog *)data[1])) gtk_widget_set_sensitive(menuitem, FALSE); @@ -556,8 +556,13 @@ if (!purple_prefs_get_bool("/purple/logging/log_chats")) log_preferences = _("Chats will only be logged if the \"Log all chats\" preference is enabled."); } + g_free(ht->screenname); + g_free(ht); } + if(icon != NULL) + gtk_widget_destroy(icon); + purple_notify_info(NULL, title, _("No logs were found"), log_preferences); return NULL; } @@ -614,6 +619,7 @@ gtk_paned_add1(GTK_PANED(pane), sw); lv->treestore = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_POINTER); lv->treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (lv->treestore)); + g_object_unref(G_OBJECT(lv->treestore)); rend = gtk_cell_renderer_text_new(); col = gtk_tree_view_column_new_with_attributes ("time", rend, "markup", 0, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW(lv->treeview), col); @@ -730,18 +736,19 @@ } void pidgin_log_show_contact(PurpleContact *contact) { - struct log_viewer_hash_t *ht = g_new0(struct log_viewer_hash_t, 1); + struct log_viewer_hash_t *ht; PurpleBlistNode *child; PidginLogViewer *lv = NULL; GList *logs = NULL; GdkPixbuf *pixbuf; - GtkWidget *image = gtk_image_new(); + GtkWidget *image; const char *name = NULL; char *title; int total_log_size = 0; g_return_if_fail(contact != NULL); + ht = g_new0(struct log_viewer_hash_t, 1); ht->type = PURPLE_LOG_IM; ht->contact = contact; @@ -763,9 +770,16 @@ } logs = g_list_sort(logs, purple_log_compare); + image = gtk_image_new(); pixbuf = gtk_widget_render_icon(image, PIDGIN_STOCK_STATUS_PERSON, gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_SMALL), "GtkWindow"); - gtk_image_set_from_pixbuf(GTK_IMAGE(image), pixbuf); + if (pixbuf) { + gtk_image_set_from_pixbuf(GTK_IMAGE(image), pixbuf); + g_object_unref(pixbuf); + } else { + gtk_widget_destroy(image); + image = NULL; + } if (contact->alias != NULL) name = contact->alias; diff -r f182cf94145c -r 00eaff9396ec pidgin/gtkmain.c --- a/pidgin/gtkmain.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/gtkmain.c Wed Feb 06 03:35:04 2008 +0000 @@ -174,7 +174,7 @@ * be wise to move this code into gtksound.c. */ static void -clean_pid() +clean_pid(void) { int status; pid_t pid; @@ -241,7 +241,7 @@ #endif static int -ui_main() +ui_main(void) { #ifndef _WIN32 GList *icons = NULL; @@ -359,7 +359,7 @@ gtk_main_quit(); } -static GHashTable *pidgin_ui_get_info() +static GHashTable *pidgin_ui_get_info(void) { if(NULL == ui_info) { ui_info = g_hash_table_new(g_str_hash, g_str_equal); @@ -508,6 +508,7 @@ {"session", required_argument, NULL, 's'}, {"version", no_argument, NULL, 'v'}, {"display", required_argument, NULL, 'D'}, + {"sync", no_argument, NULL, 'S'}, {0, 0, 0, 0} }; @@ -517,7 +518,7 @@ debug_enabled = FALSE; #endif - /* This is the first Glib function call. Make sure to initialize GThread bfeore then */ + /* Initialize GThread before calling any Glib or GTK+ functions. */ g_thread_init(NULL); #ifdef ENABLE_NLS @@ -654,6 +655,7 @@ opt_si = FALSE; break; case 'D': /* --display */ + case 'S': /* --sync */ /* handled by gtk_init_check below */ break; case '?': /* show terse help */ diff -r f182cf94145c -r 00eaff9396ec pidgin/gtknotify.c --- a/pidgin/gtknotify.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/gtknotify.c Wed Feb 06 03:35:04 2008 +0000 @@ -332,7 +332,7 @@ } static GtkWidget * -pidgin_get_mail_dialog() +pidgin_get_mail_dialog(void) { if (mail_dialog == NULL) { GtkWidget *dialog = NULL; @@ -379,6 +379,7 @@ mail_dialog->treemodel = gtk_tree_store_new(COLUMNS_PIDGIN_MAIL, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_POINTER); mail_dialog->treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(mail_dialog->treemodel)); + g_object_unref(G_OBJECT(mail_dialog->treemodel)); gtk_tree_view_set_search_column(GTK_TREE_VIEW(mail_dialog->treeview), PIDGIN_MAIL_TEXT); gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(mail_dialog->treeview), pidgin_tree_view_search_equal_func, NULL, NULL); @@ -604,7 +605,7 @@ } static GtkIMHtmlOptions -notify_imhtml_options() +notify_imhtml_options(void) { GtkIMHtmlOptions options = 0; @@ -818,6 +819,7 @@ /* Setup the treeview */ treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model)); + g_object_unref(G_OBJECT(model)); gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(treeview), TRUE); gtk_widget_set_size_request(treeview, 500, 400); gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)), @@ -1056,7 +1058,12 @@ /* if they are running gnome, use the gnome web browser */ if (purple_running_gnome() == TRUE) { - command = g_strdup_printf("gnome-open %s", escaped); + char *tmp = g_find_program_in_path("xdg-open"); + if (tmp == NULL) + command = g_strdup_printf("gnome-open %s", escaped); + else + command = g_strdup_printf("xdg-open %s", escaped); + g_free(tmp); } else if (purple_running_osx() == TRUE) { @@ -1072,6 +1079,10 @@ else command = g_strdup_printf("%s %s", web_browser, escaped); } + else if (!strcmp(web_browser, "xdg-open")) + { + command = g_strdup_printf("xdg-open %s", escaped); + } else if (!strcmp(web_browser, "gnome-open")) { command = g_strdup_printf("gnome-open %s", escaped); diff -r f182cf94145c -r 00eaff9396ec pidgin/gtkplugin.c --- a/pidgin/gtkplugin.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/gtkplugin.c Wed Feb 06 03:35:04 2008 +0000 @@ -31,6 +31,7 @@ #include "debug.h" #include "prefs.h" #include "request.h" +#include "pidgintooltip.h" #include @@ -531,6 +532,58 @@ plugin_dialog_response_cb(dialog, PIDGIN_RESPONSE_CONFIGURE, sel); } +static gboolean +pidgin_plugins_paint_tooltip(GtkWidget *tipwindow, gpointer data) +{ + PangoLayout *layout = g_object_get_data(G_OBJECT(tipwindow), "tooltip-plugin"); + gtk_paint_layout(tipwindow->style, tipwindow->window, GTK_STATE_NORMAL, FALSE, + NULL, tipwindow, "tooltip", + 6, 6, layout); + return TRUE; +} + +static gboolean +pidgin_plugins_create_tooltip(GtkWidget *tipwindow, GtkTreePath *path, + gpointer data, int *w, int *h) +{ + GtkTreeIter iter; + GtkTreeView *treeview = GTK_TREE_VIEW(data); + PurplePlugin *plugin = NULL; + GtkTreeModel *model = gtk_tree_view_get_model(treeview); + PangoLayout *layout; + int width, height; + char *markup, *name, *desc, *author; + + if (!gtk_tree_model_get_iter(model, &iter, path)) + return FALSE; + + gtk_tree_model_get(model, &iter, 2, &plugin, -1); + + markup = g_strdup_printf("%s\nDescription: %s\nAuthor: %s", + name = g_markup_escape_text(purple_plugin_get_name(plugin), -1), + desc = g_markup_escape_text(purple_plugin_get_description(plugin), -1), + author = g_markup_escape_text(purple_plugin_get_author(plugin), -1)); + + layout = gtk_widget_create_pango_layout(tipwindow, NULL); + pango_layout_set_markup(layout, markup, -1); + pango_layout_set_wrap(layout, PANGO_WRAP_WORD); + pango_layout_set_width(layout, 600000); + pango_layout_get_size(layout, &width, &height); + g_object_set_data_full(G_OBJECT(tipwindow), "tooltip-plugin", layout, g_object_unref); + + if (w) + *w = PANGO_PIXELS(width) + 12; + if (h) + *h = PANGO_PIXELS(height) + 12; + + g_free(markup); + g_free(name); + g_free(desc); + g_free(author); + + return TRUE; +} + void pidgin_plugin_dialog_show() { GtkWidget *sw; @@ -613,6 +666,10 @@ gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(event_view), pidgin_tree_view_search_equal_func, NULL, NULL); + pidgin_tooltip_setup_for_treeview(event_view, event_view, + pidgin_plugins_create_tooltip, + pidgin_plugins_paint_tooltip); + expander = gtk_expander_new(_("Plugin Details")); gtk_expander_set_use_markup(GTK_EXPANDER(expander), TRUE); plugin_details = gtk_label_new(NULL); diff -r f182cf94145c -r 00eaff9396ec pidgin/gtkpluginpref.c --- a/pidgin/gtkpluginpref.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/gtkpluginpref.c Wed Feb 06 03:35:04 2008 +0000 @@ -93,22 +93,6 @@ case PURPLE_PLUGIN_PREF_NONE: default: if (format == PURPLE_STRING_FORMAT_TYPE_NONE) - box = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); - else - box = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); - - gtk_widget_show(box); - gtk_box_pack_start(GTK_BOX(parent), box, FALSE, FALSE, 0); - - gtk_label = gtk_label_new_with_mnemonic(pref_label); - gtk_misc_set_alignment(GTK_MISC(gtk_label), 0, 0.5); - gtk_widget_show(gtk_label); - gtk_box_pack_start(GTK_BOX(box), gtk_label, FALSE, FALSE, 0); - - if(sg) - gtk_size_group_add_widget(sg, gtk_label); - - if (format == PURPLE_STRING_FORMAT_TYPE_NONE) { entry = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(entry), purple_prefs_get_string(pref_name)); @@ -123,9 +107,7 @@ g_signal_connect(G_OBJECT(entry), "changed", G_CALLBACK(entry_cb), (gpointer)pref_name); - gtk_label_set_mnemonic_widget(GTK_LABEL(gtk_label), entry); - gtk_widget_show(entry); - gtk_box_pack_start(GTK_BOX(box), entry, FALSE, FALSE, 0); + pidgin_add_widget_to_vbox(GTK_BOX(parent), pref_label, sg, entry, TRUE, NULL); } else { @@ -135,6 +117,19 @@ GtkWidget *toolbar; GtkWidget *frame; + box = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); + + gtk_widget_show(box); + gtk_box_pack_start(GTK_BOX(parent), box, FALSE, FALSE, 0); + + gtk_label = gtk_label_new_with_mnemonic(pref_label); + gtk_misc_set_alignment(GTK_MISC(gtk_label), 0, 0.5); + gtk_widget_show(gtk_label); + gtk_box_pack_start(GTK_BOX(box), gtk_label, FALSE, FALSE, 0); + + if(sg) + gtk_size_group_add_widget(sg, gtk_label); + hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, FALSE, 0); gtk_widget_show(hbox); diff -r f182cf94145c -r 00eaff9396ec pidgin/gtkpounce.c --- a/pidgin/gtkpounce.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/gtkpounce.c Wed Feb 06 03:35:04 2008 +0000 @@ -1237,6 +1237,7 @@ /* Create the treeview */ treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(dialog->model)); + g_object_unref(G_OBJECT(dialog->model)); dialog->treeview = treeview; gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(treeview), TRUE); diff -r f182cf94145c -r 00eaff9396ec pidgin/gtkprefs.c --- a/pidgin/gtkprefs.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/gtkprefs.c Wed Feb 06 03:35:04 2008 +0000 @@ -89,23 +89,12 @@ pidgin_prefs_labeled_spin_button(GtkWidget *box, const gchar *title, const char *key, int min, int max, GtkSizeGroup *sg) { - GtkWidget *hbox; - GtkWidget *label; GtkWidget *spin; GtkObject *adjust; int val; val = purple_prefs_get_int(key); - hbox = gtk_hbox_new(FALSE, 5); - gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, FALSE, 5); - gtk_widget_show(hbox); - - label = gtk_label_new_with_mnemonic(title); - gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); - gtk_widget_show(label); - adjust = gtk_adjustment_new(val, min, max, 1, 1, 1); spin = gtk_spin_button_new(GTK_ADJUSTMENT(adjust), 1, 0); g_object_set_data(G_OBJECT(spin), "val", (char *)key); @@ -113,21 +102,11 @@ gtk_widget_set_size_request(spin, 50, -1); else gtk_widget_set_size_request(spin, 60, -1); - gtk_box_pack_start(GTK_BOX(hbox), spin, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(adjust), "value-changed", G_CALLBACK(update_spin_value), GTK_WIDGET(spin)); gtk_widget_show(spin); - gtk_label_set_mnemonic_widget(GTK_LABEL(label), spin); - - if (sg) { - gtk_size_group_add_widget(sg, label); - gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); - } - - pidgin_set_accessible_label (spin, label); - - return hbox; + return pidgin_add_widget_to_vbox(GTK_BOX(box), title, sg, spin, FALSE, NULL); } static void @@ -141,37 +120,18 @@ pidgin_prefs_labeled_entry(GtkWidget *page, const gchar *title, const char *key, GtkSizeGroup *sg) { - GtkWidget *hbox, *label, *entry; + GtkWidget *entry; const gchar *value; value = purple_prefs_get_string(key); - hbox = gtk_hbox_new(FALSE, 5); - gtk_box_pack_start(GTK_BOX(page), hbox, FALSE, FALSE, 0); - gtk_widget_show(hbox); - - label = gtk_label_new_with_mnemonic(title); - gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); - gtk_widget_show(label); - entry = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(entry), value); - gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(entry), "changed", G_CALLBACK(entry_set), (char*)key); gtk_widget_show(entry); - gtk_label_set_mnemonic_widget(GTK_LABEL(label), entry); - - if(sg) { - gtk_size_group_add_widget(sg, label); - gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); - } - - pidgin_set_accessible_label(entry, label); - - return hbox; + return pidgin_add_widget_to_vbox(GTK_BOX(page), title, sg, entry, TRUE, NULL); } static void @@ -205,7 +165,6 @@ { GtkWidget *dropdown, *opt, *menu; GtkWidget *label = NULL; - GtkWidget *hbox; gchar *text; const char *stored_str = NULL; int stored_int = 0; @@ -215,19 +174,6 @@ g_return_val_if_fail(menuitems != NULL, NULL); - if (title != NULL) { - hbox = gtk_hbox_new(FALSE, 5); - /*gtk_container_add (GTK_CONTAINER (box), hbox);*/ - gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, FALSE, 0); - gtk_widget_show(hbox); - - label = gtk_label_new_with_mnemonic(title); - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); - gtk_widget_show(label); - } else { - hbox = box; - } - #if 0 /* GTK_CHECK_VERSION(2,4,0) */ if(type == PURPLE_PREF_INT) model = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT); @@ -239,11 +185,6 @@ menu = gtk_menu_new(); #endif - if (label != NULL) { - gtk_label_set_mnemonic_widget(GTK_LABEL(label), dropdown); - pidgin_set_accessible_relations (dropdown, label); - } - if (type == PURPLE_PREF_INT) stored_int = purple_prefs_get_int(key); else if (type == PURPLE_PREF_STRING) @@ -293,8 +234,8 @@ } gtk_option_menu_set_menu(GTK_OPTION_MENU(dropdown), menu); - gtk_box_pack_start(GTK_BOX(hbox), dropdown, FALSE, FALSE, 0); - gtk_widget_show(dropdown); + + pidgin_add_widget_to_vbox(GTK_BOX(box), title, NULL, dropdown, FALSE, &label); return label; } @@ -412,7 +353,7 @@ gtk_tree_path_free(path); } -static GtkTreeRowReference *theme_refresh_theme_list() +static GtkTreeRowReference *theme_refresh_theme_list(void) { GdkPixbuf *pixbuf; GSList *themes; @@ -537,12 +478,20 @@ { FILE *f; gchar *path; + size_t wc; if ((error_message != NULL) || (len == 0)) return; f = purple_mkstemp(&path, TRUE); - fwrite(themedata, len, 1, f); + wc = fwrite(themedata, len, 1, f); + if (wc != 1) { + purple_debug_warning("theme_got_url", "Unable to write theme data.\n"); + fclose(f); + g_unlink(path); + g_free(path); + return; + } fclose(f); theme_install_theme(path, user_data); @@ -676,7 +625,7 @@ } static GtkWidget * -theme_page() +theme_page(void) { GtkWidget *add_button, *remove_button; GtkWidget *hbox_buttons; @@ -877,7 +826,7 @@ } static GtkWidget * -interface_page() +interface_page(void) { GtkWidget *ret; GtkWidget *vbox; @@ -970,7 +919,7 @@ #endif static GtkWidget * -conv_page() +conv_page(void) { GtkWidget *ret; GtkWidget *vbox; @@ -983,7 +932,6 @@ #if GTK_CHECK_VERSION(2,4,0) GtkWidget *hbox; - GtkWidget *label; GtkWidget *font_button; const char *font_name; #endif @@ -1026,19 +974,15 @@ fontpref = pidgin_prefs_checkbox(_("Use document font from _theme"), PIDGIN_PREFS_ROOT "/conversations/use_theme_font", vbox); else fontpref = pidgin_prefs_checkbox(_("Use font from _theme"), PIDGIN_PREFS_ROOT "/conversations/use_theme_font", vbox); - hbox = gtk_hbox_new(FALSE, 3); - label = gtk_label_new_with_mnemonic(_("Conversation _font:")); - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); + font_name = purple_prefs_get_string(PIDGIN_PREFS_ROOT "/conversations/custom_font"); font_button = gtk_font_button_new_with_font(font_name ? font_name : NULL); gtk_font_button_set_show_style(GTK_FONT_BUTTON(font_button), TRUE); - gtk_box_pack_start(GTK_BOX(hbox), font_button, FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); + hbox = pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("Conversation _font:"), NULL, font_button, FALSE, NULL); if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/use_theme_font")) gtk_widget_set_sensitive(hbox, FALSE); g_signal_connect(G_OBJECT(fontpref), "clicked", G_CALLBACK(pidgin_toggle_sensitive), hbox); g_signal_connect(G_OBJECT(font_button), "font-set", G_CALLBACK(pidgin_custom_font_set), NULL); - gtk_widget_show_all(hbox); #endif vbox = pidgin_make_frame(ret, _("Default Formatting")); @@ -1137,7 +1081,7 @@ } static GtkWidget * -network_page() +network_page(void) { GtkWidget *ret; GtkWidget *vbox, *hbox, *entry; @@ -1411,7 +1355,7 @@ return FALSE; } -static GList *get_available_browsers() +static GList *get_available_browsers(void) { struct browser { char *name; @@ -1425,6 +1369,7 @@ {N_("Netscape"), "netscape"}, {N_("Mozilla"), "mozilla"}, {N_("Konqueror"), "kfmclient"}, + {N_("Desktop Default"), "xdg-open"}, {N_("GNOME Default"), "gnome-open"}, {N_("Galeon"), "galeon"}, {N_("Firefox"), "firefox"}, @@ -1447,6 +1392,14 @@ browsers = g_list_prepend(browsers, (gpointer)_(possible_browsers[i].name)); if(browser_setting && !strcmp(possible_browsers[i].command, browser_setting)) browser_setting = NULL; + /* If xdg-open is valid, prefer it over gnome-open and skip forward */ + if(!strcmp(possible_browsers[i].command, "xdg-open")) { + if (browser_setting && !strcmp("gnome-open", browser_setting)) { + purple_prefs_set_string(PIDGIN_PREFS_ROOT "/browsers/browser", possible_browsers[i].command); + browser_setting = NULL; + } + i++; + } } } @@ -1477,7 +1430,7 @@ } static GtkWidget * -browser_page() +browser_page(void) { GtkWidget *ret; GtkWidget *vbox; @@ -1520,28 +1473,16 @@ browser_changed1_cb, hbox); } - hbox = gtk_hbox_new(FALSE, 5); - gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); - label = gtk_label_new_with_mnemonic(_("_Manual:\n(%s for URL)")); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); - gtk_misc_set_alignment(GTK_MISC(label), 0, 0); - gtk_size_group_add_widget(sg, label); - entry = gtk_entry_new(); - gtk_label_set_mnemonic_widget(GTK_LABEL(label), entry); - - if (strcmp(purple_prefs_get_string(PIDGIN_PREFS_ROOT "/browsers/browser"), "custom")) - gtk_widget_set_sensitive(hbox, FALSE); - purple_prefs_connect_callback(prefs, PIDGIN_PREFS_ROOT "/browsers/browser", - browser_changed2_cb, hbox); - - gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0); - gtk_entry_set_text(GTK_ENTRY(entry), purple_prefs_get_path(PIDGIN_PREFS_ROOT "/browsers/command")); g_signal_connect(G_OBJECT(entry), "focus-out-event", G_CALLBACK(manual_browser_set), NULL); - pidgin_set_accessible_label (entry, label); + hbox = pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("_Manual:\n(%s for URL)"), sg, entry, TRUE, NULL); + if (strcmp(purple_prefs_get_string(PIDGIN_PREFS_ROOT "/browsers/browser"), "custom")) + gtk_widget_set_sensitive(hbox, FALSE); + purple_prefs_connect_callback(prefs, PIDGIN_PREFS_ROOT "/browsers/browser", + browser_changed2_cb, hbox); gtk_widget_show_all(ret); g_object_unref(sg); @@ -1550,7 +1491,7 @@ #endif /*_WIN32*/ static GtkWidget * -logging_page() +logging_page(void) { GtkWidget *ret; GtkWidget *vbox; @@ -1778,7 +1719,7 @@ } static GtkWidget * -sound_page() +sound_page(void) { GtkWidget *ret; GtkWidget *vbox, *sw, *button; @@ -1794,9 +1735,6 @@ int j; const char *file; char *pref; -#if !defined _WIN32 || defined USE_GSTREAMER - GtkWidget *label; -#endif #ifndef _WIN32 GtkWidget *dd; GtkWidget *entry; @@ -1824,33 +1762,20 @@ gtk_size_group_add_widget(sg, dd); gtk_misc_set_alignment(GTK_MISC(dd), 0, 0.5); - hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); - gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); - - label = gtk_label_new_with_mnemonic(_("Sound c_ommand:\n(%s for filename)")); - gtk_size_group_add_widget(sg, label); - gtk_misc_set_alignment(GTK_MISC(label), 0, 0); - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); - entry = gtk_entry_new(); - gtk_label_set_mnemonic_widget(GTK_LABEL(label), entry); - gtk_editable_set_editable(GTK_EDITABLE(entry), TRUE); cmd = purple_prefs_get_path(PIDGIN_PREFS_ROOT "/sound/command"); if(cmd) gtk_entry_set_text(GTK_ENTRY(entry), cmd); - - gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0); g_signal_connect(G_OBJECT(entry), "changed", G_CALLBACK(sound_cmd_yeah), NULL); + hbox = pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("Sound c_ommand:\n(%s for filename)"), sg, entry, TRUE, NULL); purple_prefs_connect_callback(prefs, PIDGIN_PREFS_ROOT "/sound/method", sound_changed1_cb, hbox); gtk_widget_set_sensitive(hbox, !strcmp(purple_prefs_get_string(PIDGIN_PREFS_ROOT "/sound/method"), "custom")); - - pidgin_set_accessible_label (entry, label); #endif /* _WIN32 */ vbox = pidgin_make_frame (ret, _("Sound Options")); @@ -1864,13 +1789,6 @@ NULL); #ifdef USE_GSTREAMER - hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); - gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); - - label = gtk_label_new_with_mnemonic(_("Volume:")); - gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); - sw = gtk_hscale_new_with_range(0.0, 100.0, 5.0); gtk_range_set_increments(GTK_RANGE(sw), 5.0, 25.0); gtk_range_set_value(GTK_RANGE(sw), purple_prefs_get_int(PIDGIN_PREFS_ROOT "/sound/volume")); @@ -1880,7 +1798,7 @@ g_signal_connect (G_OBJECT (sw), "value-changed", G_CALLBACK (prefs_sound_volume_changed), NULL); - gtk_box_pack_start(GTK_BOX(hbox), sw, TRUE, TRUE, 0); + hbox = pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("Volume:"), NULL, sw, TRUE, NULL); purple_prefs_connect_callback(prefs, PIDGIN_PREFS_ROOT "/sound/method", sound_changed3_cb, hbox); @@ -2005,11 +1923,10 @@ } static GtkWidget * -away_page() +away_page(void) { GtkWidget *ret; GtkWidget *vbox; - GtkWidget *hbox; GtkWidget *dd; GtkWidget *label; GtkWidget *button; @@ -2060,22 +1977,13 @@ g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(pidgin_toggle_sensitive), select); - hbox = gtk_hbox_new(FALSE, 0); - gtk_container_add(GTK_CONTAINER(vbox), hbox); - - label = gtk_label_new_with_mnemonic(_("Change _status to:")); - gtk_size_group_add_widget(sg, label); - gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); + /* TODO: Show something useful if we don't have any saved statuses. */ + menu = pidgin_status_menu(purple_savedstatus_get_idleaway(), G_CALLBACK(set_idle_away)); + pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("Change _status to:"), sg, menu, TRUE, &label); + g_signal_connect(G_OBJECT(button), "clicked", + G_CALLBACK(pidgin_toggle_sensitive), menu); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(pidgin_toggle_sensitive), label); - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); - - /* TODO: Show something useful if we don't have any saved statuses. */ - menu = pidgin_status_menu(purple_savedstatus_get_idleaway(), G_CALLBACK(set_idle_away)); - gtk_box_pack_start(GTK_BOX(hbox), menu, FALSE, FALSE, 0); - g_signal_connect(G_OBJECT(button), "clicked", - G_CALLBACK(pidgin_toggle_sensitive), menu); - gtk_label_set_mnemonic_widget(GTK_LABEL(label), menu); if (!purple_prefs_get_bool("/purple/away/away_when_idle")) { gtk_widget_set_sensitive(GTK_WIDGET(menu), FALSE); @@ -2089,22 +1997,13 @@ button = pidgin_prefs_checkbox(_("Use status from last _exit at startup"), "/purple/savedstatus/startup_current_status", vbox); - hbox = gtk_hbox_new(FALSE, 0); - gtk_container_add(GTK_CONTAINER(vbox), hbox); - - label = gtk_label_new_with_mnemonic(_("Status to a_pply at startup:")); - gtk_size_group_add_widget(sg, label); - gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); + /* TODO: Show something useful if we don't have any saved statuses. */ + menu = pidgin_status_menu(purple_savedstatus_get_startup(), G_CALLBACK(set_startupstatus)); + g_signal_connect(G_OBJECT(button), "clicked", + G_CALLBACK(pidgin_toggle_sensitive), menu); + pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("Status to a_pply at startup:"), sg, menu, TRUE, &label); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(pidgin_toggle_sensitive), label); - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); - - /* TODO: Show something useful if we don't have any saved statuses. */ - menu = pidgin_status_menu(purple_savedstatus_get_startup(), G_CALLBACK(set_startupstatus)); - gtk_box_pack_start(GTK_BOX(hbox), menu, FALSE, FALSE, 0); - g_signal_connect(G_OBJECT(button), "clicked", - G_CALLBACK(pidgin_toggle_sensitive), menu); - gtk_label_set_mnemonic_widget(GTK_LABEL(label), menu); if (purple_prefs_get_bool("/purple/savedstatus/startup_current_status")) { gtk_widget_set_sensitive(GTK_WIDGET(menu), FALSE); @@ -2130,7 +2029,7 @@ #endif } -static void prefs_notebook_init() { +static void prefs_notebook_init(void) { prefs_notebook_add_page(_("Interface"), interface_page(), notebook_page++); prefs_notebook_add_page(_("Conversations"), conv_page(), notebook_page++); prefs_notebook_add_page(_("Smiley Themes"), theme_page(), notebook_page++); diff -r f182cf94145c -r 00eaff9396ec pidgin/gtkprivacy.c --- a/pidgin/gtkprivacy.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/gtkprivacy.c Wed Feb 06 03:35:04 2008 +0000 @@ -44,7 +44,7 @@ GtkWidget *add_button; GtkWidget *remove_button; - GtkWidget *clear_button; + GtkWidget *removeall_button; GtkWidget *close_button; GtkWidget *button_box; @@ -117,23 +117,6 @@ } } -static const char * -find_permit_block_by_name(GSList *list, const char *name) -{ - const char *temp_name; - GSList *l; - - for (l = list; l != NULL; l = l->next) { - temp_name = (const char *)l->data; - - /* Should this use purple_normalize()? */ - if (!purple_utf8_strcasecmp(name, temp_name)) - return temp_name; - } - - return NULL; -} - static void user_selected_cb(GtkTreeSelection *sel, PidginPrivacyDialog *dialog) { @@ -317,19 +300,16 @@ else return; - if (dialog->in_allow_list) { - if (find_permit_block_by_name(dialog->account->permit, name)) - purple_privacy_permit_remove(dialog->account, name, FALSE); - } - else { - if (find_permit_block_by_name(dialog->account->deny, name)) - purple_privacy_deny_remove(dialog->account, name, FALSE); - } + if (dialog->in_allow_list) + purple_privacy_permit_remove(dialog->account, name, FALSE); + else + purple_privacy_deny_remove(dialog->account, name, FALSE); + g_free(name); } static void -clear_cb(GtkWidget *button, PidginPrivacyDialog *dialog) +removeall_cb(GtkWidget *button, PidginPrivacyDialog *dialog) { GSList *l; if (dialog->in_allow_list) @@ -359,7 +339,6 @@ privacy_dialog_new(void) { PidginPrivacyDialog *dialog; - GtkWidget *hbox; GtkWidget *vbox; GtkWidget *button; GtkWidget *dropdown; @@ -386,22 +365,10 @@ gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_widget_show(label); - /* Hbox for the accounts drop-down and label. */ - hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER); - gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); - gtk_widget_show(hbox); - - /* "Set privacy for:" label */ - label = gtk_label_new(_("Set privacy for:")); - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); - gtk_widget_show(label); - /* Accounts drop-down */ dropdown = pidgin_account_option_menu_new(NULL, FALSE, G_CALLBACK(select_account_cb), NULL, dialog); - gtk_box_pack_start(GTK_BOX(hbox), dropdown, FALSE, FALSE, 0); - gtk_widget_show(dropdown); - pidgin_set_accessible_label (dropdown, label); + pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("Set privacy for:"), NULL, dropdown, TRUE, NULL); dialog->account = pidgin_account_option_menu_get_selected(dropdown); /* Add the drop-down list with the allow/block types. */ @@ -433,7 +400,7 @@ dialog->block_widget = build_block_list(dialog); gtk_box_pack_start(GTK_BOX(vbox), dialog->block_widget, TRUE, TRUE, 0); - /* Add the button box for Add, Remove, Clear */ + /* Add the button box for Add, Remove, Remove All */ dialog->button_box = pidgin_dialog_get_action_area(GTK_DIALOG(dialog->win)); /* Add button */ @@ -443,11 +410,12 @@ /* Remove button */ button = pidgin_dialog_add_button(GTK_DIALOG(dialog->win), GTK_STOCK_REMOVE, G_CALLBACK(remove_cb), dialog); dialog->remove_button = button; + /* TODO: This button should be sensitive/invisitive more cleverly */ gtk_widget_set_sensitive(button, FALSE); - /* Clear button */ - button = pidgin_dialog_add_button(GTK_DIALOG(dialog->win), GTK_STOCK_CLEAR, G_CALLBACK(clear_cb), dialog); - dialog->clear_button = button; + /* Remove All button */ + button = pidgin_dialog_add_button(GTK_DIALOG(dialog->win), _("Remove Al_l"), G_CALLBACK(removeall_cb), dialog); + dialog->removeall_button = button; /* Close button */ button = pidgin_dialog_add_button(GTK_DIALOG(dialog->win), GTK_STOCK_CLOSE, G_CALLBACK(close_cb), dialog); @@ -487,6 +455,8 @@ if (privacy_dialog == NULL) return; + g_object_unref(G_OBJECT(privacy_dialog->allow_store)); + g_object_unref(G_OBJECT(privacy_dialog->block_store)); g_free(privacy_dialog); privacy_dialog = NULL; } diff -r f182cf94145c -r 00eaff9396ec pidgin/gtkrequest.c --- a/pidgin/gtkrequest.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/gtkrequest.c Wed Feb 06 03:35:04 2008 +0000 @@ -663,7 +663,11 @@ gtk_widget_grab_focus(img); gtk_widget_grab_default(img); } else - gtk_dialog_set_default_response(GTK_DIALOG(dialog), default_action); + /* + * Need to invert the default_action number because the + * buttons are added to the dialog in reverse order. + */ + gtk_dialog_set_default_response(GTK_DIALOG(dialog), action_count - 1 - default_action); /* Show everything. */ pidgin_auto_parent_window(dialog); @@ -1007,6 +1011,7 @@ /* Create the tree view */ treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); + g_object_unref(G_OBJECT(store)); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE); sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); diff -r f182cf94145c -r 00eaff9396ec pidgin/gtkroomlist.c --- a/pidgin/gtkroomlist.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/gtkroomlist.c Wed Feb 06 03:35:04 2008 +0000 @@ -356,8 +356,6 @@ GtkTextDirection dir = gtk_widget_get_direction(GTK_WIDGET(grl->tree)); style = grl->tipwindow->style; - gtk_paint_flat_box(style, grl->tipwindow->window, GTK_STATE_NORMAL, GTK_SHADOW_OUT, - NULL, grl->tipwindow, "tooltip", 0, 0, -1, -1); max_text_width = 0; @@ -523,9 +521,7 @@ GtkWidget *window; GtkWidget *vbox; GtkWidget *vbox2; - GtkWidget *account_hbox; GtkWidget *bbox; - GtkWidget *label; dialog = g_new0(PidginRoomlistDialog, 1); dialog->account = account; @@ -544,25 +540,11 @@ gtk_widget_show(vbox2); /* accounts dropdown list */ - account_hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); - gtk_box_pack_start(GTK_BOX(vbox2), account_hbox, FALSE, FALSE, 0); - gtk_widget_show(account_hbox); - - label = gtk_label_new(NULL); - gtk_box_pack_start(GTK_BOX(account_hbox), label, FALSE, FALSE, 0); - gtk_label_set_markup_with_mnemonic(GTK_LABEL(label), _("_Account:")); - gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); - gtk_widget_show(label); - dialog->account_widget = pidgin_account_option_menu_new(dialog->account, FALSE, G_CALLBACK(dialog_select_account_cb), account_filter_func, dialog); - if (!dialog->account) /* this is normally null, and we normally don't care what the first selected item is */ dialog->account = pidgin_account_option_menu_get_selected(dialog->account_widget); - - gtk_box_pack_start(GTK_BOX(account_hbox), dialog->account_widget, TRUE, TRUE, 0); - gtk_label_set_mnemonic_widget(GTK_LABEL(label), GTK_WIDGET(dialog->account_widget)); - gtk_widget_show(dialog->account_widget); + pidgin_add_widget_to_vbox(GTK_BOX(vbox2), _("_Account:"), NULL, dialog->account_widget, TRUE, NULL); /* scrolled window */ dialog->sw = gtk_scrolled_window_new(NULL, NULL); diff -r f182cf94145c -r 00eaff9396ec pidgin/gtksavedstatuses.c --- a/pidgin/gtksavedstatuses.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/gtksavedstatuses.c Wed Feb 06 03:35:04 2008 +0000 @@ -669,6 +669,7 @@ purple_request_close_with_handle(status_window); purple_notify_close_with_handle(status_window); purple_signals_disconnect_by_handle(status_window); + g_object_unref(G_OBJECT(status_window->model)); g_free(status_window); status_window = NULL; } @@ -723,6 +724,7 @@ status_editor_remove_dialog(dialog); g_free(dialog->original_title); + g_object_unref(G_OBJECT(dialog->model)); g_free(dialog); return FALSE; @@ -1092,7 +1094,6 @@ GtkWidget *entry; GtkWidget *frame; GtkWidget *hbox; - GtkWidget *label; GtkWidget *sw; GtkWidget *text; GtkWidget *toolbar; @@ -1141,52 +1142,29 @@ sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); /* Title */ - hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); - gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); - - label = gtk_label_new_with_mnemonic(_("_Title:")); - gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); - gtk_size_group_add_widget(sg, label); - entry = gtk_entry_new(); dialog->title = GTK_ENTRY(entry); if ((saved_status != NULL) && !purple_savedstatus_is_transient(saved_status) && (purple_savedstatus_get_title(saved_status) != NULL)) gtk_entry_set_text(GTK_ENTRY(entry), purple_savedstatus_get_title(saved_status)); - gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0); g_signal_connect(G_OBJECT(entry), "changed", G_CALLBACK(editor_title_changed_cb), dialog); + pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("_Title:"), sg, entry, TRUE, NULL); /* Status type */ - hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); - gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); - - label = gtk_label_new_with_mnemonic(_("_Status:")); - gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); - gtk_size_group_add_widget(sg, label); - if (saved_status != NULL) dropdown = create_status_type_menu(purple_savedstatus_get_type(saved_status)); else dropdown = create_status_type_menu(PURPLE_STATUS_AWAY); dialog->type = GTK_OPTION_MENU(dropdown); - gtk_box_pack_start(GTK_BOX(hbox), dropdown, TRUE, TRUE, 0); + pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("_Status:"), sg, dropdown, TRUE, NULL); /* Status message */ - hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); - gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0); - - label = gtk_label_new_with_mnemonic(_("_Message:")); - gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); - gtk_size_group_add_widget(sg, label); - frame = pidgin_create_imhtml(TRUE, &text, &toolbar, NULL); dialog->message = GTK_IMHTML(text); - gtk_box_pack_start(GTK_BOX(hbox), frame, TRUE, TRUE, 0); + hbox = pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("_Message:"), sg, frame, TRUE, NULL); + gtk_container_child_set(GTK_CONTAINER(vbox), hbox, "expand", TRUE, "fill", TRUE, NULL); focus_chain = g_list_prepend(focus_chain, dialog->message); gtk_container_set_focus_chain(GTK_CONTAINER(hbox), focus_chain); g_list_free(focus_chain); diff -r f182cf94145c -r 00eaff9396ec pidgin/gtksession.c --- a/pidgin/gtksession.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/gtksession.c Wed Feb 06 03:35:04 2008 +0000 @@ -124,7 +124,7 @@ purple_debug(PURPLE_DEBUG_INFO, NULL, "done.\n"); } -static void ice_init() { +static void ice_init(void) { IceIOErrorHandler default_handler; ice_installed_io_error_handler = IceSetIOErrorHandler(NULL); diff -r f182cf94145c -r 00eaff9396ec pidgin/gtkstatusbox.c --- a/pidgin/gtkstatusbox.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/gtkstatusbox.c Wed Feb 06 03:35:04 2008 +0000 @@ -119,7 +119,10 @@ DATA_COLUMN, /** - * This column stores the GdkPixbuf for the status emblem. Currently only 'saved' is stored + * This column stores the GdkPixbuf for the status emblem. Currently only 'saved' is stored. + * In the GtkTreeModel for the dropdown, this is the stock-id (gchararray), and for the + * GtkTreeModel for the cell_view (for the account-specific statusbox), this is the prpl-icon + * (GdkPixbuf) of the account. */ EMBLEM_COLUMN, @@ -317,12 +320,20 @@ { FILE *f; gchar *path; + size_t wc; if ((error_message != NULL) || (len == 0)) return; f = purple_mkstemp(&path, TRUE); - fwrite(themedata, len, 1, f); + wc = fwrite(themedata, len, 1, f); + if (wc != 1) { + purple_debug_warning("theme_got_url", "Unable to write theme data.\n"); + fclose(f); + g_unlink(path); + g_free(path); + return; + } fclose(f); icon_choose_cb(path, user_data); @@ -500,20 +511,28 @@ pidgin_status_box_finalize(GObject *obj) { PidginStatusBox *statusbox = PIDGIN_STATUS_BOX(obj); + int i; purple_signals_disconnect_by_handle(statusbox); purple_prefs_disconnect_by_handle(statusbox); - gdk_cursor_unref(statusbox->hand_cursor); - gdk_cursor_unref(statusbox->arrow_cursor); + destroy_icon_box(statusbox); + + if (statusbox->active_row) + gtk_tree_row_reference_free(statusbox->active_row); - purple_imgstore_unref(statusbox->buddy_icon_img); - g_object_unref(G_OBJECT(statusbox->buddy_icon)); - g_object_unref(G_OBJECT(statusbox->buddy_icon_hover)); + for (i = 0; i < G_N_ELEMENTS(statusbox->connecting_pixbufs); i++) { + if (statusbox->connecting_pixbufs[i] != NULL) + gdk_pixbuf_unref(statusbox->connecting_pixbufs[i]); + } - if (statusbox->buddy_icon_sel) - gtk_widget_destroy(statusbox->buddy_icon_sel); + for (i = 0; i < G_N_ELEMENTS(statusbox->typing_pixbufs); i++) { + if (statusbox->typing_pixbufs[i] != NULL) + gdk_pixbuf_unref(statusbox->typing_pixbufs[i]); + } + g_object_unref(G_OBJECT(statusbox->store)); + g_object_unref(G_OBJECT(statusbox->dropdown_store)); G_OBJECT_CLASS(parent_class)->finalize(obj); } @@ -606,7 +625,7 @@ char aa_color[8]; PurpleSavedStatus *saved_status; char *primary, *secondary, *text; - GdkPixbuf *pixbuf; + GdkPixbuf *pixbuf, *emblem = NULL; GtkTreePath *path; gboolean account_status = FALSE; PurpleAccount *acct = (status_box->token_status_account) ? status_box->token_status_account : status_box->account; @@ -703,6 +722,7 @@ text = g_strdup_printf("%s - %s", purple_account_get_username(status_box->account), aa_color, secondary ? secondary : primary); + emblem = pidgin_create_prpl_icon(status_box->account, PIDGIN_PRPL_ICON_SMALL); } else if (secondary != NULL) { text = g_strdup_printf("%s - %s", primary, aa_color, secondary); @@ -719,10 +739,14 @@ gtk_list_store_set(status_box->store, &(status_box->iter), ICON_COLUMN, pixbuf, TEXT_COLUMN, text, + EMBLEM_COLUMN, emblem, + EMBLEM_VISIBLE_COLUMN, (emblem != NULL), -1); if ((status_box->typing == 0) && (!status_box->connecting)) g_object_unref(pixbuf); g_free(text); + if (emblem) + g_object_unref(emblem); /* Make sure to activate the only row in the tree view */ path = gtk_tree_path_new_from_string("0"); @@ -941,7 +965,7 @@ /* This returns NULL if the active accounts don't have identical * statuses and a token account if they do */ -static PurpleAccount* check_active_accounts_for_identical_statuses() +static PurpleAccount* check_active_accounts_for_identical_statuses(void) { PurpleAccount *acct = NULL, *acct2; GList *tmp, *tmp2, *active_accts = purple_accounts_get_all_active(); @@ -1156,18 +1180,15 @@ cache_pixbufs(PidginStatusBox *status_box) { GtkIconSize icon_size; + int i; g_object_set(G_OBJECT(status_box->icon_rend), "xpad", 3, NULL); icon_size = gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL); - if (status_box->connecting_pixbufs[0] != NULL) - gdk_pixbuf_unref(status_box->connecting_pixbufs[0]); - if (status_box->connecting_pixbufs[1] != NULL) - gdk_pixbuf_unref(status_box->connecting_pixbufs[1]); - if (status_box->connecting_pixbufs[2] != NULL) - gdk_pixbuf_unref(status_box->connecting_pixbufs[2]); - if (status_box->connecting_pixbufs[3] != NULL) - gdk_pixbuf_unref(status_box->connecting_pixbufs[3]); + for (i = 0; i < G_N_ELEMENTS(status_box->connecting_pixbufs); i++) { + if (status_box->connecting_pixbufs[i] != NULL) + gdk_pixbuf_unref(status_box->connecting_pixbufs[i]); + } status_box->connecting_index = 0; status_box->connecting_pixbufs[0] = gtk_widget_render_icon (GTK_WIDGET(status_box->vbox), PIDGIN_STOCK_ANIMATION_CONNECT0, @@ -1189,14 +1210,10 @@ status_box->connecting_pixbufs[8] = gtk_widget_render_icon (GTK_WIDGET(status_box->vbox), PIDGIN_STOCK_ANIMATION_CONNECT8, icon_size, "PidginStatusBox"); - if (status_box->typing_pixbufs[0] != NULL) - gdk_pixbuf_unref(status_box->typing_pixbufs[0]); - if (status_box->typing_pixbufs[1] != NULL) - gdk_pixbuf_unref(status_box->typing_pixbufs[1]); - if (status_box->typing_pixbufs[2] != NULL) - gdk_pixbuf_unref(status_box->typing_pixbufs[2]); - if (status_box->typing_pixbufs[3] != NULL) - gdk_pixbuf_unref(status_box->typing_pixbufs[3]); + for (i = 0; i < G_N_ELEMENTS(status_box->typing_pixbufs); i++) { + if (status_box->typing_pixbufs[i] != NULL) + gdk_pixbuf_unref(status_box->typing_pixbufs[i]); + } status_box->typing_index = 0; status_box->typing_pixbufs[0] = gtk_widget_render_icon (GTK_WIDGET(status_box->vbox), PIDGIN_STOCK_ANIMATION_TYPING0, @@ -1690,7 +1707,7 @@ status_box->arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_NONE); status_box->store = gtk_list_store_new(NUM_COLUMNS, G_TYPE_INT, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, - G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_STRING, G_TYPE_BOOLEAN); + G_TYPE_STRING, G_TYPE_POINTER, GDK_TYPE_PIXBUF, G_TYPE_BOOLEAN); status_box->dropdown_store = gtk_list_store_new(NUM_COLUMNS, G_TYPE_INT, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_STRING, G_TYPE_BOOLEAN); @@ -1775,10 +1792,13 @@ status_box->icon_rend = gtk_cell_renderer_pixbuf_new(); status_box->text_rend = gtk_cell_renderer_text_new(); + emblem_rend = gtk_cell_renderer_pixbuf_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box->cell_view), status_box->icon_rend, FALSE); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box->cell_view), status_box->text_rend, TRUE); + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(status_box->cell_view), emblem_rend, FALSE); gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box->cell_view), status_box->icon_rend, "pixbuf", ICON_COLUMN, NULL); gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box->cell_view), status_box->text_rend, "markup", TEXT_COLUMN, NULL); + gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box->cell_view), emblem_rend, "pixbuf", EMBLEM_COLUMN, "visible", EMBLEM_VISIBLE_COLUMN, NULL); #if GTK_CHECK_VERSION(2, 6, 0) g_object_set(status_box->text_rend, "ellipsize", PANGO_ELLIPSIZE_END, NULL); #endif diff -r f182cf94145c -r 00eaff9396ec pidgin/gtkthemes.c --- a/pidgin/gtkthemes.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/gtkthemes.c Wed Feb 06 03:35:04 2008 +0000 @@ -168,7 +168,7 @@ } static void -pidgin_smiley_themes_remove_non_existing() +pidgin_smiley_themes_remove_non_existing(void) { static struct smiley_theme *theme = NULL; GSList *iter = NULL; diff -r f182cf94145c -r 00eaff9396ec pidgin/gtkutils.c --- a/pidgin/gtkutils.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/gtkutils.c Wed Feb 06 03:35:04 2008 +0000 @@ -1595,7 +1595,7 @@ else if (!(im || ft)) purple_request_yes_no(NULL, NULL, _("You have dragged an image"), _("Would you like to set it as the buddy icon for this user?"), - 0, + PURPLE_DEFAULT_ACTION_NONE, account, who, NULL, data, (GCallback)dnd_set_icon_ok_cb, (GCallback)dnd_set_icon_cancel_cb); else @@ -1701,23 +1701,23 @@ GdkPixbuf *pixbuf = NULL; if (prim == PURPLE_STATUS_UNAVAILABLE) - pixbuf = gtk_widget_render_icon (w, PIDGIN_STOCK_STATUS_BUSY, - icon_size, "GtkWidget"); - else if (prim == PURPLE_STATUS_AWAY) - pixbuf = gtk_widget_render_icon (w, PIDGIN_STOCK_STATUS_AWAY, - icon_size, "GtkWidget"); - else if (prim == PURPLE_STATUS_EXTENDED_AWAY) - pixbuf = gtk_widget_render_icon (w, PIDGIN_STOCK_STATUS_XA, - icon_size, "GtkWidget"); - else if (prim == PURPLE_STATUS_INVISIBLE) - pixbuf = gtk_widget_render_icon (w, PIDGIN_STOCK_STATUS_INVISIBLE, - icon_size, "GtkWidget"); - else if (prim == PURPLE_STATUS_OFFLINE) - pixbuf = gtk_widget_render_icon (w, PIDGIN_STOCK_STATUS_OFFLINE, - icon_size, "GtkWidget"); - else - pixbuf = gtk_widget_render_icon (w, PIDGIN_STOCK_STATUS_AVAILABLE, - icon_size, "GtkWidget"); + pixbuf = gtk_widget_render_icon (w, PIDGIN_STOCK_STATUS_BUSY, + icon_size, "GtkWidget"); + else if (prim == PURPLE_STATUS_AWAY) + pixbuf = gtk_widget_render_icon (w, PIDGIN_STOCK_STATUS_AWAY, + icon_size, "GtkWidget"); + else if (prim == PURPLE_STATUS_EXTENDED_AWAY) + pixbuf = gtk_widget_render_icon (w, PIDGIN_STOCK_STATUS_XA, + icon_size, "GtkWidget"); + else if (prim == PURPLE_STATUS_INVISIBLE) + pixbuf = gtk_widget_render_icon (w, PIDGIN_STOCK_STATUS_INVISIBLE, + icon_size, "GtkWidget"); + else if (prim == PURPLE_STATUS_OFFLINE) + pixbuf = gtk_widget_render_icon (w, PIDGIN_STOCK_STATUS_OFFLINE, + icon_size, "GtkWidget"); + else + pixbuf = gtk_widget_render_icon (w, PIDGIN_STOCK_STATUS_AVAILABLE, + icon_size, "GtkWidget"); return pixbuf; } @@ -2947,7 +2947,7 @@ GSList *minidialogs = NULL; static void * -pidgin_utils_get_handle() +pidgin_utils_get_handle(void) { static int handle; @@ -3321,6 +3321,40 @@ gtk_entry_set_text(GTK_ENTRY(GTK_BIN((widget))->child), (text)); } +GtkWidget * +pidgin_add_widget_to_vbox(GtkBox *vbox, const char *widget_label, GtkSizeGroup *sg, GtkWidget *widget, gboolean expand, GtkWidget **p_label) +{ + GtkWidget *hbox; + GtkWidget *label = NULL; + + if (widget_label) { + hbox = gtk_hbox_new(FALSE, 5); + gtk_widget_show(hbox); + gtk_box_pack_start(vbox, hbox, FALSE, FALSE, 0); + + label = gtk_label_new_with_mnemonic(widget_label); + gtk_widget_show(label); + if (sg) { + gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); + gtk_size_group_add_widget(sg, label); + } + gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); + } else { + hbox = GTK_WIDGET(vbox); + } + + gtk_widget_show(widget); + gtk_box_pack_start(GTK_BOX(hbox), widget, expand, TRUE, 0); + if (label) { + gtk_label_set_mnemonic_widget(GTK_LABEL(label), widget); + pidgin_set_accessible_label (widget, label); + } + + if (p_label) + (*p_label) = label; + return hbox; +} + gboolean pidgin_auto_parent_window(GtkWidget *widget) { #if 0 diff -r f182cf94145c -r 00eaff9396ec pidgin/gtkutils.h --- a/pidgin/gtkutils.h Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/gtkutils.h Wed Feb 06 03:35:04 2008 +0000 @@ -374,16 +374,20 @@ gboolean pidgin_screenname_autocomplete_default_filter(const PidginBuddyCompletionEntry *completion_entry, gpointer all_accounts); /** + * Add autocompletion of screenames to an entry. + * * @deprecated - * Add autocompletion of screenames to an entry. - * The usage of this function is deprecated. For new code, use the equivalent: - * pidgin_setup_screenname_autocomplete_with_filter(entry, optmenu, pidgin_screenname_autocomplete_default_filter, GINT_TO_POINTER(all)) + * For new code, use the equivalent: + * #pidgin_setup_screenname_autocomplete_with_filter(@a entry, @a optmenu, + * #pidgin_screenname_autocomplete_default_filter, GINT_TO_POINTER(@a + * all)) * * @param entry The GtkEntry on which to setup autocomplete. - * @param optmenu A menu for accounts, returned by pidgin_account_option_menu_new(). - * If @a optmenu is not @c NULL, it'll be updated when a screenname is chosen - * from the autocomplete list. - * @param all Whether to include screennames from disconnected accounts. + * @param optmenu A menu for accounts, returned by + * pidgin_account_option_menu_new(). If @a optmenu is not @c + * NULL, it'll be updated when a screenname is chosen from the + * autocomplete list. + * @param all Whether to include screennames from disconnected accounts. */ void pidgin_setup_screenname_autocomplete(GtkWidget *entry, GtkWidget *optmenu, gboolean all); @@ -506,7 +510,7 @@ /** * A valid GtkMenuPositionFunc. This is used to determine where - * to draw context menu's when the menu is activated with the + * to draw context menus when the menu is activated with the * keyboard (shift+F10). If the menu is activated with the mouse, * then you should just use GTK's built-in position function, * because it does a better job of positioning the menu. @@ -790,5 +794,20 @@ */ gboolean pidgin_auto_parent_window(GtkWidget *window); +/** + * Add a labelled widget to a GtkVBox + * + * @param vbox The GtkVBox to add the widget to. + * @param widget_label The label to give the widget, can be @c NULL. + * @param sg The GtkSizeGroup to add the label to, can be @c NULL. + * @param widget The GtkWidget to add. + * @param expand Whether to expand the widget horizontally. + * @param p_label Place to store a pointer to the GtkLabel, or @c NULL if you don't care. + * + * @return A GtkHBox already added to the GtkVBox containing the GtkLabel and the GtkWidget. + * @since 2.4.0 + */ +GtkWidget *pidgin_add_widget_to_vbox(GtkBox *vbox, const char *widget_label, GtkSizeGroup *sg, GtkWidget *widget, gboolean expand, GtkWidget **p_label); + #endif /* _PIDGINUTILS_H_ */ diff -r f182cf94145c -r 00eaff9396ec pidgin/pidgintooltip.c --- a/pidgin/pidgintooltip.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/pidgintooltip.c Wed Feb 06 03:35:04 2008 +0000 @@ -43,15 +43,22 @@ { GtkWidget *widget; gpointer userdata; - PidginTooltipCreateForTree create_tooltip; PidginTooltipPaint paint_tooltip; - GtkTreePath *path; + union { + struct { + PidginTooltipCreateForTree create_tooltip; + GtkTreePath *path; + } treeview; + struct { + PidginTooltipCreate create_tooltip; + } widget; + } common; } PidginTooltipData; static void destroy_tooltip_data(PidginTooltipData *data) { - gtk_tree_path_free(data->path); + gtk_tree_path_free(data->common.treeview.path); g_free(data); } @@ -70,13 +77,16 @@ static gboolean pidgin_tooltip_expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data) { - if (pidgin_tooltip.paint_tooltip) + if (pidgin_tooltip.paint_tooltip) { + gtk_paint_flat_box(widget->style, widget->window, GTK_STATE_NORMAL, GTK_SHADOW_OUT, + NULL, widget, "tooltip", 0, 0, -1, -1); pidgin_tooltip.paint_tooltip(widget, data); + } return FALSE; } static GtkWidget* -setup_tooltip_window() +setup_tooltip_window(void) { const char *name; GtkWidget *tipwindow; @@ -184,14 +194,35 @@ static void reset_data_treepath(PidginTooltipData *data) { - gtk_tree_path_free(data->path); - data->path = NULL; + gtk_tree_path_free(data->common.treeview.path); + data->common.treeview.path = NULL; } static void pidgin_tooltip_draw(PidginTooltipData *data) { GtkWidget *tipwindow; + int w, h; + + pidgin_tooltip_destroy(); + + pidgin_tooltip.widget = gtk_widget_get_toplevel(data->widget); + pidgin_tooltip.tipwindow = tipwindow = setup_tooltip_window(); + pidgin_tooltip.paint_tooltip = data->paint_tooltip; + + if (!data->common.widget.create_tooltip(tipwindow, data->userdata, &w, &h)) { + if (tipwindow == pidgin_tooltip.tipwindow) + pidgin_tooltip_destroy(); + return; + } + + setup_tooltip_window_position(data->userdata, w, h); +} + +static void +pidgin_tooltip_draw_tree(PidginTooltipData *data) +{ + GtkWidget *tipwindow; GtkTreePath *path = NULL; int w, h; @@ -203,13 +234,13 @@ return; } - if (data->path) { - if (gtk_tree_path_compare(data->path, path) == 0) { + if (data->common.treeview.path) { + if (gtk_tree_path_compare(data->common.treeview.path, path) == 0) { gtk_tree_path_free(path); return; } - gtk_tree_path_free(data->path); - data->path = NULL; + gtk_tree_path_free(data->common.treeview.path); + data->common.treeview.path = NULL; } pidgin_tooltip_destroy(); @@ -218,24 +249,29 @@ pidgin_tooltip.tipwindow = tipwindow = setup_tooltip_window(); pidgin_tooltip.paint_tooltip = data->paint_tooltip; - if (!data->create_tooltip(tipwindow, path, data->userdata, &w, &h)) { - pidgin_tooltip_destroy(); + if (!data->common.treeview.create_tooltip(tipwindow, path, data->userdata, &w, &h)) { + if (tipwindow == pidgin_tooltip.tipwindow) + pidgin_tooltip_destroy(); gtk_tree_path_free(path); return; } setup_tooltip_window_position(data->userdata, w, h); - data->path = path; - g_signal_connect_swapped(G_OBJECT(tipwindow), "destroy", + data->common.treeview.path = path; + g_signal_connect_swapped(G_OBJECT(pidgin_tooltip.tipwindow), "destroy", G_CALLBACK(reset_data_treepath), data); } static gboolean pidgin_tooltip_timeout(gpointer data) { + PidginTooltipData *tdata = data; pidgin_tooltip.timeout = 0; - pidgin_tooltip_draw(data); + if (GTK_IS_TREE_VIEW(tdata->widget)) + pidgin_tooltip_draw_tree(data); + else + pidgin_tooltip_draw(data); return FALSE; } @@ -276,7 +312,7 @@ } static gboolean -row_leave_cb(GtkWidget *tv, GdkEvent *event, gpointer userdata) +widget_leave_cb(GtkWidget *tv, GdkEvent *event, gpointer userdata) { pidgin_tooltip_destroy(); return FALSE; @@ -288,12 +324,40 @@ PidginTooltipData *tdata = g_new0(PidginTooltipData, 1); tdata->widget = tree; tdata->userdata = userdata; - tdata->create_tooltip = create_tooltip; + tdata->common.treeview.create_tooltip = create_tooltip; tdata->paint_tooltip = paint_tooltip; g_signal_connect(G_OBJECT(tree), "motion-notify-event", G_CALLBACK(row_motion_cb), tdata); - g_signal_connect(G_OBJECT(tree), "leave-notify-event", G_CALLBACK(row_leave_cb), NULL); + g_signal_connect(G_OBJECT(tree), "leave-notify-event", G_CALLBACK(widget_leave_cb), NULL); g_signal_connect_swapped(G_OBJECT(tree), "destroy", G_CALLBACK(destroy_tooltip_data), tdata); return TRUE; } +static gboolean +widget_motion_cb(GtkWidget *widget, GdkEvent *event, gpointer data) +{ + int delay = purple_prefs_get_int(PIDGIN_PREFS_ROOT "/blist/tooltip_delay"); + + pidgin_tooltip_destroy(); + if (delay == 0) + return FALSE; + + pidgin_tooltip.timeout = g_timeout_add(delay, (GSourceFunc)pidgin_tooltip_timeout, data); + return FALSE; +} + +gboolean pidgin_tooltip_setup_for_widget(GtkWidget *widget, gpointer userdata, + PidginTooltipCreate create_tooltip, PidginTooltipPaint paint_tooltip) +{ + PidginTooltipData *wdata = g_new0(PidginTooltipData, 1); + wdata->widget = widget; + wdata->userdata = userdata; + wdata->common.widget.create_tooltip = create_tooltip; + wdata->paint_tooltip = paint_tooltip; + + g_signal_connect(G_OBJECT(widget), "motion-notify-event", G_CALLBACK(widget_motion_cb), wdata); + g_signal_connect(G_OBJECT(widget), "leave-notify-event", G_CALLBACK(widget_leave_cb), NULL); + g_signal_connect_swapped(G_OBJECT(widget), "destroy", G_CALLBACK(g_free), wdata); + return TRUE; +} + diff -r f182cf94145c -r 00eaff9396ec pidgin/pidgintooltip.h --- a/pidgin/pidgintooltip.h Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/pidgintooltip.h Wed Feb 06 03:35:04 2008 +0000 @@ -77,6 +77,20 @@ PidginTooltipCreateForTree create_cb, PidginTooltipPaint paint_cb); /** + * Setup tooltip drawing functions for any widget. + * + * @param widget The widget + * @param userdata The userdata to send to the callback functions + * @param create_cb Callback function to create the tooltip for the widget + * @param paint_cb Callback function to paint the tooltip + * + * @return @c TRUE if the tooltip callbacks were setup correctly. + * @since 2.4.0 + */ +gboolean pidgin_tooltip_setup_for_widget(GtkWidget *widget, gpointer userdata, + PidginTooltipCreate create_cb, PidginTooltipPaint paint_cb); + +/** * Destroy the tooltip. * @since 2.4.0 */ @@ -94,4 +108,5 @@ */ void pidgin_tooltip_show(GtkWidget *widget, gpointer userdata, PidginTooltipCreate create_cb, PidginTooltipPaint paint_cb); + #endif diff -r f182cf94145c -r 00eaff9396ec pidgin/plugins/cap/cap.c --- a/pidgin/plugins/cap/cap.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/plugins/cap/cap.c Wed Feb 06 03:35:04 2008 +0000 @@ -434,26 +434,6 @@ stats->last_seen = time(NULL); } -static void buddy_idle(PurpleBuddy *buddy, gboolean old_idle, gboolean idle) { -} - -#if 0 -static void blist_node_extended_menu(PurpleBlistNode *node, GList **menu) { - PurpleBuddy *buddy; - PurpleMenuAction *menu_action; - purple_debug_info("cap", "got extended blist menu\n"); - purple_debug_info("cap", "is buddy: %d\n", PURPLE_BLIST_NODE_IS_BUDDY(node)); - purple_debug_info("cap", "is contact: %d\n", PURPLE_BLIST_NODE_IS_CONTACT(node)); - purple_debug_info("cap", "is group: %d\n", PURPLE_BLIST_NODE_IS_GROUP(node)); - /* Probably only concerned with buddy/contact types. Contacts = meta-buddies (grouped msn/jabber/etc.) */ - g_return_if_fail(PURPLE_BLIST_NODE_IS_BUDDY(node)); - buddy = (PurpleBuddy *)node; - menu_action = purple_menu_action_new(_("Display Statistics"), - PURPLE_CALLBACK(display_statistics_action_cb), NULL, NULL); - *menu = g_list_append(*menu, menu_action); -} -#endif - /* drawing-tooltip */ static void drawing_tooltip(PurpleBlistNode *node, GString *text, gboolean full) { if(node->type == PURPLE_BLIST_BUDDY_NODE) { @@ -662,15 +642,6 @@ /* result = dbi_conn_queryf(_conn, "insert into cap_message values(\'%s\', \'%s\', %d, now());", sender, receiver, count); */ } -/* Callbacks */ -void display_statistics_action_cb(PurpleBlistNode *node, gpointer data) { - PurpleBuddy *buddy; - - g_return_if_fail(PURPLE_BLIST_NODE_IS_BUDDY(node)); - buddy = (PurpleBuddy *)node; - purple_debug_info("cap", "Statistics for %s requested.\n", buddy->name); -} - /* Purple plugin specific code */ static gboolean plugin_load(PurplePlugin *plugin) { @@ -714,9 +685,6 @@ purple_signal_connect(purple_blist_get_handle(), "buddy-signed-off", plugin, PURPLE_CALLBACK(buddy_signed_off), NULL); - /*purple_signal_connect(purple_blist_get_handle(), "blist-node-extended-menu", plugin, - PURPLE_CALLBACK(blist_node_extended_menu), NULL);*/ - purple_signal_connect(pidgin_blist_get_handle(), "drawing-tooltip", plugin, PURPLE_CALLBACK(drawing_tooltip), NULL); @@ -726,9 +694,6 @@ purple_signal_connect(purple_connections_get_handle(), "signed-off", plugin, PURPLE_CALLBACK(signed_off), NULL); - purple_signal_connect(purple_blist_get_handle(), "buddy-idle-changed", plugin, - PURPLE_CALLBACK(buddy_idle), NULL); - _signals_connected = TRUE; } @@ -765,9 +730,6 @@ purple_signal_disconnect(purple_blist_get_handle(), "buddy-signed-off", plugin, PURPLE_CALLBACK(buddy_signed_off)); - /*purple_signal_disconnect(purple_blist_get_handle(), "blist-node-extended-menu", plugin, - PURPLE_CALLBACK(blist_node_extended_menu));*/ - purple_signal_disconnect(pidgin_blist_get_handle(), "drawing-tooltip", plugin, PURPLE_CALLBACK(drawing_tooltip)); @@ -777,9 +739,6 @@ purple_signal_disconnect(purple_connections_get_handle(), "signed-off", plugin, PURPLE_CALLBACK(signed_off)); - purple_signal_disconnect(purple_blist_get_handle(), "buddy-idle-changed", plugin, - PURPLE_CALLBACK(buddy_idle)); - _signals_connected = FALSE; } diff -r f182cf94145c -r 00eaff9396ec pidgin/plugins/cap/cap.h --- a/pidgin/plugins/cap/cap.h Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/plugins/cap/cap.h Wed Feb 06 03:35:04 2008 +0000 @@ -98,7 +98,6 @@ static void buddy_signed_on(PurpleBuddy *buddy); /* buddy-signed-off */ static void buddy_signed_off(PurpleBuddy *buddy); -static void buddy_idle(PurpleBuddy *buddy, gboolean old_idle, gboolean idle); /* drawing-tooltip */ static void drawing_tooltip(PurpleBlistNode *node, GString *text, gboolean full); /* signed-on */ @@ -107,21 +106,20 @@ static void signed_off(PurpleConnection *gc); static void reset_all_last_message_times(gpointer key, gpointer value, gpointer user_data); static PurpleStatus * get_status_for(PurpleBuddy *buddy); -static void create_tables(); -static gboolean create_database_connection(); -static void destroy_database_connection(); +static void create_tables(void); +static gboolean create_database_connection(void); +static void destroy_database_connection(void); static guint word_count(const gchar *string); static void insert_status_change(CapStatistics *statistics); static void insert_status_change_from_purple_status(CapStatistics *statistics, PurpleStatus *status); static void insert_word_count(const char *sender, const char *receiver, guint count); -void display_statistics_action_cb(PurpleBlistNode *node, gpointer data); static gboolean plugin_load(PurplePlugin *plugin); static void add_plugin_functionality(PurplePlugin *plugin); static void cancel_conversation_timeouts(gpointer key, gpointer value, gpointer user_data); static void remove_plugin_functionality(PurplePlugin *plugin); static void write_stats_on_unload(gpointer key, gpointer value, gpointer user_data); static gboolean plugin_unload(PurplePlugin *plugin); -static CapPrefsUI * create_cap_prefs_ui(); +static CapPrefsUI * create_cap_prefs_ui(void); static void cap_prefs_ui_destroy_cb(GtkObject *object, gpointer user_data); static void numeric_spinner_prefs_cb(GtkSpinButton *spinbutton, gpointer user_data); static GtkWidget * get_config_frame(PurplePlugin *plugin); diff -r f182cf94145c -r 00eaff9396ec pidgin/plugins/convcolors.c --- a/pidgin/plugins/convcolors.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/plugins/convcolors.c Wed Feb 06 03:35:04 2008 +0000 @@ -77,7 +77,7 @@ FONT_UNDERLINE = 1 << 2 }; -struct +static struct { PurpleMessageFlags flag; char *prefix; @@ -129,6 +129,11 @@ if (purple_prefs_get_bool(PREF_IGNORE)) { + /* This seems to be necessary, especially for received messages. */ + t = *displaying; + *displaying = purple_strreplace(t, "\n", "
"); + g_free(t); + t = *displaying; *displaying = purple_markup_strip_html(t); g_free(t); diff -r f182cf94145c -r 00eaff9396ec pidgin/plugins/markerline.c --- a/pidgin/plugins/markerline.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/plugins/markerline.c Wed Feb 06 03:35:04 2008 +0000 @@ -190,13 +190,13 @@ } static void -detach_from_all_windows() +detach_from_all_windows(void) { g_list_foreach(pidgin_conv_windows_get_list(), (GFunc)detach_from_pidgin_window, NULL); } static void -attach_to_all_windows() +attach_to_all_windows(void) { g_list_foreach(pidgin_conv_windows_get_list(), (GFunc)attach_to_pidgin_window, NULL); } diff -r f182cf94145c -r 00eaff9396ec pidgin/plugins/pidginrc.c --- a/pidgin/plugins/pidginrc.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/plugins/pidginrc.c Wed Feb 06 03:35:04 2008 +0000 @@ -95,7 +95,7 @@ */ static GString * -make_gtkrc_string() +make_gtkrc_string(void) { gint i; gchar *prefbase = NULL; @@ -185,7 +185,7 @@ } static void -purplerc_make_changes() +purplerc_make_changes(void) { GString *str = make_gtkrc_string(); #if GTK_CHECK_VERSION(2,4,0) diff -r f182cf94145c -r 00eaff9396ec pidgin/plugins/spellchk.c --- a/pidgin/plugins/spellchk.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/plugins/spellchk.c Wed Feb 06 03:35:04 2008 +0000 @@ -695,7 +695,7 @@ return 1; } -static void load_conf() +static void load_conf(void) { /* Corrections to change "...", "(c)", "(r)", and "(tm)" to their * Unicode character equivalents were not added here even though @@ -1912,7 +1912,7 @@ save_list(); } -static void list_add_new() +static void list_add_new(void) { GtkTreeIter iter; const char *word = gtk_entry_get_text(GTK_ENTRY(bad_entry)); @@ -2015,7 +2015,7 @@ gtk_tree_row_reference_free(row_reference); } -static void list_delete() +static void list_delete(void) { GtkTreeSelection *sel; GSList *list = NULL; @@ -2161,14 +2161,13 @@ get_config_frame(PurplePlugin *plugin) { GtkWidget *ret, *vbox, *win; - GtkWidget *hbox, *label; + GtkWidget *hbox; GtkWidget *button; GtkSizeGroup *sg; GtkSizeGroup *sg2; GtkCellRenderer *renderer; GtkTreeViewColumn *column; GtkWidget *vbox2; - GtkWidget *hbox2; GtkWidget *vbox3; ret = gtk_vbox_new(FALSE, PIDGIN_HIG_CAT_SPACE); @@ -2275,37 +2274,15 @@ sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); sg2 = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); - hbox2 = gtk_hbox_new(FALSE, 2); - gtk_box_pack_start(GTK_BOX(vbox2), hbox2, FALSE, FALSE, 0); - gtk_widget_show(hbox2); - - label = gtk_label_new_with_mnemonic(_("You _type:")); - gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0); - gtk_size_group_add_widget(sg, label); - gtk_misc_set_alignment(GTK_MISC(label), 0, 0); - bad_entry = gtk_entry_new(); /* Set a minimum size. Since they're in a size group, the other entry will match up. */ gtk_widget_set_size_request(bad_entry, 350, -1); - gtk_box_pack_start(GTK_BOX(hbox2), bad_entry, TRUE, TRUE, 0); gtk_size_group_add_widget(sg2, bad_entry); - gtk_label_set_mnemonic_widget(GTK_LABEL(label), bad_entry); - gtk_widget_show(bad_entry); - - hbox2 = gtk_hbox_new(FALSE, 2); - gtk_box_pack_start(GTK_BOX(vbox2), hbox2, FALSE, FALSE, 0); - gtk_widget_show(hbox2); - - label = gtk_label_new_with_mnemonic(_("You _send:")); - gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0); - gtk_size_group_add_widget(sg, label); - gtk_misc_set_alignment(GTK_MISC(label), 0, 0); + pidgin_add_widget_to_vbox(GTK_BOX(vbox2), _("You _type:"), sg, bad_entry, FALSE, NULL); good_entry = gtk_entry_new(); - gtk_box_pack_start(GTK_BOX(hbox2), good_entry, TRUE, TRUE, 0); gtk_size_group_add_widget(sg2, good_entry); - gtk_label_set_mnemonic_widget(GTK_LABEL(label), good_entry); - gtk_widget_show(good_entry); + pidgin_add_widget_to_vbox(GTK_BOX(vbox2), _("You _send:"), sg, good_entry, FALSE, NULL); /* Created here so it can be passed to whole_words_button_toggled. */ case_toggle = gtk_check_button_new_with_mnemonic(_("_Exact case match (uncheck for automatic case handling)")); diff -r f182cf94145c -r 00eaff9396ec pidgin/plugins/ticker/ticker.c --- a/pidgin/plugins/ticker/ticker.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/plugins/ticker/ticker.c Wed Feb 06 03:35:04 2008 +0000 @@ -65,7 +65,7 @@ return TRUE; /* don't actually destroy the window */ } -static void buddy_ticker_create_window() { +static void buddy_ticker_create_window(void) { if(tickerwindow) { gtk_widget_show(tickerwindow); return; @@ -215,7 +215,7 @@ buddy_ticker_update_contact(c); } -static void buddy_ticker_show() +static void buddy_ticker_show(void) { PurpleBuddyList *list = purple_get_blist(); PurpleBlistNode *gnode, *cnode, *bnode; diff -r f182cf94145c -r 00eaff9396ec pidgin/plugins/xmppconsole.c --- a/pidgin/plugins/xmppconsole.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/plugins/xmppconsole.c Wed Feb 06 03:35:04 2008 +0000 @@ -727,7 +727,7 @@ } static void -create_console() +create_console(PurplePluginAction *action) { GtkWidget *vbox = gtk_vbox_new(FALSE, 6); GtkWidget *sw = gtk_scrolled_window_new(NULL, NULL); diff -r f182cf94145c -r 00eaff9396ec pidgin/win32/nsis/pidgin-installer.nsi --- a/pidgin/win32/nsis/pidgin-installer.nsi Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/win32/nsis/pidgin-installer.nsi Wed Feb 06 03:35:04 2008 +0000 @@ -700,7 +700,6 @@ Delete "$INSTDIR\ca-certs\GTE_CyberTrust_Global_Root.pem" Delete "$INSTDIR\ca-certs\Microsoft_Secure_Server_Authority.pem" Delete "$INSTDIR\ca-certs\StartCom_Free_SSL_CA.pem" - Delete "$INSTDIR\ca-certs\Verisign_Class3_Extended_Validation_CA.pem" Delete "$INSTDIR\ca-certs\Verisign_Class3_Primary_CA.pem" Delete "$INSTDIR\ca-certs\Verisign_RSA_Secure_Server_CA.pem" RMDir "$INSTDIR\ca-certs" @@ -1168,7 +1167,10 @@ MessageBox MB_RETRYCANCEL|MB_ICONEXCLAMATION $(PIDGIN_IS_RUNNING) /SD IDCANCEL IDRETRY retry_runcheck Abort - done: + ; Close the Handle (If we don't do this, the uninstaller called from within will fail) + ; This is not optimal because there is a (small) window of time when a new process could start + System::Call 'kernel32::CloseHandle(i $R1) i .R1' + Pop $R1 Pop $R0 FunctionEnd @@ -1264,7 +1266,7 @@ ClearErrors ${GetOptions} "$R0" "/DS=" $R1 - IfErrors +7 + IfErrors +8 SectionGetFlags ${SecDesktopShortcut} $R2 StrCmp "1" $R1 0 +2 IntOp $R2 $R2 | ${SF_SELECTED} @@ -1275,7 +1277,7 @@ ClearErrors ${GetOptions} "$R0" "/SMS=" $R1 - IfErrors +7 + IfErrors +8 SectionGetFlags ${SecStartMenuShortcut} $R2 StrCmp "1" $R1 0 +2 IntOp $R2 $R2 | ${SF_SELECTED} diff -r f182cf94145c -r 00eaff9396ec pidgin/win32/winpidgin.c --- a/pidgin/win32/winpidgin.c Sun Jan 13 00:29:56 2008 +0000 +++ b/pidgin/win32/winpidgin.c Wed Feb 06 03:35:04 2008 +0000 @@ -450,23 +450,25 @@ if ((h = CreateMutex(NULL, FALSE, "pidgin_is_running"))) { DWORD err = GetLastError(); - if (err == ERROR_ALREADY_EXISTS && fail_if_running) { - HWND msg_win; + if (err == ERROR_ALREADY_EXISTS) { + if (fail_if_running) { + HWND msg_win; - printf("An instance of Pidgin is already running.\n"); + printf("An instance of Pidgin is already running.\n"); - if((msg_win = FindWindowEx(HWND_MESSAGE, NULL, TEXT("WinpidginMsgWinCls"), NULL))) - if(SendMessage(msg_win, PIDGIN_WM_FOCUS_REQUEST, (WPARAM) NULL, (LPARAM) NULL)) - return FALSE; + if((msg_win = FindWindowEx(HWND_MESSAGE, NULL, TEXT("WinpidginMsgWinCls"), NULL))) + if(SendMessage(msg_win, PIDGIN_WM_FOCUS_REQUEST, (WPARAM) NULL, (LPARAM) NULL)) + return FALSE; - /* If we get here, the focus request wasn't successful */ + /* If we get here, the focus request wasn't successful */ - MessageBox(NULL, - "An instance of Pidgin is already running", - NULL, MB_OK | MB_TOPMOST); + MessageBox(NULL, + "An instance of Pidgin is already running", + NULL, MB_OK | MB_TOPMOST); - return FALSE; - } else + return FALSE; + } + } else if (err != ERROR_SUCCESS) printf("Error (%u) accessing \"pidgin_is_running\" mutex.\n", (UINT) err); } return TRUE; diff -r f182cf94145c -r 00eaff9396ec po/POTFILES.in --- a/po/POTFILES.in Sun Jan 13 00:29:56 2008 +0000 +++ b/po/POTFILES.in Wed Feb 06 03:35:04 2008 +0000 @@ -7,11 +7,13 @@ finch/gntconv.c finch/gntdebug.c finch/gntft.c +finch/gntlog.c finch/gntnotify.c finch/gntplugin.c finch/gntpounce.c finch/gntprefs.c finch/gntrequest.c +finch/gntroomlist.c finch/gntsound.c finch/gntstatus.c finch/gntui.c @@ -32,6 +34,7 @@ finch/plugins/gntclipboard.c finch/plugins/gntgf.c finch/plugins/gnthistory.c +finch/plugins/grouping.c finch/plugins/lastlog.c libpurple/account.c libpurple/blist.c @@ -71,6 +74,7 @@ libpurple/protocols/bonjour/bonjour.c libpurple/protocols/bonjour/bonjour.h libpurple/protocols/bonjour/jabber.c +libpurple/protocols/bonjour/mdns_win32.c libpurple/protocols/gg/gg.c libpurple/protocols/irc/cmds.c libpurple/protocols/irc/dcc_send.c @@ -212,6 +216,7 @@ pidgin/pidgin.h pidgin/pidgincombobox.c pidgin/pidginstock.c +pidgin/pidgintooltip.c pidgin/pixmaps/emotes/default/24/default.theme.in pidgin/pixmaps/emotes/none/none.theme.in pidgin/plugins/cap/cap.c diff -r f182cf94145c -r 00eaff9396ec po/check_po.pl --- a/po/check_po.pl Sun Jan 13 00:29:56 2008 +0000 +++ b/po/check_po.pl Wed Feb 06 03:35:04 2008 +0000 @@ -1,4 +1,4 @@ -#!/usr/bin/perl -w +#!/usr/bin/env perl -w # # check_po.pl - check po file translations for likely errors # diff -r f182cf94145c -r 00eaff9396ec po/de.po --- a/po/de.po Sun Jan 13 00:29:56 2008 +0000 +++ b/po/de.po Wed Feb 06 03:35:04 2008 +0000 @@ -11,8 +11,8 @@ msgstr "" "Project-Id-Version: de\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2007-12-19 10:17+0100\n" -"PO-Revision-Date: 2007-12-19 10:17+0100\n" +"POT-Creation-Date: 2008-01-23 10:20+0100\n" +"PO-Revision-Date: 2008-01-23 10:19+0100\n" "Last-Translator: Jochen Kemnade \n" "Language-Team: Deutsch \n" "MIME-Version: 1.0\n" @@ -155,6 +155,29 @@ msgid "Deny" msgstr "Ablehnen" +#, c-format +msgid "" +"Online: %d\n" +"Total: %d" +msgstr "" +"Online: %d\n" +"Gesamt: %d" + +#, c-format +msgid "Account: %s (%s)" +msgstr "Konto: %s (%s)" + +#, c-format +msgid "" +"\n" +"Last Seen: %s ago" +msgstr "" +"\n" +"Zuletzt gesehen: vor %s" + +msgid "Default" +msgstr "Standard" + msgid "You must provide a screename for the buddy." msgstr "Sie müssen einen Benutzernamen für den Buddy angeben." @@ -303,26 +326,6 @@ msgid "On Mobile" msgstr "Am Handy" -#, c-format -msgid "" -"Online: %d\n" -"Total: %d" -msgstr "" -"Online: %d\n" -"Gesamt: %d" - -#, c-format -msgid "Account: %s (%s)" -msgstr "Konto: %s (%s)" - -#, c-format -msgid "" -"\n" -"Last Seen: %s ago" -msgstr "" -"\n" -"Zuletzt gesehen: vor %s" - msgid "New..." msgstr "Neu..." @@ -389,6 +392,15 @@ msgid "By Log Size" msgstr "Nach Größe der Logs" +msgid "Buddy" +msgstr "Buddy" + +msgid "Chat" +msgstr "Chat" + +msgid "Grouping" +msgstr "Gruppierung" + msgid "Certificate Import" msgstr "Zertifikat-Import" @@ -1022,6 +1034,16 @@ msgid "Choose Location..." msgstr "Wählen Sie einen Ort..." +msgid "Hit 'Enter' to find more rooms of this category." +msgstr "Drücken Sie 'Enter', um mehr Räume dieser Kategorie zu finden." + +msgid "Get" +msgstr "Holen" + +#. Create the window. +msgid "Room List" +msgstr "Raumliste" + msgid "Buddy logs in" msgstr "Buddy meldet sich an" @@ -1311,6 +1333,27 @@ "Wenn eine neue Unterhaltung eröffnet wird, fügt dieses Plugin die letzte " "Unterhaltung in die aktuelle Unterhaltung ein." +msgid "Online" +msgstr "Online" + +msgid "Offline" +msgstr "Offline" + +msgid "Online Buddies" +msgstr "Online-Buddys" + +msgid "Offline Buddies" +msgstr "Offline-Buddys" + +msgid "Online/Offline" +msgstr "Online/Offline" + +msgid "No Grouping" +msgstr "Keine Gruppierung" + +msgid "Provides alternate buddylist grouping options." +msgstr "Bietet alternative Einstellungen für die Kontaktlisten-Gruppierung." + msgid "Lastlog" msgstr "Verlauf" @@ -1436,19 +1479,6 @@ msgstr "Ze_rtifikat ansehen..." #. Prompt the user to authenticate the certificate -#. TODO: Provide the user with more guidance about why he is -#. being prompted -#. vrq will be completed by user_auth -#, c-format -msgid "" -"The certificate presented by \"%s\" claims to be from \"%s\" instead. This " -"could mean that you are not connecting to the service you believe you are." -msgstr "" -"Das Zertifikat, welches von „%s“ präsentiert wurde, behauptet stattdessen " -"von „%s“ zu kommen. Das kann bedeuten, dass Sie tatsächlich nicht mit dem " -"Dienst verbunden sind, mit dem Sie glauben verbunden zu sein." - -#. Prompt the user to authenticate the certificate #. vrq will be completed by user_auth #, c-format msgid "" @@ -1498,6 +1528,19 @@ msgid "Invalid certificate authority signature" msgstr "Unbekannte Zertifizierungsstellensignatur" +#. Prompt the user to authenticate the certificate +#. TODO: Provide the user with more guidance about why he is +#. being prompted +#. vrq will be completed by user_auth +#, c-format +msgid "" +"The certificate presented by \"%s\" claims to be from \"%s\" instead. This " +"could mean that you are not connecting to the service you believe you are." +msgstr "" +"Das Zertifikat, welches von „%s“ präsentiert wurde, behauptet stattdessen " +"von „%s“ zu kommen. Das kann bedeuten, dass Sie tatsächlich nicht mit dem " +"Dienst verbunden sind, mit dem Sie glauben verbunden zu sein." + #. Make messages #, c-format msgid "" @@ -2678,6 +2721,9 @@ msgid "Could not listen on socket" msgstr "Kann nicht an der Socket hören" +msgid "Error communicating with local mDNSResponder." +msgstr "Fehler bei der Kommunikation mit lokalem mDNSResponder." + msgid "Invalid proxy settings" msgstr "Falsche Proxy-Einstellungen" @@ -2809,9 +2855,6 @@ msgid "Add to chat..." msgstr "Zum Chat hinzufügen..." -msgid "Offline" -msgstr "Offline" - msgid "Available" msgstr "Verfügbar" @@ -3285,6 +3328,10 @@ msgid "nickserv: Send a command to nickserv" msgstr "nickserv: Sendet ein Kommando zum Nickserv" +msgid "notice <target<: Send a notice to a user or channel." +msgstr "" +"notice <Ziel>: Sende eine Notiz an einen Benutzer oder an einen Kanal." + msgid "" "op <nick1> [nick2] ...: Grant channel operator status to someone. You " "must be a channel operator to do this." @@ -3971,8 +4018,8 @@ msgid "Mood" msgstr "Stimmung" -msgid "Current media" -msgstr "Aktuelles Medium" +msgid "Now Listening" +msgstr "Hört gerade" msgid "Mood Text" msgstr "Stimmungstext" @@ -4223,6 +4270,8 @@ msgid "Unable to buzz, because the user %s does not support it." msgstr "Kann nicht anklopfen, da der Benutzer %s dies nicht unterstützt." +#. Yahoo only supports one attention command: the 'buzz'. +#. This is index number YAHOO_BUZZ. msgid "Buzz" msgstr "Anklopfen" @@ -5957,9 +6006,6 @@ msgid "AIM Direct IM" msgstr "AIM direkte Nachricht" -msgid "Chat" -msgstr "Chat" - msgid "Get File" msgstr "Datei abrufen" @@ -6029,9 +6075,6 @@ msgid "Invisible" msgstr "Unsichtbar" -msgid "Online" -msgstr "Online" - msgid "IP Address" msgstr "IP-Adresse" @@ -9137,6 +9180,10 @@ msgid "Unable to establish file descriptor." msgstr "Konnte Dateibeschreibung nicht erstellen." +#, c-format +msgid "%s is trying to send you a group of %d files.\n" +msgstr "%s versucht, Ihnen eine Gruppe von %d Dateien zu senden.\n" + msgid "Write Error" msgstr "Schreibfehler" @@ -9632,6 +9679,14 @@ msgid "Unable to connect to %s: %s" msgstr "Verbindung zu %s nicht möglich: %s" +#, c-format +msgid " - %s" +msgstr " - %s" + +#, c-format +msgid " (%s)" +msgstr " (%s)" + #. 10053 #, c-format msgid "Connection interrupted by other software on your computer." @@ -9640,7 +9695,7 @@ "unterbrochen." #. 10054 -#, fuzzy, c-format +#, c-format msgid "Remote host closed connection." msgstr "Der entfernte Host hat die Verbindung beendet." @@ -9908,6 +9963,12 @@ "Sie sind im Moment nicht mit einem Konto angemeldet, welches benutzt werden " "kann, um diesen Buddy hinzuzufügen." +#. I don't believe this can happen currently, I think +#. * everything that calls this function checks for one of the +#. * above node types first. +msgid "Unknown node type" +msgstr "Unbekannter Knotentyp" + #. Buddies menu msgid "/_Buddies" msgstr "/_Buddys" @@ -10009,12 +10070,8 @@ msgstr "/Hilfe/Ü_ber" #, c-format -msgid "" -"\n" -"Account: %s" -msgstr "" -"\n" -"Konto: %s" +msgid "Account: %s" +msgstr "Konto: %s" #, c-format msgid "" @@ -10045,6 +10102,9 @@ msgid "Rockin'" msgstr "Abgefahren" +msgid "Total Buddies" +msgstr "Buddy-Anzahl" + #, c-format msgid "Idle %dd %dh %02dm" msgstr "Untätig %dd %dh %02dm" @@ -10460,16 +10520,13 @@ msgid "User is typing..." msgstr "Benutzer tippt gerade..." -msgid "User has typed something and stopped" -msgstr "Benutzer hat etwas getippt und wartet nun" - #, c-format msgid "" "\n" -"%s has typed something and stopped" +"%s has stopped typing" msgstr "" "\n" -"%s hat etwas getippt und wartet nun" +"%s hat aufgehört zu tippen" #. Build the Send To menu msgid "S_end To" @@ -11108,31 +11165,33 @@ msgstr "" "Farbe zum Darstellen von Hyperlinks, wenn sich die Maus darüber befindet." -#, fuzzy msgid "Sent Message Name Color" -msgstr "Gesendete Nachrichten" +msgstr "Farbe des Absendernamens für gesendete Nachrichten" msgid "Color to draw the name of a message you sent." msgstr "" - -#, fuzzy +"Farbe, mit der der Name in einer gesendeten Nachricht dargestellt wird." + msgid "Received Message Name Color" -msgstr "Empfangene Nachrichten" +msgstr "Farbe des Absendernamens für empfangene Nachrichten" msgid "Color to draw the name of a message you received." msgstr "" +"Farbe, mit der der Name in einer empfangenen Nachricht dargestellt wird." msgid "\"Attention\" Name Color" -msgstr "" +msgstr "Farbe des Absendernamens für \"Achtung\"-Nachrichten" msgid "Color to draw the name of a message you received containing your name." msgstr "" +"Farbe, mit der der Name in einer Nachricht dargestellt wird, die Ihren Namen " +"enthält." msgid "Action Message Name Color" -msgstr "" +msgstr "Farbe des Absendernamens für Aktions-Nachrichten" msgid "Color to draw the name of an action message." -msgstr "" +msgstr "Farbe, mit der der Name in einer Aktions-Nachricht dargestellt wird." msgid "_Copy E-Mail Address" msgstr "Kopiere _E-Mail-Adresse" @@ -11187,15 +11246,6 @@ msgid "_Save Image..." msgstr "Bild _speichern..." -msgid "_Font" -msgstr "_Schrift" - -msgid "_Insert" -msgstr "_Einfügen" - -msgid "S_mile!" -msgstr "_Lächeln!" - msgid "Select Font" msgstr "Schriftart wählen" @@ -11224,6 +11274,9 @@ msgid "Insert Link" msgstr "Link einfügen" +msgid "_Insert" +msgstr "_Einfügen" + #, c-format msgid "Failed to store image: %s\n" msgstr "Speichern des Bildes fehlgeschlagen: %s\n" @@ -11231,12 +11284,14 @@ msgid "Insert Image" msgstr "Bild einfügen" +msgid "Smile!" +msgstr "Lächeln!" + msgid "This theme has no available smileys." msgstr "Dieses Thema verfügt über keine Smileys." -#. show everything -msgid "Smile!" -msgstr "Lächeln!" +msgid "_Font" +msgstr "_Schrift" msgid "Group Items" msgstr "Elemente gruppieren" @@ -11657,9 +11712,6 @@ msgid "Pounce Target" msgstr "Alarm-Ziel" -msgid "Default" -msgstr "Standard" - msgid "Smiley theme failed to unpack." msgstr "Smiley-Thema konnte nicht entpackt werden." @@ -12029,7 +12081,6 @@ msgid "Changes to privacy settings take effect immediately." msgstr "Einstellungen bzgl. der Privatsphäre werden sofort wirksam." -#. "Set privacy for:" label msgid "Set privacy for:" msgstr "Setze Privatsphäre für:" @@ -12093,10 +12144,6 @@ msgid "Select Folder..." msgstr "Ordner auswählen..." -#. Create the window. -msgid "Room List" -msgstr "Raumliste" - #. list button msgid "_Get List" msgstr "_Liste abrufen" @@ -12275,6 +12322,9 @@ msgid "_Open Mail" msgstr "Mail ö_ffnen" +msgid "Pidgin Tooltip" +msgstr "Pidgin-Tooltip" + msgid "Pidgin smileys" msgstr "Pidgin-Smileys" @@ -12287,9 +12337,6 @@ msgid "none" msgstr "keine" -msgid "Display Statistics" -msgstr "Statistik anzeigen" - msgid "Response Probability:" msgstr "Antwortwahrscheinlichkeit:" @@ -12850,9 +12897,8 @@ msgid "Hyperlink Color" msgstr "Hyperlink-Farbe" -#, fuzzy msgid "Highlighted Message Name Color" -msgstr "Hervorgehobene Nachrichten" +msgstr "Farbe des Absendernamens für hervorgehobene Nachrichten" msgid "GtkTreeView Horizontal Separation" msgstr "GtkTreeview horizontaler Abstand" @@ -12861,7 +12907,7 @@ msgstr "Unterhaltungseintrag" msgid "Request Dialog" -msgstr "Dialog anfordern" +msgstr "Anfrage-Dialog" msgid "Notify Dialog" msgstr "Benachrichtigungsdialog" diff -r f182cf94145c -r 00eaff9396ec po/en_GB.po --- a/po/en_GB.po Sun Jan 13 00:29:56 2008 +0000 +++ b/po/en_GB.po Wed Feb 06 03:35:04 2008 +0000 @@ -3315,7 +3315,7 @@ #: ../libpurple/plugins/psychic.c:72 msgid "You feel a disturbance in the force..." -msgstr "You have a disturbance in the force..." +msgstr "You feel a disturbance in the force..." #: ../libpurple/plugins/psychic.c:91 msgid "Only enable for users on the buddy list" diff -r f182cf94145c -r 00eaff9396ec po/nb.po --- a/po/nb.po Sun Jan 13 00:29:56 2008 +0000 +++ b/po/nb.po Wed Feb 06 03:35:04 2008 +0000 @@ -1,10 +1,12 @@ -# translation of nb.po to Norsk bokmål -# Gaim Norwegian translation +# translation of nb.po to Norsk +# Pidgin Norwegian Bokmål translation # Copyright (C) 2003, Petter Johan Olsen # Copyright (C) 2005, Kyrre Ness Sjøbæk +# Copyright (C), Hallvard Glad # -# This file is distributed under the same license as the Gaim package. +# This file is distributed under the same license as the Pidgin package. # +# Hallvard Glad , 2007. # Contributors: # Petter Johan Olsen initial translation for 0.62 # Eivind Tagseth (eivindt@multinet.no) corrections, updates @@ -13,30 +15,32 @@ # Kyrre Ness Sjobak, updates for 1.x # Kyrre Ness Sjobak, updates for 1.3 # Hallvard Glad, updates for 2.0BETA6 +# Hallvard Glad, updates for 2.2.3 msgid "" msgstr "" "Project-Id-Version: nb\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2007-09-28 15:32-0500\n" -"PO-Revision-Date: 2005-06-08 15:51+0200\n" +"POT-Creation-Date: 2007-09-26 09:23-0400\n" +"PO-Revision-Date: 2007-12-30 14:04+0100\n" "Last-Translator: Hallvard Glad \n" -"Language-Team: Norsk bokmål \n" +"Language-Team: Norsk \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: KBabel 1.3.1\n" - -#: ../finch/finch.c:64 ../finch/finch.c:301 ../finch/finch.c:330 +"X-Generator: KBabel 1.11.4\n" + +#: ../finch/finch.c:64 +#: ../finch/finch.c:301 +#: ../finch/finch.c:330 #: ../finch/finch.c:418 -#, fuzzy msgid "Finch" -msgstr "Fransk" +msgstr "Finch" #: ../finch/finch.c:206 -#, fuzzy, c-format +#, c-format msgid "%s. Try `%s -h' for more information.\n" -msgstr "Gaim %s. Prøv '%s -h' for mer informasjon.\n" +msgstr "%s. Prøv '%s -h' for mer informasjon.\n" #: ../finch/finch.c:208 #, c-format @@ -50,43 +54,58 @@ " -n, --nologin don't automatically login\n" " -v, --version display the current version and exit\n" msgstr "" - -#: ../finch/finch.c:328 ../pidgin/gtkmain.c:711 -#, c-format -msgid "" -"%s encountered errors migrating your settings from %s to %s. Please " -"investigate and complete the migration by hand. Please report this error at " +"%s\n" +"Bruk: %s [Valg]...\n" +"\n" +" -c, --config=DIR bruk DIR for konfigurasjonsfiler\n" +" -d, --debug skriv debugging beskjeder til stdout\n" +" -h, --help vis denne hjelpen og avslutt\n" +" -n, --nologin ikke logg automatisk inn\n" +" -v, --version vis den nåværende versjon og avslutt\n" + +#: ../finch/finch.c:328 +#: ../pidgin/gtkmain.c:718 +#, c-format +msgid "%s encountered errors migrating your settings from %s to %s. Please investigate and complete the migration by hand. Please report this error at http://developer.pidgin.im" +msgstr "" +"%s det inntraff en feil i migreringen av ditt oppsett fra %s til %s. Vennligst undersøk og gjør ferdig migreringen for hånd. Vennligst raporter denne feilen på " "http://developer.pidgin.im" -msgstr "" - -#: ../finch/gntaccount.c:124 ../finch/gntaccount.c:484 ../finch/gntblist.c:300 -#: ../finch/gntblist.c:433 ../finch/gntblist.c:446 ../finch/gntplugin.c:186 -#: ../finch/gntplugin.c:234 ../finch/gntstatus.c:301 ../finch/gntstatus.c:310 -#: ../finch/plugins/gntclipboard.c:115 ../finch/plugins/gntclipboard.c:121 + +#: ../finch/gntaccount.c:124 +#: ../finch/gntaccount.c:484 +#: ../finch/gntblist.c:300 +#: ../finch/gntblist.c:433 +#: ../finch/gntblist.c:446 +#: ../finch/gntplugin.c:186 +#: ../finch/gntplugin.c:234 +#: ../finch/gntstatus.c:301 +#: ../finch/gntstatus.c:310 +#: ../finch/plugins/gntclipboard.c:115 +#: ../finch/plugins/gntclipboard.c:121 #: ../finch/plugins/gntclipboard.c:128 -#: ../libpurple/protocols/jabber/buddy.c:2029 +#: ../libpurple/protocols/jabber/buddy.c:2032 #: ../libpurple/protocols/jabber/chat.c:677 #: ../libpurple/protocols/jabber/chat.c:688 #: ../libpurple/protocols/jabber/jabber.c:1515 #: ../libpurple/protocols/qq/group_join.c:328 -#: ../libpurple/protocols/qq/im.c:576 ../libpurple/protocols/silc/ops.c:57 +#: ../libpurple/protocols/qq/im.c:576 +#: ../libpurple/protocols/silc/ops.c:57 #: ../libpurple/protocols/silc/ops.c:1456 #: ../libpurple/protocols/silc10/ops.c:1451 msgid "Error" msgstr "Feil" #: ../finch/gntaccount.c:124 -#, fuzzy msgid "Account was not added" -msgstr "Kontoen har blitt deaktivert" +msgstr "Kontoen ble ikke lagt til" #: ../finch/gntaccount.c:125 msgid "Screenname of an account must be non-empty." -msgstr "" +msgstr "Skjermnavnet for en konto kan ikke være tomt." #: ../finch/gntaccount.c:437 msgid "New mail notifications" -msgstr "Varsling om ny e-post" +msgstr "Varsling om nye e-poster" #: ../finch/gntaccount.c:447 msgid "Remember password" @@ -94,30 +113,31 @@ #: ../finch/gntaccount.c:485 msgid "There's no protocol plugins installed." -msgstr "" +msgstr "Det er ingen protokolltillegg installert." #: ../finch/gntaccount.c:486 msgid "(You probably forgot to 'make install'.)" -msgstr "" - -#: ../finch/gntaccount.c:496 ../finch/gntconn.c:136 -#: ../pidgin/gtkaccount.c:1473 ../pidgin/gtkblist.c:4040 +msgstr "(Du har sikkert glemt 'make install'.)" + +#: ../finch/gntaccount.c:496 +#: ../finch/gntconn.c:137 +#: ../pidgin/gtkaccount.c:1473 +#: ../pidgin/gtkblist.c:4322 msgid "Modify Account" msgstr "Endre konto" # #: ../finch/gntaccount.c:496 -#, fuzzy msgid "New Account" -msgstr "Konto" - -#: ../finch/gntaccount.c:521 ../pidgin/gtkft.c:696 +msgstr "Ny konto" + +#: ../finch/gntaccount.c:521 +#: ../pidgin/gtkft.c:696 msgid "Protocol:" msgstr "Protokoll:" #: ../finch/gntaccount.c:529 #: ../pidgin/plugins/gevolution/new_person_dialog.c:290 -#, fuzzy msgid "Screen name:" msgstr "Skjermnavn:" @@ -131,21 +151,37 @@ #. Cancel button #. Cancel -#: ../finch/gntaccount.c:575 ../finch/gntaccount.c:638 -#: ../finch/gntaccount.c:889 ../finch/gntblist.c:344 ../finch/gntblist.c:421 -#: ../finch/gntblist.c:456 ../finch/gntblist.c:803 ../finch/gntblist.c:1005 -#: ../finch/gntblist.c:1101 ../finch/gntblist.c:2222 ../finch/gntcertmgr.c:91 -#: ../finch/gntplugin.c:379 ../finch/gntpounce.c:459 ../finch/gntpounce.c:667 -#: ../finch/gntprefs.c:265 ../finch/gntsound.c:1058 ../finch/gntstatus.c:145 -#: ../finch/gntstatus.c:485 ../finch/gntstatus.c:610 -#: ../libpurple/account.c:1013 ../libpurple/account.c:1263 -#: ../libpurple/account.c:1298 ../libpurple/conversation.c:1215 -#: ../libpurple/plugins/buddynote.c:51 ../libpurple/protocols/gg/gg.c:507 -#: ../libpurple/protocols/gg/gg.c:666 ../libpurple/protocols/gg/gg.c:803 +#: ../finch/gntaccount.c:575 +#: ../finch/gntaccount.c:638 +#: ../finch/gntaccount.c:889 +#: ../finch/gntblist.c:344 +#: ../finch/gntblist.c:421 +#: ../finch/gntblist.c:456 +#: ../finch/gntblist.c:803 +#: ../finch/gntblist.c:1005 +#: ../finch/gntblist.c:1101 +#: ../finch/gntblist.c:2224 +#: ../finch/gntcertmgr.c:91 +#: ../finch/gntplugin.c:379 +#: ../finch/gntpounce.c:459 +#: ../finch/gntpounce.c:667 +#: ../finch/gntprefs.c:265 +#: ../finch/gntsound.c:1058 +#: ../finch/gntstatus.c:145 +#: ../finch/gntstatus.c:485 +#: ../finch/gntstatus.c:610 +#: ../libpurple/account.c:1013 +#: ../libpurple/account.c:1263 +#: ../libpurple/account.c:1298 +#: ../libpurple/conversation.c:1215 +#: ../libpurple/plugins/buddynote.c:51 +#: ../libpurple/protocols/gg/gg.c:507 +#: ../libpurple/protocols/gg/gg.c:666 +#: ../libpurple/protocols/gg/gg.c:803 #: ../libpurple/protocols/gg/gg.c:884 #: ../libpurple/protocols/jabber/buddy.c:728 -#: ../libpurple/protocols/jabber/buddy.c:2413 -#: ../libpurple/protocols/jabber/buddy.c:2449 +#: ../libpurple/protocols/jabber/buddy.c:2416 +#: ../libpurple/protocols/jabber/buddy.c:2452 #: ../libpurple/protocols/jabber/chat.c:786 #: ../libpurple/protocols/jabber/jabber.c:1008 #: ../libpurple/protocols/jabber/jabber.c:1017 @@ -154,10 +190,12 @@ #: ../libpurple/protocols/jabber/usermood.c:184 #: ../libpurple/protocols/jabber/usernick.c:78 #: ../libpurple/protocols/jabber/xdata.c:400 -#: ../libpurple/protocols/msn/msn.c:287 ../libpurple/protocols/msn/msn.c:304 -#: ../libpurple/protocols/msn/msn.c:321 ../libpurple/protocols/msn/msn.c:338 -#: ../libpurple/protocols/msn/msn.c:359 -#: ../libpurple/protocols/oscar/oscar.c:6094 +#: ../libpurple/protocols/msn/msn.c:290 +#: ../libpurple/protocols/msn/msn.c:307 +#: ../libpurple/protocols/msn/msn.c:324 +#: ../libpurple/protocols/msn/msn.c:341 +#: ../libpurple/protocols/msn/msn.c:362 +#: ../libpurple/protocols/oscar/oscar.c:6092 #: ../libpurple/protocols/oscar/peer.c:1046 #: ../libpurple/protocols/qq/buddy_info.c:484 #: ../libpurple/protocols/qq/buddy_opt.c:214 @@ -192,176 +230,231 @@ #: ../libpurple/protocols/silc10/ops.c:1904 #: ../libpurple/protocols/silc10/silc.c:736 #: ../libpurple/protocols/silc10/silc.c:942 -#: ../libpurple/protocols/yahoo/yahoo.c:1032 -#: ../libpurple/protocols/yahoo/yahoo.c:3498 -#: ../libpurple/protocols/yahoo/yahoo.c:3509 ../pidgin/gtkaccount.c:1908 -#: ../pidgin/gtkaccount.c:2495 ../pidgin/gtkblist.c:5967 -#: ../pidgin/gtkcertmgr.c:197 ../pidgin/gtkdialogs.c:773 -#: ../pidgin/gtkdialogs.c:912 ../pidgin/gtkdialogs.c:1004 -#: ../pidgin/gtkdialogs.c:1024 ../pidgin/gtkdialogs.c:1048 -#: ../pidgin/gtkdialogs.c:1070 ../pidgin/gtkdialogs.c:1118 -#: ../pidgin/gtkdialogs.c:1159 ../pidgin/gtkdialogs.c:1215 -#: ../pidgin/gtkdialogs.c:1254 ../pidgin/gtkdialogs.c:1281 -#: ../pidgin/gtkimhtmltoolbar.c:435 ../pidgin/gtklog.c:328 -#: ../pidgin/gtkplugin.c:289 ../pidgin/gtkpounce.c:1101 -#: ../pidgin/gtkprivacy.c:563 ../pidgin/gtkprivacy.c:579 -#: ../pidgin/gtkprivacy.c:604 ../pidgin/gtkprivacy.c:618 -#: ../pidgin/gtkrequest.c:271 ../pidgin/gtksavedstatuses.c:345 +#: ../libpurple/protocols/yahoo/yahoo.c:1031 +#: ../libpurple/protocols/yahoo/yahoo.c:3497 +#: ../libpurple/protocols/yahoo/yahoo.c:3508 +#: ../pidgin/gtkaccount.c:1908 +#: ../pidgin/gtkaccount.c:2495 +#: ../pidgin/gtkblist.c:6267 +#: ../pidgin/gtkcertmgr.c:197 +#: ../pidgin/gtkdialogs.c:769 +#: ../pidgin/gtkdialogs.c:908 +#: ../pidgin/gtkdialogs.c:1000 +#: ../pidgin/gtkdialogs.c:1020 +#: ../pidgin/gtkdialogs.c:1044 +#: ../pidgin/gtkdialogs.c:1066 +#: ../pidgin/gtkdialogs.c:1114 +#: ../pidgin/gtkdialogs.c:1155 +#: ../pidgin/gtkdialogs.c:1211 +#: ../pidgin/gtkdialogs.c:1250 +#: ../pidgin/gtkdialogs.c:1277 +#: ../pidgin/gtkimhtmltoolbar.c:435 +#: ../pidgin/gtklog.c:328 +#: ../pidgin/gtkplugin.c:289 +#: ../pidgin/gtkpounce.c:1101 +#: ../pidgin/gtkprivacy.c:563 +#: ../pidgin/gtkprivacy.c:579 +#: ../pidgin/gtkprivacy.c:604 +#: ../pidgin/gtkprivacy.c:618 +#: ../pidgin/gtkrequest.c:271 +#: ../pidgin/gtksavedstatuses.c:345 #: ../pidgin/gtkstatusbox.c:1574 msgid "Cancel" -msgstr "_Avbryt" +msgstr "Avbryt" #. Save button #. Save -#: ../finch/gntaccount.c:579 ../finch/gntcertmgr.c:311 -#: ../finch/gntplugin.c:379 ../finch/gntpounce.c:465 ../finch/gntprefs.c:265 -#: ../finch/gntsound.c:1055 ../finch/gntstatus.c:488 ../finch/gntstatus.c:598 -#: ../libpurple/account.c:1297 ../libpurple/plugins/buddynote.c:50 -#: ../libpurple/protocols/jabber/buddy.c:727 ../pidgin/gtkdebug.c:749 +#: ../finch/gntaccount.c:579 +#: ../finch/gntcertmgr.c:311 +#: ../finch/gntplugin.c:379 +#: ../finch/gntpounce.c:465 +#: ../finch/gntprefs.c:265 +#: ../finch/gntsound.c:1055 +#: ../finch/gntstatus.c:488 +#: ../finch/gntstatus.c:598 +#: ../libpurple/account.c:1297 +#: ../libpurple/plugins/buddynote.c:50 +#: ../libpurple/protocols/jabber/buddy.c:727 +#: ../pidgin/gtkdebug.c:749 #: ../pidgin/gtkrequest.c:277 msgid "Save" msgstr "Lagre" -#: ../finch/gntaccount.c:632 ../pidgin/gtkaccount.c:1900 -#: ../pidgin/gtksavedstatuses.c:333 ../pidgin/gtkstatusbox.c:1568 +#: ../finch/gntaccount.c:632 +#: ../pidgin/gtkaccount.c:1900 +#: ../pidgin/gtksavedstatuses.c:333 +#: ../pidgin/gtkstatusbox.c:1568 #, c-format msgid "Are you sure you want to delete %s?" msgstr "Er du sikker på at du vil slette %s?" -# #: ../finch/gntaccount.c:635 -#, fuzzy msgid "Delete Account" -msgstr "Konto" +msgstr "Slett konto" #. Delete button -#: ../finch/gntaccount.c:637 ../finch/gntaccount.c:707 -#: ../finch/gntcertmgr.c:319 ../finch/gntpounce.c:666 ../finch/gntpounce.c:729 -#: ../finch/gntstatus.c:144 ../finch/gntstatus.c:210 -#: ../pidgin/gtkaccount.c:1907 ../pidgin/gtklog.c:327 -#: ../pidgin/gtkpounce.c:1100 ../pidgin/gtkrequest.c:274 -#: ../pidgin/gtksavedstatuses.c:344 ../pidgin/gtkstatusbox.c:1573 +#: ../finch/gntaccount.c:637 +#: ../finch/gntaccount.c:707 +#: ../finch/gntcertmgr.c:319 +#: ../finch/gntpounce.c:666 +#: ../finch/gntpounce.c:729 +#: ../finch/gntstatus.c:144 +#: ../finch/gntstatus.c:210 +#: ../pidgin/gtkaccount.c:1907 +#: ../pidgin/gtklog.c:327 +#: ../pidgin/gtkpounce.c:1100 +#: ../pidgin/gtkrequest.c:274 +#: ../pidgin/gtksavedstatuses.c:344 +#: ../pidgin/gtkstatusbox.c:1573 msgid "Delete" msgstr "Slett" -#: ../finch/gntaccount.c:669 ../finch/gntblist.c:2119 ../finch/gntui.c:82 -#: ../pidgin/gtkaccount.c:2325 ../pidgin/gtkdocklet.c:522 +#: ../finch/gntaccount.c:669 +#: ../finch/gntblist.c:2121 +#: ../finch/gntui.c:82 +#: ../pidgin/gtkaccount.c:2325 +#: ../pidgin/gtkdocklet.c:522 msgid "Accounts" msgstr "Kontoer" #: ../finch/gntaccount.c:675 -#, fuzzy msgid "You can enable/disable accounts from the following list." -msgstr "Du venter på godkjenning fra disse kontaktene" +msgstr "Du kan aktivere/deaktivere kontoer fra følgende liste." #. Add button -#: ../finch/gntaccount.c:698 ../finch/gntaccount.c:888 ../finch/gntblist.c:343 -#: ../finch/gntblist.c:421 ../finch/gntblist.c:456 ../finch/gntcertmgr.c:306 -#: ../finch/gntnotify.c:380 ../finch/gntpounce.c:713 ../finch/gntstatus.c:199 -#: ../libpurple/protocols/gg/gg.c:883 ../libpurple/protocols/qq/sys_msg.c:114 +#: ../finch/gntaccount.c:698 +#: ../finch/gntaccount.c:888 +#: ../finch/gntblist.c:343 +#: ../finch/gntblist.c:421 +#: ../finch/gntblist.c:456 +#: ../finch/gntblist.c:2305 +#: ../finch/gntcertmgr.c:306 +#: ../finch/gntnotify.c:383 +#: ../finch/gntpounce.c:713 +#: ../finch/gntstatus.c:199 +#: ../libpurple/protocols/gg/gg.c:883 +#: ../libpurple/protocols/qq/sys_msg.c:114 #: ../libpurple/protocols/qq/sys_msg.c:173 #: ../libpurple/protocols/qq/sys_msg.c:267 #: ../libpurple/protocols/sametime/sametime.c:5486 #: ../libpurple/protocols/silc/chat.c:615 -#: ../libpurple/protocols/silc10/chat.c:599 ../pidgin/gtkaccount.c:2494 -#: ../pidgin/gtkblist.c:5966 ../pidgin/gtkconv.c:1659 +#: ../libpurple/protocols/silc10/chat.c:599 +#: ../pidgin/gtkaccount.c:2494 +#: ../pidgin/gtkblist.c:6266 +#: ../pidgin/gtkconv.c:1712 #: ../pidgin/gtkrequest.c:275 msgid "Add" msgstr "Legg til" #. Modify button -#: ../finch/gntaccount.c:703 ../finch/gntpounce.c:721 -#, fuzzy +#: ../finch/gntaccount.c:703 +#: ../finch/gntpounce.c:721 msgid "Modify" -msgstr "_Endre" - -#: ../finch/gntaccount.c:811 ../pidgin/gtkaccount.c:2441 -#, fuzzy, c-format +msgstr "Endre" + +#: ../finch/gntaccount.c:811 +#: ../pidgin/gtkaccount.c:2441 +#, c-format msgid "%s%s%s%s has made %s his or her buddy%s%s" -msgstr "%s%s%s%s har lagt %s til i sin kontaktliste%s%s%s" - -#: ../finch/gntaccount.c:884 ../pidgin/gtkaccount.c:2493 +msgstr "%s%s%s%s har lagt til %s i sin kontaktliste%s%s" + +#: ../finch/gntaccount.c:884 +#: ../pidgin/gtkaccount.c:2493 msgid "Add buddy to your list?" msgstr "Legg til kontakten i listen din?" -#: ../finch/gntaccount.c:944 ../pidgin/gtkaccount.c:2551 -#, fuzzy, c-format +#: ../finch/gntaccount.c:944 +#: ../pidgin/gtkaccount.c:2551 +#, c-format msgid "%s%s%s%s wants to add %s to his or her buddy list%s%s" -msgstr "Brukeren %s ønsker å legge til %s i kontaktlisten sin." - -#: ../finch/gntaccount.c:969 ../finch/gntaccount.c:972 -#: ../finch/gntaccount.c:999 ../pidgin/gtkaccount.c:2574 +msgstr "%s%s%s%s ønsker å legge til %s i sin kontaktliste%s%s" + +#: ../finch/gntaccount.c:969 +#: ../finch/gntaccount.c:972 +#: ../finch/gntaccount.c:999 +#: ../pidgin/gtkaccount.c:2574 #: ../pidgin/gtkaccount.c:2580 -#, fuzzy msgid "Authorize buddy?" -msgstr "Godkjenn" - -#: ../finch/gntaccount.c:976 ../finch/gntaccount.c:1003 -#: ../pidgin/gtkaccount.c:2575 ../pidgin/gtkaccount.c:2581 +msgstr "Godkjenn kontakt?" + +#: ../finch/gntaccount.c:976 +#: ../finch/gntaccount.c:1003 +#: ../pidgin/gtkaccount.c:2575 +#: ../pidgin/gtkaccount.c:2581 msgid "Authorize" msgstr "Godkjenn" -#: ../finch/gntaccount.c:977 ../finch/gntaccount.c:1004 -#: ../pidgin/gtkaccount.c:2576 ../pidgin/gtkaccount.c:2582 +#: ../finch/gntaccount.c:977 +#: ../finch/gntaccount.c:1004 +#: ../pidgin/gtkaccount.c:2576 +#: ../pidgin/gtkaccount.c:2582 msgid "Deny" msgstr "Nekt" #: ../finch/gntblist.c:289 msgid "You must provide a screename for the buddy." -msgstr "" +msgstr "Du må oppgi et skjermnavn for kontakten." #: ../finch/gntblist.c:291 msgid "You must provide a group." -msgstr "" +msgstr "Du må oppgi en gruppe." #: ../finch/gntblist.c:293 -#, fuzzy msgid "You must select an account." -msgstr "Du må angi et kallenavn" +msgstr "Du må velge en konto." #: ../finch/gntblist.c:295 msgid "The selected account is not online." -msgstr "" +msgstr "Den valgte konto er ikke pålogget." #: ../finch/gntblist.c:300 -#, fuzzy msgid "Error adding buddy" -msgstr "" -"Klarte ikke lese %s:\n" -"%s\n" - -#: ../finch/gntblist.c:325 ../libpurple/protocols/oscar/oscar.c:2888 -#: ../pidgin/gtkaccount.c:1981 ../pidgin/gtksavedstatuses.c:980 +msgstr "Feil ved å legge til kontakt" + +#: ../finch/gntblist.c:325 +#: ../libpurple/protocols/oscar/oscar.c:2884 +#: ../pidgin/gtkaccount.c:1981 +#: ../pidgin/gtksavedstatuses.c:980 msgid "Screen Name" msgstr "Skjermnavn" -#: ../finch/gntblist.c:328 ../finch/gntblist.c:410 ../finch/gntblist.c:1250 -#: ../libpurple/protocols/msn/msn.c:1395 +#: ../finch/gntblist.c:328 +#: ../finch/gntblist.c:410 +#: ../finch/gntblist.c:1250 +#: ../libpurple/protocols/msn/msn.c:1507 #: ../libpurple/protocols/silc/chat.c:606 #: ../libpurple/protocols/silc10/chat.c:590 #: ../libpurple/protocols/yahoo/yahoo_profile.c:704 #: ../libpurple/protocols/zephyr/zephyr.c:788 -#: ../libpurple/protocols/zephyr/zephyr.c:1207 ../pidgin/gtkdialogs.c:1023 -#: ../pidgin/gtkdialogs.c:1047 ../pidgin/gtkdialogs.c:1069 +#: ../libpurple/protocols/zephyr/zephyr.c:1207 +#: ../pidgin/gtkdialogs.c:1019 +#: ../pidgin/gtkdialogs.c:1043 +#: ../pidgin/gtkdialogs.c:1065 #: ../pidgin/gtkrequest.c:278 msgid "Alias" msgstr "Alias" -#: ../finch/gntblist.c:331 ../finch/gntblist.c:413 -#, fuzzy +#: ../finch/gntblist.c:331 +#: ../finch/gntblist.c:413 msgid "Group" -msgstr "Gruppe:" - -# -#: ../finch/gntblist.c:335 ../finch/gntblist.c:401 ../finch/gntblist.c:1305 -#: ../finch/gntnotify.c:174 ../finch/gntstatus.c:576 -#: ../libpurple/plugins/idle.c:153 ../libpurple/plugins/idle.c:190 -#: ../pidgin/gtkblist.c:3008 ../pidgin/gtknotify.c:506 -#: ../pidgin/gtkpounce.c:1268 ../pidgin/plugins/gevolution/gevolution.c:445 +msgstr "Gruppe" + +#: ../finch/gntblist.c:335 +#: ../finch/gntblist.c:401 +#: ../finch/gntblist.c:1305 +#: ../finch/gntnotify.c:174 +#: ../finch/gntstatus.c:576 +#: ../libpurple/plugins/idle.c:153 +#: ../libpurple/plugins/idle.c:190 +#: ../pidgin/gtkblist.c:3206 +#: ../pidgin/gtknotify.c:503 +#: ../pidgin/gtkpounce.c:1268 +#: ../pidgin/plugins/gevolution/gevolution.c:445 msgid "Account" msgstr "Konto" -#: ../finch/gntblist.c:341 ../finch/gntblist.c:852 +#: ../finch/gntblist.c:341 +#: ../finch/gntblist.c:852 #: ../libpurple/protocols/silc/buddy.c:725 #: ../libpurple/protocols/silc/buddy.c:1027 #: ../libpurple/protocols/silc/buddy.c:1072 @@ -370,199 +463,210 @@ #: ../libpurple/protocols/silc10/buddy.c:1033 #: ../libpurple/protocols/silc10/buddy.c:1080 #: ../libpurple/protocols/silc10/buddy.c:1180 -#: ../libpurple/protocols/yahoo/yahoo.c:3343 ../pidgin/gtkblist.c:5483 +#: ../libpurple/protocols/yahoo/yahoo.c:3342 +#: ../pidgin/gtkblist.c:5772 #: ../pidgin/plugins/gevolution/add_buddy_dialog.c:445 msgid "Add Buddy" msgstr "Legg til kontakt" #: ../finch/gntblist.c:341 -#, fuzzy msgid "Please enter buddy information." -msgstr "Navnet på kontakten du vil varsle." - -#: ../finch/gntblist.c:370 ../libpurple/blist.c:1209 +msgstr "Vennligst skriv inn kontakteninformasjon." + +#: ../finch/gntblist.c:370 +#: ../libpurple/blist.c:1210 msgid "Chats" msgstr "Samtaler" #. Extract their Name and put it in -#: ../finch/gntblist.c:407 ../libpurple/protocols/jabber/jabber.c:924 +#: ../finch/gntblist.c:407 +#: ../libpurple/protocols/jabber/jabber.c:924 #: ../libpurple/protocols/jabber/jabber.c:927 -#: ../libpurple/protocols/msn/msn.c:1584 ../libpurple/protocols/msn/msn.c:1649 -#: ../libpurple/protocols/msn/msn.c:1676 -#: ../libpurple/protocols/qq/buddy_info.c:44 ../pidgin/gtkplugin.c:582 +#: ../libpurple/protocols/msn/msn.c:1694 +#: ../libpurple/protocols/msn/msn.c:1759 +#: ../libpurple/protocols/msn/msn.c:1786 +#: ../libpurple/protocols/qq/buddy_info.c:44 +#: ../pidgin/gtkplugin.c:582 #: ../pidgin/gtkroomlist.c:618 #: ../pidgin/plugins/gevolution/add_buddy_dialog.c:132 #: ../pidgin/plugins/gevolution/assoc-buddy.c:123 msgid "Name" msgstr "Navn" -#: ../finch/gntblist.c:416 ../finch/gntblist.c:819 -#, fuzzy +#: ../finch/gntblist.c:416 +#: ../finch/gntblist.c:819 msgid "Auto-join" msgstr "Automatisk pålogging" -#: ../finch/gntblist.c:419 ../finch/gntblist.c:854 ../pidgin/gtkblist.c:5859 +#: ../finch/gntblist.c:419 +#: ../finch/gntblist.c:854 +#: ../pidgin/gtkblist.c:6154 msgid "Add Chat" msgstr "Legg til samtale" #: ../finch/gntblist.c:420 msgid "You can edit more information from the context menu later." -msgstr "" - -#: ../finch/gntblist.c:433 ../finch/gntblist.c:446 -#, fuzzy +msgstr "Du kan forandre mer informasjon fra kontekstmenyen senere." + +#: ../finch/gntblist.c:433 +#: ../finch/gntblist.c:446 msgid "Error adding group" -msgstr "" -"Klarte ikke lese %s:\n" -"%s\n" +msgstr "Feil ved å legge til gruppe" #: ../finch/gntblist.c:434 -#, fuzzy msgid "You must give a name for the group to add." -msgstr "Vennligst skriv inn navnet på gruppen som skal legges til." +msgstr "Du må angi et navn til gruppen som skal legges til." #: ../finch/gntblist.c:447 -#, fuzzy msgid "A group with the name already exists." -msgstr "En mappe med dette navnet eksisterer allerede" - -#: ../finch/gntblist.c:454 ../finch/gntblist.c:856 +msgstr "En gruppe med dette navnet eksisterer allerede." + +#: ../finch/gntblist.c:454 +#: ../finch/gntblist.c:856 #: ../libpurple/protocols/sametime/sametime.c:5396 -#: ../libpurple/protocols/sametime/sametime.c:5484 ../pidgin/gtkblist.c:5963 +#: ../libpurple/protocols/sametime/sametime.c:5484 +#: ../pidgin/gtkblist.c:6263 msgid "Add Group" msgstr "Legg til gruppe" #: ../finch/gntblist.c:454 -#, fuzzy msgid "Enter the name of the group" -msgstr "Vennligst skriv inn navnet på gruppen som skal legges til." +msgstr "Vennligst skriv inn navnet på gruppen" #: ../finch/gntblist.c:802 -#, fuzzy msgid "Edit Chat" -msgstr "Legg til samtale" +msgstr "Rediger samtale" #: ../finch/gntblist.c:802 msgid "Please Update the necessary fields." -msgstr "" - -#: ../finch/gntblist.c:803 ../finch/gntstatus.c:205 -#, fuzzy +msgstr "Vennligst oppdater de nødvendige feltene." + +#: ../finch/gntblist.c:803 +#: ../finch/gntstatus.c:205 msgid "Edit" msgstr "Rediger" #: ../finch/gntblist.c:828 -#, fuzzy msgid "Edit Settings" -msgstr "Skjulte Innstillinger" - -#: ../finch/gntblist.c:864 ../pidgin/gtkutils.c:931 +msgstr "Rediger innstillinger" + +#: ../finch/gntblist.c:864 +#: ../pidgin/gtkutils.c:931 msgid "Information" msgstr "Informasjon" -#: ../finch/gntblist.c:864 ../pidgin/gtkutils.c:931 -#, fuzzy +#: ../finch/gntblist.c:864 +#: ../pidgin/gtkutils.c:931 msgid "Retrieving..." -msgstr "Kobler til..." - -#: ../finch/gntblist.c:904 ../finch/gntconv.c:507 +msgstr "Mottar..." + +#: ../finch/gntblist.c:904 +#: ../finch/gntconv.c:534 #: ../libpurple/protocols/silc/chat.c:899 #: ../libpurple/protocols/silc10/chat.c:883 msgid "Get Info" msgstr "Hent informasjon" #: ../finch/gntblist.c:908 -#, fuzzy msgid "Add Buddy Pounce" -msgstr "Legg til kompisvarsling" +msgstr "Legg til kontaktvarsling" #. if (q_bud && is_online(q_bud->status)) { -#: ../finch/gntblist.c:915 ../finch/gntconv.c:519 +#: ../finch/gntblist.c:915 +#: ../finch/gntconv.c:546 #: ../libpurple/protocols/jabber/si.c:874 -#: ../libpurple/protocols/oscar/oscar.c:654 ../libpurple/protocols/qq/qq.c:587 -#: ../pidgin/gtkconv.c:1607 +#: ../libpurple/protocols/oscar/oscar.c:654 +#: ../libpurple/protocols/qq/qq.c:587 +#: ../pidgin/gtkconv.c:1660 msgid "Send File" msgstr "Send fil" #: ../finch/gntblist.c:919 -#, fuzzy msgid "View Log" -msgstr "Vis _logg" +msgstr "Vis logg" #: ../finch/gntblist.c:1000 -#, fuzzy, c-format +#, c-format msgid "Please enter the new name for %s" -msgstr "Vennligst skriv inn nytt navn for gruppen." - -#: ../finch/gntblist.c:1002 ../finch/gntblist.c:1250 -#, fuzzy -msgid "Rename" -msgstr "End_re navn" +msgstr "Vennligst skriv inn det nye navnet for %s" #: ../finch/gntblist.c:1002 -#, fuzzy +#: ../finch/gntblist.c:1250 +msgid "Rename" +msgstr "Endre navn" + +#: ../finch/gntblist.c:1002 msgid "Set Alias" -msgstr "Alias" +msgstr "Angi alias" #: ../finch/gntblist.c:1003 msgid "Enter empty string to reset the name." -msgstr "" +msgstr "Skriv tom streng for å resette navnet." #: ../finch/gntblist.c:1079 msgid "Removing this contact will also remove all the buddies in the contact" -msgstr "" +msgstr "Fjerning av denne kontakten vil også fjerne alle kompisene i denne kontakten" #: ../finch/gntblist.c:1087 msgid "Removing this group will also remove all the buddies in the group" -msgstr "" +msgstr "Fjerning av denne gruppen vil også fjerne alle kompisene i denne gruppa" #: ../finch/gntblist.c:1092 -#, fuzzy, c-format +#, c-format msgid "Are you sure you want to remove %s?" msgstr "Er du sikker på at du vil slette %s?" #. XXX: anything to do with the returned ui-handle? #: ../finch/gntblist.c:1095 -#, fuzzy msgid "Confirm Remove" -msgstr "Bekrefte konto" - -#: ../finch/gntblist.c:1100 ../finch/gntblist.c:1252 ../finch/gntft.c:227 -#: ../pidgin/gtkconv.c:1656 ../pidgin/gtkrequest.c:276 +msgstr "Bekreft fjerning" + +#: ../finch/gntblist.c:1100 +#: ../finch/gntblist.c:1252 +#: ../finch/gntft.c:227 +#: ../pidgin/gtkconv.c:1709 +#: ../pidgin/gtkrequest.c:276 #: ../pidgin/gtkstatusbox.c:264 msgid "Remove" msgstr "Fjern" #. Buddy List -#: ../finch/gntblist.c:1226 ../finch/gntblist.c:2307 ../finch/gntprefs.c:258 -#: ../finch/gntui.c:83 ../pidgin/gtkblist.c:2688 ../pidgin/gtkblist.c:4284 +#: ../finch/gntblist.c:1226 +#: ../finch/gntblist.c:2355 +#: ../finch/gntprefs.c:258 +#: ../finch/gntui.c:83 +#: ../pidgin/gtkblist.c:2886 +#: ../pidgin/gtkblist.c:4566 #: ../pidgin/plugins/win32/winprefs/winprefs.c:326 msgid "Buddy List" msgstr "Kontaktliste" #: ../finch/gntblist.c:1257 msgid "Place tagged" -msgstr "" +msgstr "Stedet er merket" #: ../finch/gntblist.c:1262 msgid "Toggle Tag" -msgstr "" +msgstr "Bla i merkelapp" #. General -#: ../finch/gntblist.c:1298 ../libpurple/protocols/gg/gg.c:637 -#: ../libpurple/protocols/gg/gg.c:1050 ../libpurple/protocols/gg/gg.c:1123 +#: ../finch/gntblist.c:1298 +#: ../libpurple/protocols/gg/gg.c:637 +#: ../libpurple/protocols/gg/gg.c:1050 +#: ../libpurple/protocols/gg/gg.c:1123 #: ../libpurple/protocols/gg/gg.c:2207 #: ../libpurple/protocols/jabber/buddy.c:286 #: ../libpurple/protocols/jabber/buddy.c:1247 -#: ../libpurple/protocols/jabber/buddy.c:2214 -#: ../libpurple/protocols/jabber/buddy.c:2396 +#: ../libpurple/protocols/jabber/buddy.c:2217 +#: ../libpurple/protocols/jabber/buddy.c:2399 #: ../libpurple/protocols/jabber/jabber.c:937 #: ../libpurple/protocols/jabber/jabber.c:1544 #: ../libpurple/protocols/jabber/jabber.c:1567 #: ../libpurple/protocols/jabber/jabber.c:1590 #: ../libpurple/protocols/jabber/jabber.c:1613 #: ../libpurple/protocols/jabber/jabber.c:1636 -#: ../libpurple/protocols/msn/msn.c:1403 ../libpurple/protocols/msn/msn.c:1587 +#: ../libpurple/protocols/msn/msn.c:1515 +#: ../libpurple/protocols/msn/msn.c:1697 #: ../libpurple/protocols/qq/buddy_info.c:43 #: ../libpurple/protocols/silc/buddy.c:1535 #: ../libpurple/protocols/silc/ops.c:1002 @@ -572,28 +676,31 @@ #: ../libpurple/protocols/silc10/ops.c:1036 #: ../libpurple/protocols/silc10/ops.c:1179 #: ../libpurple/protocols/silc10/ops.c:1328 -#: ../libpurple/protocols/yahoo/yahoo_profile.c:1066 ../pidgin/gtkblist.c:3032 +#: ../libpurple/protocols/yahoo/yahoo_profile.c:1066 +#: ../pidgin/gtkblist.c:3230 msgid "Nickname" msgstr "Kallenavn" #. Idle stuff -#: ../finch/gntblist.c:1320 ../finch/gntprefs.c:261 +#: ../finch/gntblist.c:1320 +#: ../finch/gntprefs.c:261 #: ../libpurple/protocols/bonjour/bonjour.c:340 #: ../libpurple/protocols/jabber/buddy.c:787 #: ../libpurple/protocols/jabber/buddy.c:951 -#: ../libpurple/protocols/msn/msn.c:544 ../libpurple/protocols/msn/state.c:32 -#: ../libpurple/protocols/novell/novell.c:2825 -#: ../libpurple/protocols/oscar/oscar.c:2912 -#: ../libpurple/protocols/yahoo/yahoo.c:3097 -#: ../libpurple/protocols/yahoo/yahoo_profile.c:710 ../pidgin/gtkblist.c:3060 -#: ../pidgin/gtkblist.c:3460 ../pidgin/gtkprefs.c:1925 +#: ../libpurple/protocols/msn/state.c:32 +#: ../libpurple/protocols/novell/novell.c:2830 +#: ../libpurple/protocols/oscar/oscar.c:2908 +#: ../libpurple/protocols/yahoo/yahoo.c:3096 +#: ../libpurple/protocols/yahoo/yahoo_profile.c:710 +#: ../pidgin/gtkblist.c:3258 +#: ../pidgin/gtkblist.c:3664 +#: ../pidgin/gtkprefs.c:1927 msgid "Idle" msgstr "Inaktiv" #: ../finch/gntblist.c:1334 -#, fuzzy msgid "On Mobile" -msgstr "Send til mobil" +msgstr "På mobil" #: ../finch/gntblist.c:1415 #, c-format @@ -601,72 +708,86 @@ "Online: %d\n" "Total: %d" msgstr "" +"Pålogget: %d\n" +"Totalt: %d" #: ../finch/gntblist.c:1424 -#, fuzzy, c-format +#, c-format msgid "Account: %s (%s)" -msgstr "%s på %s (%s)" +msgstr "Konto: %s (%s)" #: ../finch/gntblist.c:1436 -#, fuzzy, c-format +#, c-format msgid "" "\n" "Last Seen: %s ago" msgstr "" "\n" -"%s: %s" - -#: ../finch/gntblist.c:1702 ../pidgin/gtkdocklet.c:470 +"Sist sett: %s siden" + +#: ../finch/gntblist.c:1704 +#: ../pidgin/gtkdocklet.c:470 #: ../pidgin/gtkstatusbox.c:1072 msgid "New..." msgstr "Ny..." -#: ../finch/gntblist.c:1709 ../pidgin/gtkdocklet.c:471 +#: ../finch/gntblist.c:1711 +#: ../pidgin/gtkdocklet.c:471 #: ../pidgin/gtkstatusbox.c:1073 -#, fuzzy msgid "Saved..." -msgstr "Lagre fil..." - -#: ../finch/gntblist.c:2087 ../finch/gntplugin.c:255 ../finch/gntui.c:88 -#: ../pidgin/gtkdocklet.c:523 ../pidgin/gtkplugin.c:531 +msgstr "Lagret..." + +#: ../finch/gntblist.c:2089 +#: ../finch/gntplugin.c:255 +#: ../finch/gntui.c:88 +#: ../pidgin/gtkdocklet.c:523 +#: ../pidgin/gtkplugin.c:531 msgid "Plugins" msgstr "Tillegg" -#: ../finch/gntblist.c:2203 ../pidgin/gtkdialogs.c:754 -#: ../pidgin/gtkdialogs.c:893 ../pidgin/gtkdialogs.c:974 -#, fuzzy +#: ../finch/gntblist.c:2205 +#: ../pidgin/gtkdialogs.c:750 +#: ../pidgin/gtkdialogs.c:889 +#: ../pidgin/gtkdialogs.c:970 msgid "_Name" -msgstr "Navn" - -#: ../finch/gntblist.c:2208 ../pidgin/gtkdialogs.c:759 -#: ../pidgin/gtkdialogs.c:898 ../pidgin/gtkdialogs.c:979 +msgstr "_Navn" + +#: ../finch/gntblist.c:2210 +#: ../pidgin/gtkdialogs.c:755 +#: ../pidgin/gtkdialogs.c:894 +#: ../pidgin/gtkdialogs.c:975 msgid "_Account" -msgstr "Konto:" - -#: ../finch/gntblist.c:2216 ../pidgin/gtkdialogs.c:767 +msgstr "_Konto" + +#: ../finch/gntblist.c:2218 +#: ../pidgin/gtkdialogs.c:763 msgid "New Instant Message" msgstr "Ny direktemelding" -#: ../finch/gntblist.c:2218 ../pidgin/gtkdialogs.c:769 -#, fuzzy -msgid "" -"Please enter the screen name or alias of the person you would like to IM." -msgstr "" -"Vennligst skriv inn skjermnavnet på den personen du vil sende direktemelding " -"til." +#: ../finch/gntblist.c:2220 +#: ../pidgin/gtkdialogs.c:765 +msgid "Please enter the screen name or alias of the person you would like to IM." +msgstr "Vennligst skriv inn skjermnavnet eller aliaset på den personen du vil sende direktemelding til." #. Not multiline #. Not masked? #. No hints? -#: ../finch/gntblist.c:2221 ../finch/gntcertmgr.c:90 ../finch/gntconn.c:135 -#: ../finch/gntnotify.c:80 ../libpurple/account.c:1012 -#: ../libpurple/account.c:1262 ../libpurple/protocols/gg/gg.c:506 -#: ../libpurple/protocols/gg/gg.c:665 ../libpurple/protocols/gg/gg.c:802 +#: ../finch/gntblist.c:2223 +#: ../finch/gntcertmgr.c:90 +#: ../finch/gntconn.c:136 +#: ../finch/gntnotify.c:80 +#: ../libpurple/account.c:1012 +#: ../libpurple/account.c:1262 +#: ../libpurple/protocols/gg/gg.c:506 +#: ../libpurple/protocols/gg/gg.c:665 +#: ../libpurple/protocols/gg/gg.c:802 #: ../libpurple/protocols/jabber/jabber.c:1736 #: ../libpurple/protocols/jabber/xdata.c:399 -#: ../libpurple/protocols/msn/msn.c:286 ../libpurple/protocols/msn/msn.c:303 -#: ../libpurple/protocols/msn/msn.c:320 ../libpurple/protocols/msn/msn.c:337 -#: ../libpurple/protocols/oscar/oscar.c:6093 +#: ../libpurple/protocols/msn/msn.c:289 +#: ../libpurple/protocols/msn/msn.c:306 +#: ../libpurple/protocols/msn/msn.c:323 +#: ../libpurple/protocols/msn/msn.c:340 +#: ../libpurple/protocols/oscar/oscar.c:6091 #: ../libpurple/protocols/silc/buddy.c:454 #: ../libpurple/protocols/silc/buddy.c:1190 #: ../libpurple/protocols/silc/chat.c:447 @@ -683,107 +804,127 @@ #: ../libpurple/protocols/silc10/ops.c:1297 #: ../libpurple/protocols/silc10/ops.c:1903 #: ../libpurple/protocols/silc10/silc.c:735 -#: ../libpurple/protocols/yahoo/yahoo.c:1031 -#: ../libpurple/protocols/yahoo/yahoo.c:3497 -#: ../libpurple/protocols/yahoo/yahoo.c:3508 ../pidgin/gtkblist.c:4039 -#: ../pidgin/gtkcertmgr.c:195 ../pidgin/gtkdialogs.c:772 -#: ../pidgin/gtkdialogs.c:911 ../pidgin/gtkdialogs.c:1003 +#: ../libpurple/protocols/yahoo/yahoo.c:1030 +#: ../libpurple/protocols/yahoo/yahoo.c:3496 +#: ../libpurple/protocols/yahoo/yahoo.c:3507 +#: ../pidgin/gtkblist.c:4321 +#: ../pidgin/gtkcertmgr.c:195 +#: ../pidgin/gtkdialogs.c:768 +#: ../pidgin/gtkdialogs.c:907 +#: ../pidgin/gtkdialogs.c:999 #: ../pidgin/gtkrequest.c:270 msgid "OK" -msgstr "_OK" +msgstr "OK" #. Create the "Options" frame. -#: ../finch/gntblist.c:2241 ../finch/gntpounce.c:447 ../pidgin/gtkpounce.c:790 -#, fuzzy +#: ../finch/gntblist.c:2261 +#: ../finch/gntpounce.c:447 +#: ../pidgin/gtkpounce.c:790 msgid "Options" -msgstr "/_Brukervalg" - -#: ../finch/gntblist.c:2247 -#, fuzzy -msgid "Send IM..." -msgstr "Lagre fil..." - -#: ../finch/gntblist.c:2251 -#, fuzzy -msgid "Show empty groups" -msgstr "Etter gruppe" - -#: ../finch/gntblist.c:2257 -#, fuzzy -msgid "Show offline buddies" -msgstr "/Kontakter/Vis _avloggede kontakter" - -#: ../finch/gntblist.c:2263 -#, fuzzy -msgid "Sort by status" -msgstr "Status" +msgstr "Brukervalg" #: ../finch/gntblist.c:2267 -#, fuzzy -msgid "Sort alphabetically" -msgstr "Alfabetisk" +msgid "Send IM..." +msgstr "Send direktemelding..." #: ../finch/gntblist.c:2271 -#, fuzzy -msgid "Sort by log size" +msgid "Show" +msgstr "Vis" + +#: ../finch/gntblist.c:2276 +msgid "Empty groups" +msgstr "Tomme grupper" + +#: ../finch/gntblist.c:2282 +msgid "Offline buddies" +msgstr "Avloggede kontakter" + +#: ../finch/gntblist.c:2288 +msgid "Sort" +msgstr "Sorter" + +#: ../finch/gntblist.c:2293 +msgid "By Status" +msgstr "Etter status" + +#: ../finch/gntblist.c:2297 +#: ../pidgin/gtkblist.c:4106 +msgid "Alphabetically" +msgstr "Alfabetisk" + +#: ../finch/gntblist.c:2301 +msgid "By Log Size" msgstr "Etter loggstørrelse" -#: ../finch/gntcertmgr.c:86 ../pidgin/gtkcertmgr.c:188 -#, fuzzy +#: ../finch/gntcertmgr.c:86 +#: ../pidgin/gtkcertmgr.c:188 msgid "Certificate Import" -msgstr "Koble til" - -#: ../finch/gntcertmgr.c:87 ../pidgin/gtkcertmgr.c:189 +msgstr "Importering av sertifikat" + +#: ../finch/gntcertmgr.c:87 +#: ../pidgin/gtkcertmgr.c:189 msgid "Specify a hostname" -msgstr "" - -#: ../finch/gntcertmgr.c:88 ../pidgin/gtkcertmgr.c:190 +msgstr "Spesifiser et vertsnavn" + +#: ../finch/gntcertmgr.c:88 +#: ../pidgin/gtkcertmgr.c:190 msgid "Type the host name this certificate is for." -msgstr "" - -#: ../finch/gntcertmgr.c:97 ../pidgin/gtkcertmgr.c:210 +msgstr "Skriv inn vertsnavnet som dette sertifikatet er for." + +#: ../finch/gntcertmgr.c:97 +#: ../pidgin/gtkcertmgr.c:210 #, c-format msgid "" "File %s could not be imported.\n" "Make sure that the file is readable and in PEM format.\n" msgstr "" - -#: ../finch/gntcertmgr.c:99 ../pidgin/gtkcertmgr.c:212 +"Filen %s kunne ikke bli importert.\n" +"Pass på at filen er lesbar og i PEM-format.\n" + +#: ../finch/gntcertmgr.c:99 +#: ../pidgin/gtkcertmgr.c:212 msgid "Certificate Import Error" -msgstr "" - -#: ../finch/gntcertmgr.c:100 ../pidgin/gtkcertmgr.c:213 +msgstr "Import av sertifikat feilet" + +#: ../finch/gntcertmgr.c:100 +#: ../pidgin/gtkcertmgr.c:213 msgid "X.509 certificate import failed" -msgstr "" - -#: ../finch/gntcertmgr.c:110 ../pidgin/gtkcertmgr.c:224 -#, fuzzy +msgstr "Import av X.509 sertifikat feilet" + +#: ../finch/gntcertmgr.c:110 +#: ../pidgin/gtkcertmgr.c:224 msgid "Select a PEM certificate" -msgstr "Velg fil" - -#: ../finch/gntcertmgr.c:127 ../pidgin/gtkcertmgr.c:245 +msgstr "Velg et PEM-sertifikat" + +#: ../finch/gntcertmgr.c:127 +#: ../pidgin/gtkcertmgr.c:245 #, c-format msgid "" "Export to file %s failed.\n" "Check that you have write permission to the target path\n" msgstr "" - -#: ../finch/gntcertmgr.c:129 ../pidgin/gtkcertmgr.c:247 +"Eksport til fil %s feilet.\n" +"Sjekk at du har skrive-rettigheter til målbanen\n" + +#: ../finch/gntcertmgr.c:129 +#: ../pidgin/gtkcertmgr.c:247 msgid "Certificate Export Error" -msgstr "" - -#: ../finch/gntcertmgr.c:130 ../pidgin/gtkcertmgr.c:248 +msgstr "Eksport av sertifikat feilet" + +#: ../finch/gntcertmgr.c:130 +#: ../pidgin/gtkcertmgr.c:248 msgid "X.509 certificate export failed" -msgstr "" - -#: ../finch/gntcertmgr.c:159 ../pidgin/gtkcertmgr.c:299 +msgstr "Eksport av x.509 sertifikat feilet" + +#: ../finch/gntcertmgr.c:159 +#: ../pidgin/gtkcertmgr.c:299 msgid "PEM X.509 Certificate Export" -msgstr "" +msgstr "Eksport av PEM X.509 sertifikat" #: ../finch/gntcertmgr.c:188 #, c-format msgid "Certificate for %s" -msgstr "" +msgstr "Sertifikat for %s" #: ../finch/gntcertmgr.c:195 #, c-format @@ -793,188 +934,205 @@ "SHA1 fingerprint:\n" "%s" msgstr "" +"Vanlig navn: %s\n" +"\n" +"SHA1 fingeravtrykk:\n" +"%s" #: ../finch/gntcertmgr.c:198 msgid "SSL Host Certificate" -msgstr "" - -#: ../finch/gntcertmgr.c:233 ../pidgin/gtkcertmgr.c:372 +msgstr "SSL Vert Sertifikat" + +#: ../finch/gntcertmgr.c:233 +#: ../pidgin/gtkcertmgr.c:372 #, c-format msgid "Really delete certificate for %s?" -msgstr "" - -#: ../finch/gntcertmgr.c:236 ../pidgin/gtkcertmgr.c:374 +msgstr "Virkelig slett sertifikat for %s?" + +#: ../finch/gntcertmgr.c:236 +#: ../pidgin/gtkcertmgr.c:374 msgid "Confirm certificate delete" -msgstr "" - -#: ../finch/gntcertmgr.c:293 ../pidgin/gtkcertmgr.c:602 +msgstr "Bekreft sletting av sertifikat" + +#: ../finch/gntcertmgr.c:293 +#: ../pidgin/gtkcertmgr.c:602 msgid "Certificate Manager" -msgstr "" +msgstr "Sertifikatshåndterer" #. Creating the user splits -#: ../finch/gntcertmgr.c:298 ../libpurple/protocols/bonjour/bonjour.c:652 +#: ../finch/gntcertmgr.c:298 +#: ../libpurple/protocols/bonjour/bonjour.c:652 #: ../libpurple/protocols/silc/silc.c:1007 #: ../libpurple/protocols/silc10/silc.c:918 -#, fuzzy msgid "Hostname" -msgstr "Etternavn:" - -#: ../finch/gntcertmgr.c:315 ../finch/gntnotify.c:383 ../pidgin/gtkconv.c:1635 +msgstr "Vertsnavn" + +#: ../finch/gntcertmgr.c:315 +#: ../finch/gntnotify.c:386 +#: ../pidgin/gtkconv.c:1688 #: ../pidgin/gtkdebug.c:835 msgid "Info" msgstr "Info" #. Close button -#: ../finch/gntcertmgr.c:324 ../finch/gntft.c:237 ../finch/gntnotify.c:182 -#: ../finch/gntplugin.c:210 ../finch/gntplugin.c:310 ../finch/gntpounce.c:738 -#: ../finch/gntstatus.c:216 ../libpurple/protocols/msn/msn.c:403 +#: ../finch/gntcertmgr.c:324 +#: ../finch/gntft.c:237 +#: ../finch/gntnotify.c:182 +#: ../finch/gntplugin.c:210 +#: ../finch/gntplugin.c:310 +#: ../finch/gntpounce.c:738 +#: ../finch/gntstatus.c:216 +#: ../libpurple/protocols/msn/msn.c:406 #: ../libpurple/protocols/silc/util.c:382 -#: ../libpurple/protocols/silc10/util.c:377 ../pidgin/gtkaccount.c:2468 +#: ../libpurple/protocols/silc10/util.c:377 +#: ../pidgin/gtkaccount.c:2468 #: ../pidgin/gtkrequest.c:273 msgid "Close" -msgstr "L_ukk" - -#: ../finch/gntconn.c:124 -#, fuzzy, c-format +msgstr "Lukk" + +#: ../finch/gntconn.c:125 +#, c-format msgid "%s (%s)" -msgstr "%s på %s (%s)" - -#: ../finch/gntconn.c:127 -#, fuzzy, c-format -msgid "%s disconnected." -msgstr "Frakoblet." +msgstr "%s (%s)" #: ../finch/gntconn.c:128 -#, fuzzy, c-format +#, c-format +msgid "%s disconnected." +msgstr "%s koblet fra." + +#: ../finch/gntconn.c:129 +#, c-format msgid "" "%s\n" "\n" -"Finch will not attempt to reconnect the account until you correct the error " -"and re-enable the account." -msgstr "" -"%s ble avkoblet pga. en feil. %s Kontoen har blitt avstengt. Korriger feilen " -"og slå på kontoen for å tilkoble." - -#: ../finch/gntconn.c:137 ../pidgin/gtkblist.c:4041 -#, fuzzy +"Finch will not attempt to reconnect the account until you correct the error and re-enable the account." +msgstr "" +"%s\n" +"\n" +"Finch vil ikke forsøke å koble kontoen til igjen før du har rettet på feilen og slått på kontoen igjen." + +#: ../finch/gntconn.c:138 +#: ../pidgin/gtkblist.c:4323 msgid "Re-enable Account" -msgstr "Registrere ny jabber-konto" +msgstr "Reaktiver konto" #: ../finch/gntconv.c:139 msgid "No such command." -msgstr "Ingen slik kommando" - -#: ../finch/gntconv.c:143 ../pidgin/gtkconv.c:489 +msgstr "Ingen slik kommando." + +#: ../finch/gntconv.c:143 +#: ../pidgin/gtkconv.c:530 msgid "Syntax Error: You typed the wrong number of arguments to that command." -msgstr "Syntaksfeil: Du skrev inn feil antall argumenter til den kommandoen" - -#: ../finch/gntconv.c:148 ../pidgin/gtkconv.c:495 +msgstr "Syntaksfeil: Du skrev inn feil antall argumenter til den kommandoen." + +#: ../finch/gntconv.c:148 +#: ../pidgin/gtkconv.c:536 msgid "Your command failed for an unknown reason." msgstr "Din kommando feilet av ukjent årsak." -#: ../finch/gntconv.c:153 ../pidgin/gtkconv.c:502 -#, fuzzy +#: ../finch/gntconv.c:153 +#: ../pidgin/gtkconv.c:543 msgid "That command only works in chats, not IMs." -msgstr "Den kommandoen virker bare i samtalegrupper, ikke i direktemeldinger" - -#: ../finch/gntconv.c:156 ../pidgin/gtkconv.c:505 -#, fuzzy +msgstr "Den kommandoen virker bare i samtalegrupper, ikke i direktemeldinger." + +#: ../finch/gntconv.c:156 +#: ../pidgin/gtkconv.c:546 msgid "That command only works in IMs, not chats." -msgstr "Den kommandoen virker bare i direktemeldinger, ikke samtalegrupper" - -#: ../finch/gntconv.c:160 ../pidgin/gtkconv.c:510 +msgstr "Den kommandoen virker bare i direktemeldinger, ikke samtalegrupper." + +#: ../finch/gntconv.c:160 +#: ../pidgin/gtkconv.c:551 msgid "That command doesn't work on this protocol." -msgstr "Denne kommandoen virker ikke på denne protokollen" +msgstr "Denne kommandoen virker ikke på denne protokollen." #: ../finch/gntconv.c:168 -#, fuzzy msgid "Message was not sent, because you are not signed on." -msgstr "Meldingen kunne ikke bli sendt, brukeren er frakoblet:" +msgstr "Meldingen kunne ikke bli sendt, fordi du ikke er koblet til." #: ../finch/gntconv.c:251 -#, fuzzy, c-format +#, c-format msgid "%s (%s -- %s)" -msgstr "%s på %s (%s)" +msgstr "%s (%s -- %s)" #: ../finch/gntconv.c:274 #, c-format msgid "%s [%s]" -msgstr "" - -#: ../finch/gntconv.c:279 ../finch/gntconv.c:773 -#, fuzzy, c-format +msgstr "%s [%s]" + +#: ../finch/gntconv.c:279 +#: ../finch/gntconv.c:801 +#, c-format msgid "" "\n" "%s is typing..." -msgstr "Brukeren skriver en melding..." +msgstr "" +"\n" +"%s skriver..." #: ../finch/gntconv.c:298 -#, fuzzy msgid "You have left this chat." -msgstr "Du snakker i samtalen" - -#: ../finch/gntconv.c:387 ../pidgin/gtkconv.c:1362 +msgstr "Du har forlatt denne samtalen." + +#: ../finch/gntconv.c:414 +#: ../pidgin/gtkconv.c:1415 msgid "Logging started. Future messages in this conversation will be logged." -msgstr "" - -#: ../finch/gntconv.c:393 ../pidgin/gtkconv.c:1370 -msgid "" -"Logging stopped. Future messages in this conversation will not be logged." -msgstr "" -"Logging stoppet. Framtidige beskjeder i denne samtalen vil ikke bli logget." - -#: ../finch/gntconv.c:442 -#, fuzzy +msgstr "Innlogging startet. Fremtidige beskjeder i denne samtalen vil bli logget." + +#: ../finch/gntconv.c:420 +#: ../pidgin/gtkconv.c:1423 +msgid "Logging stopped. Future messages in this conversation will not be logged." +msgstr "Logging stoppet. Framtidige beskjeder i denne samtalen vil ikke bli logget." + +#: ../finch/gntconv.c:469 msgid "Send To" -msgstr "Send som" - -#: ../finch/gntconv.c:486 -#, fuzzy +msgstr "Send til" + +#: ../finch/gntconv.c:513 msgid "Conversation" -msgstr "Samtaler" - -#: ../finch/gntconv.c:492 +msgstr "Samtale" + +#: ../finch/gntconv.c:519 msgid "Clear Scrollback" -msgstr "" - -#: ../finch/gntconv.c:496 ../finch/gntprefs.c:191 -#, fuzzy +msgstr "Rens Rullefelt" + +#: ../finch/gntconv.c:523 +#: ../finch/gntprefs.c:191 msgid "Show Timestamps" -msgstr "Tidsstempler" - -#: ../finch/gntconv.c:512 -#, fuzzy +msgstr "Vis tidsstempler" + +#: ../finch/gntconv.c:539 msgid "Add Buddy Pounce..." -msgstr "Legg til kompisvarsling" - -#: ../finch/gntconv.c:527 -#, fuzzy +msgstr "Legg til kontaktvarsling..." + +#: ../finch/gntconv.c:554 msgid "Enable Logging" -msgstr "/Brukervalg/Slå på logging" - -#: ../finch/gntconv.c:533 -#, fuzzy +msgstr "Aktiver logging" + +#: ../finch/gntconv.c:560 msgid "Enable Sounds" -msgstr "/Brukervalg/Slå på lyder" - -#: ../finch/gntconv.c:739 +msgstr "Aktiver lyder" + +#: ../finch/gntconv.c:766 msgid " " -msgstr "" +msgstr " " #. Print the list of users in the room -#: ../finch/gntconv.c:861 +#: ../finch/gntconv.c:889 msgid "List of users:\n" -msgstr "" - -#: ../finch/gntconv.c:1023 ../pidgin/gtkconv.c:331 +msgstr "Liste av brukere:\n" + +#: ../finch/gntconv.c:1051 +#: ../pidgin/gtkconv.c:370 msgid "Supported debug options are: version" msgstr "Støttede avlusningsmuligheter er: version" -#: ../finch/gntconv.c:1059 ../pidgin/gtkconv.c:381 +#: ../finch/gntconv.c:1087 +#: ../pidgin/gtkconv.c:422 msgid "No such command (in this context)." msgstr "Ingen slik kommando (i denne sammenheng)." -#: ../finch/gntconv.c:1062 ../pidgin/gtkconv.c:384 +#: ../finch/gntconv.c:1090 +#: ../pidgin/gtkconv.c:425 msgid "" "Use \"/help <command>\" for help on a specific command.\n" "The following commands are available in this context:\n" @@ -982,65 +1140,62 @@ "Bruk \"/help <command>\" for hjelp på en spesifikk kommando.\n" "De følgende kommandoer er tilgjengelige i denne sammenhengen:\n" -#: ../finch/gntconv.c:1120 ../pidgin/gtkconv.c:7560 -msgid "" -"say <message>: Send a message normally as if you weren't using a " -"command." -msgstr "" -"say <message>: Send en beskjed normalt som om du ikke brukte en " -"kommando." - -#: ../finch/gntconv.c:1123 ../pidgin/gtkconv.c:7563 +#: ../finch/gntconv.c:1148 +#: ../pidgin/gtkconv.c:7642 +msgid "say <message>: Send a message normally as if you weren't using a command." +msgstr "say <message>: Send en beskjed normalt som om du ikke brukte en kommando." + +#: ../finch/gntconv.c:1151 +#: ../pidgin/gtkconv.c:7645 msgid "me <action>: Send an IRC style action to a buddy or chat." -msgstr "" -"me <action>: Send en IRC stil handling til en kompis eller samtale." - -#: ../finch/gntconv.c:1126 ../pidgin/gtkconv.c:7566 -msgid "" -"debug <option>: Send various debug information to the current " -"conversation." -msgstr "" -"debug <option>: Send diverse debug informasjon til den pågående " -"samtalen." - -#: ../finch/gntconv.c:1129 ../pidgin/gtkconv.c:7569 -#, fuzzy +msgstr "me <action>: Send en IRC stil handling til en kompis eller samtale." + +#: ../finch/gntconv.c:1154 +#: ../pidgin/gtkconv.c:7648 +msgid "debug <option>: Send various debug information to the current conversation." +msgstr "debug <option>: Send diverse debug informasjon til den pågående samtalen." + +#: ../finch/gntconv.c:1157 +#: ../pidgin/gtkconv.c:7651 msgid "clear: Clears the conversation scrollback." -msgstr "%s har lukket samtalevinduet." - -#: ../finch/gntconv.c:1132 ../pidgin/gtkconv.c:7575 +msgstr "clear: Renser samtale scrollback." + +#: ../finch/gntconv.c:1160 +#: ../pidgin/gtkconv.c:7657 msgid "help <command>: Help on a specific command." -msgstr "" - -#: ../finch/gntconv.c:1135 +msgstr "hjelp <kommando>: Hjelp til en spesifikk kommando." + +#: ../finch/gntconv.c:1163 msgid "users: Show the list of users in the chat." -msgstr "" - -#: ../finch/gntconv.c:1140 +msgstr "brukere: Vis listen av brukere i samtalen." + +#: ../finch/gntconv.c:1168 msgid "plugins: Show the plugins window." -msgstr "" - -#: ../finch/gntconv.c:1143 +msgstr "tillegg: Vis tillegg i vinduet." + +#: ../finch/gntconv.c:1171 msgid "buddylist: Show the buddylist." -msgstr "" - -#: ../finch/gntconv.c:1146 +msgstr "kompisliste: Vis kompislisten." + +#: ../finch/gntconv.c:1174 msgid "accounts: Show the accounts window." -msgstr "" - -#: ../finch/gntconv.c:1149 +msgstr "kontoer: Vis kontoene i vinduet." + +#: ../finch/gntconv.c:1177 msgid "debugwin: Show the debug window." -msgstr "" - -#: ../finch/gntconv.c:1152 +msgstr "debugwin: Vis debugs vindu." + +#: ../finch/gntconv.c:1180 msgid "prefs: Show the preference window." -msgstr "" - -#: ../finch/gntconv.c:1155 +msgstr "prefs: Vis preferanse vindu." + +#: ../finch/gntconv.c:1183 msgid "statuses: Show the savedstatuses window." -msgstr "" - -#: ../finch/gntdebug.c:235 ../finch/gntui.c:86 ../pidgin/gtkdebug.c:695 +msgstr "statuser: Vis lagrede statuser i vindu." + +#: ../finch/gntdebug.c:235 +#: ../finch/gntui.c:86 +#: ../pidgin/gtkdebug.c:695 msgid "Debug Window" msgstr "Avlusningsvindu" @@ -1048,197 +1203,220 @@ #. * it's necessary to make the width of the debug window resizable ... like I said, #. * it doesn't make sense. The bug is likely in the packing in gntbox.c. #. -#: ../finch/gntdebug.c:256 ../pidgin/gtkdebug.c:754 -#, fuzzy +#: ../finch/gntdebug.c:256 +#: ../pidgin/gtkdebug.c:754 msgid "Clear" -msgstr "L_ukk" +msgstr "Clear" #: ../finch/gntdebug.c:262 -#, fuzzy msgid "Filter: " -msgstr "Feilet." - -#: ../finch/gntdebug.c:266 ../pidgin/gtkdebug.c:763 +msgstr "Filter: " + +#: ../finch/gntdebug.c:266 +#: ../pidgin/gtkdebug.c:763 msgid "Pause" msgstr "Pause" -#: ../finch/gntft.c:118 ../pidgin/gtkft.c:229 -#, fuzzy, c-format +#: ../finch/gntft.c:118 +#: ../pidgin/gtkft.c:229 +#, c-format msgid "File Transfers - %d%% of %d files" -msgstr "Filoverføring til %s avbrutt.\n" +msgstr "Filoverføringer - %d%% av %d filer" #. Create the window. -#: ../finch/gntft.c:123 ../finch/gntft.c:196 ../finch/gntui.c:87 -#: ../pidgin/gtkft.c:234 ../pidgin/gtkft.c:762 +#: ../finch/gntft.c:123 +#: ../finch/gntft.c:196 +#: ../finch/gntui.c:87 +#: ../pidgin/gtkft.c:234 +#: ../pidgin/gtkft.c:762 msgid "File Transfers" msgstr "Filoverføringer" -#: ../finch/gntft.c:201 ../pidgin/gtkft.c:645 +#: ../finch/gntft.c:201 +#: ../pidgin/gtkft.c:645 msgid "Progress" msgstr "Framdrift" -#: ../finch/gntft.c:201 ../pidgin/gtkft.c:652 +#: ../finch/gntft.c:201 +#: ../pidgin/gtkft.c:652 msgid "Filename" msgstr "Filnavn" -#: ../finch/gntft.c:201 ../pidgin/gtkft.c:659 +#: ../finch/gntft.c:201 +#: ../pidgin/gtkft.c:659 msgid "Size" msgstr "Størrelse" #: ../finch/gntft.c:201 -#, fuzzy msgid "Speed" -msgstr "Hastighet:" - -#: ../finch/gntft.c:201 ../pidgin/gtkft.c:666 +msgstr "Hastighet" + +#: ../finch/gntft.c:201 +#: ../pidgin/gtkft.c:666 msgid "Remaining" msgstr "Gjenstår" #. XXX: Use of ggp_str_to_uin() is an ugly hack! -#: ../finch/gntft.c:201 ../finch/gntstatus.c:547 ../finch/gntstatus.c:576 +#: ../finch/gntft.c:201 +#: ../finch/gntstatus.c:547 +#: ../finch/gntstatus.c:576 #: ../libpurple/protocols/bonjour/bonjour.c:344 -#: ../libpurple/protocols/gg/gg.c:1039 ../libpurple/protocols/gg/gg.c:1576 +#: ../libpurple/protocols/gg/gg.c:1039 +#: ../libpurple/protocols/gg/gg.c:1576 #: ../libpurple/protocols/gg/gg.c:1584 #: ../libpurple/protocols/jabber/buddy.c:778 #: ../libpurple/protocols/jabber/buddy.c:782 #: ../libpurple/protocols/jabber/buddy.c:941 #: ../libpurple/protocols/jabber/jabber.c:1500 -#: ../libpurple/protocols/msn/msn.c:543 -#: ../libpurple/protocols/novell/novell.c:2835 +#: ../libpurple/protocols/msn/msn.c:596 +#: ../libpurple/protocols/msn/msn.c:603 +#: ../libpurple/protocols/novell/novell.c:2840 #: ../libpurple/protocols/oscar/oscar.c:821 #: ../libpurple/protocols/oscar/oscar.c:826 #: ../libpurple/protocols/oscar/oscar.c:828 -#: ../libpurple/protocols/oscar/oscar.c:2700 -#: ../libpurple/protocols/oscar/oscar.c:3780 +#: ../libpurple/protocols/oscar/oscar.c:2696 +#: ../libpurple/protocols/oscar/oscar.c:3776 #: ../libpurple/protocols/sametime/sametime.c:3263 #: ../libpurple/protocols/sametime/sametime.c:4150 -#: ../libpurple/protocols/yahoo/yahoo.c:3248 ../pidgin/gtkblist.c:3104 -#: ../pidgin/gtkblist.c:3118 ../pidgin/gtkblist.c:3120 -#: ../pidgin/gtksavedstatuses.c:999 ../pidgin/gtksavedstatuses.c:1144 +#: ../libpurple/protocols/yahoo/yahoo.c:3247 +#: ../pidgin/gtkblist.c:3302 +#: ../pidgin/gtkblist.c:3316 +#: ../pidgin/gtkblist.c:3318 +#: ../pidgin/gtksavedstatuses.c:999 +#: ../pidgin/gtksavedstatuses.c:1144 msgid "Status" msgstr "Status" #: ../finch/gntft.c:211 msgid "Close this window when all transfers finish" -msgstr "" +msgstr "Lukk dette vinduet når alle overføringer er ferdige" #: ../finch/gntft.c:218 -#, fuzzy msgid "Clear finished transfers" msgstr "Fjern fullførte overføringer" #: ../finch/gntft.c:232 -#, fuzzy msgid "Stop" -msgstr "Hiptop" - -#: ../finch/gntft.c:305 ../pidgin/gtkft.c:169 ../pidgin/gtkft.c:973 +msgstr "Stopp" + +#: ../finch/gntft.c:305 +#: ../pidgin/gtkft.c:169 +#: ../pidgin/gtkft.c:973 msgid "Waiting for transfer to begin" msgstr "Venter på at overføringen skal starte" -#: ../finch/gntft.c:372 ../pidgin/gtkft.c:166 ../pidgin/gtkft.c:1054 +#: ../finch/gntft.c:372 +#: ../pidgin/gtkft.c:166 +#: ../pidgin/gtkft.c:1054 msgid "Canceled" msgstr "Avbrutt" -#: ../finch/gntft.c:374 ../pidgin/gtkft.c:1056 +#: ../finch/gntft.c:374 +#: ../pidgin/gtkft.c:1056 msgid "Failed" -msgstr "Feilet." - -#: ../finch/gntft.c:420 ../pidgin/gtkft.c:134 -#, fuzzy, c-format +msgstr "Feilet" + +#: ../finch/gntft.c:420 +#: ../pidgin/gtkft.c:134 +#, c-format msgid "%.2f KiB/s" -msgstr "%.2f KB/s" +msgstr "%.2f KiB/s" #: ../finch/gntft.c:431 #, c-format msgid "The file was saved as %s." -msgstr "" - -# -#: ../finch/gntft.c:432 ../finch/gntft.c:433 ../pidgin/gtkft.c:163 +msgstr "Filen ble lagret som %s." + +#: ../finch/gntft.c:432 +#: ../finch/gntft.c:433 +#: ../pidgin/gtkft.c:163 #: ../pidgin/gtkft.c:1116 msgid "Finished" -msgstr "Ferdig" - -#: ../finch/gntft.c:437 ../libpurple/protocols/msn/session.c:347 +msgstr "Fullført" + +#: ../finch/gntft.c:437 +#: ../libpurple/protocols/msn/session.c:386 msgid "Transferring" msgstr "Overfører" #: ../finch/gntnotify.c:165 -#, fuzzy msgid "Emails" -msgstr "E-post" - -#: ../finch/gntnotify.c:171 ../finch/gntnotify.c:225 +msgstr "E-poster" + +#: ../finch/gntnotify.c:171 +#: ../finch/gntnotify.c:225 msgid "You have mail!" -msgstr "" - -#: ../finch/gntnotify.c:174 ../pidgin/gtknotify.c:513 -#, fuzzy +msgstr "Du har e-post!" + +#: ../finch/gntnotify.c:174 +#: ../pidgin/gtknotify.c:510 msgid "Sender" -msgstr "Kjønn" - -#: ../finch/gntnotify.c:174 ../pidgin/gtknotify.c:520 +msgstr "Avsender" + +#: ../finch/gntnotify.c:174 +#: ../pidgin/gtknotify.c:517 msgid "Subject" -msgstr "" +msgstr "Tittel" #: ../finch/gntnotify.c:201 -#, fuzzy, c-format +#, c-format msgid "%s (%s) has %d new message." msgid_plural "%s (%s) has %d new messages." -msgstr[0] "%s har %d ny beskjed." -msgstr[1] "%s har %d nye beskjeder." - -#: ../finch/gntnotify.c:225 ../pidgin/gtknotify.c:341 -#, fuzzy +msgstr[0] "%s (%s) har %d ny beskjed." +msgstr[1] "%s (%s) har %d nye beskjeder." + +#: ../finch/gntnotify.c:225 +#: ../pidgin/gtknotify.c:341 msgid "New Mail" -msgstr "E-post" - -#: ../finch/gntnotify.c:290 ../pidgin/gtknotify.c:940 +msgstr "Ny e-post" + +#: ../finch/gntnotify.c:290 +#: ../pidgin/gtknotify.c:940 #, c-format msgid "Info for %s" msgstr "Info for %s" -#: ../finch/gntnotify.c:291 ../libpurple/protocols/toc/toc.c:476 +#: ../finch/gntnotify.c:291 +#: ../libpurple/protocols/toc/toc.c:476 #: ../pidgin/gtknotify.c:941 msgid "Buddy Information" msgstr "Kontaktinformasjon" -#: ../finch/gntnotify.c:377 ../libpurple/protocols/qq/group_join.c:367 -#, fuzzy +#: ../finch/gntnotify.c:380 +#: ../libpurple/protocols/qq/group_join.c:367 msgid "Continue" -msgstr "Kobler til" - -#: ../finch/gntnotify.c:386 ../pidgin/gtkconv.c:1596 -msgid "IM" -msgstr "Direktemelding" +msgstr "Fortsett" #: ../finch/gntnotify.c:389 -#, fuzzy +#: ../pidgin/gtkconv.c:1649 +msgid "IM" +msgstr "Direktemelding" + +#: ../finch/gntnotify.c:392 msgid "Join" -msgstr "_Bli med i samtalegruppe" - -#: ../finch/gntnotify.c:392 ../libpurple/protocols/sametime/sametime.c:3473 -msgid "Invite" -msgstr "Inviter" +msgstr "Bli med" #: ../finch/gntnotify.c:395 -#, fuzzy +#: ../libpurple/protocols/sametime/sametime.c:3473 +msgid "Invite" +msgstr "Inviter" + +#: ../finch/gntnotify.c:398 msgid "(none)" msgstr "(uten navn)" -#: ../finch/gntplugin.c:75 ../finch/gntplugin.c:84 +#: ../finch/gntplugin.c:75 +#: ../finch/gntplugin.c:84 msgid "ERROR" -msgstr "" +msgstr "FEIL" #: ../finch/gntplugin.c:75 -#, fuzzy msgid "loading plugin failed" -msgstr "Ping mislyktes" +msgstr "lasting av tillegg feilet" #: ../finch/gntplugin.c:84 msgid "unloading plugin failed" -msgstr "" +msgstr "avlessing av tillegg feilet" #: ../finch/gntplugin.c:129 #, c-format @@ -1250,517 +1428,539 @@ "Website: %s\n" "Filename: %s\n" msgstr "" +"Navn: %s\n" +"Versjon: %s\n" +"Beskrivelse: %s\n" +"Forfatter: %s\n" +"Hjemmeside: %s\n" +"Filnavn: %s\n" #: ../finch/gntplugin.c:187 msgid "Plugin need to be loaded before you can configure it." -msgstr "" +msgstr "Last inn tillegget før du kan konfigurere det." #: ../finch/gntplugin.c:235 msgid "No configuration options for this plugin." -msgstr "" +msgstr "Ingen konfigurasjons muligheter for dette tillegg." #: ../finch/gntplugin.c:260 -#, fuzzy msgid "You can (un)load plugins from the following list." -msgstr "Du venter på godkjenning fra disse kontaktene" +msgstr "Du kan laste/losse tillegg fra den følgende listen." #: ../finch/gntplugin.c:315 -#, fuzzy msgid "Configure Plugin" -msgstr "Konfigurer rom" +msgstr "Konfigurer tillegg" #. copy the preferences to tmp values... #. * I liked "take affect immediately" Oh well :-( #. (that should have been "effect," right?) #. Back to instant-apply! I win! BU-HAHAHA! #. Create the window -#: ../finch/gntplugin.c:371 ../finch/gntplugin.c:378 ../finch/gntprefs.c:264 -#: ../finch/gntui.c:90 ../pidgin/gtkdocklet.c:524 ../pidgin/gtkprefs.c:2067 +#: ../finch/gntplugin.c:371 +#: ../finch/gntplugin.c:378 +#: ../finch/gntprefs.c:264 +#: ../finch/gntui.c:90 +#: ../pidgin/gtkdocklet.c:524 +#: ../pidgin/gtkprefs.c:2069 msgid "Preferences" msgstr "Innstillinger" -#: ../finch/gntpounce.c:183 ../pidgin/gtkpounce.c:256 +#: ../finch/gntpounce.c:183 +#: ../pidgin/gtkpounce.c:256 msgid "Please enter a buddy to pounce." msgstr "Navnet på kontakten du vil varsle." -#: ../finch/gntpounce.c:328 ../pidgin/gtkpounce.c:517 +#: ../finch/gntpounce.c:328 +#: ../pidgin/gtkpounce.c:517 msgid "New Buddy Pounce" -msgstr "Legg til kompisvarsling" - -#: ../finch/gntpounce.c:328 ../pidgin/gtkpounce.c:517 +msgstr "Legg til kontaktvarsling" + +#: ../finch/gntpounce.c:328 +#: ../pidgin/gtkpounce.c:517 msgid "Edit Buddy Pounce" -msgstr "Rediger kompisvarsling" +msgstr "Rediger kontaktvarsling" #: ../finch/gntpounce.c:333 msgid "Pounce Who" -msgstr "Varsling for" +msgstr "Varsle hvem" #. Account: -#: ../finch/gntpounce.c:336 ../finch/gntstatus.c:456 +#: ../finch/gntpounce.c:336 +#: ../finch/gntstatus.c:456 msgid "Account:" msgstr "Konto:" #: ../finch/gntpounce.c:358 -#, fuzzy msgid "Buddy name:" msgstr "Kontaktnavn:" #. Create the "Pounce When Buddy..." frame. -#: ../finch/gntpounce.c:374 ../pidgin/gtkpounce.c:585 -#, fuzzy +#: ../finch/gntpounce.c:374 +#: ../pidgin/gtkpounce.c:585 msgid "Pounce When Buddy..." -msgstr "Varsle når" +msgstr "Varsle når kontakt..." #: ../finch/gntpounce.c:376 -#, fuzzy msgid "Signs on" -msgstr "Pålo_gging" +msgstr "Logger på" #: ../finch/gntpounce.c:377 -#, fuzzy msgid "Signs off" -msgstr "Logg _av" +msgstr "Logger av" #: ../finch/gntpounce.c:378 -#, fuzzy msgid "Goes away" -msgstr "Når fraværende" +msgstr "Forlater" #: ../finch/gntpounce.c:379 -#, fuzzy msgid "Returns from away" -msgstr "_Returnere fra fravær" +msgstr "Returnerer fra fravær" #: ../finch/gntpounce.c:380 -#, fuzzy msgid "Becomes idle" -msgstr "%s har blitt inaktiv" +msgstr "Blir inaktiv" #: ../finch/gntpounce.c:381 -#, fuzzy msgid "Is no longer idle" -msgstr "%s er ikke lenger inaktiv" +msgstr "Er ikke lenger inaktiv" #: ../finch/gntpounce.c:382 -#, fuzzy msgid "Starts typing" -msgstr "Venn s_tarter å skrive" +msgstr "Starter å skrive" #: ../finch/gntpounce.c:383 -#, fuzzy msgid "Pauses while typing" -msgstr "Brukeren skriver en melding..." +msgstr "Brukeren skriver en melding" #: ../finch/gntpounce.c:384 -#, fuzzy msgid "Stops typing" -msgstr "Venn slutter å skrive til deg" +msgstr "Stopper å skrive" #: ../finch/gntpounce.c:385 -#, fuzzy msgid "Sends a message" -msgstr "Send _beskjed" +msgstr "Sender en beskjed" #. Create the "Action" frame. -#: ../finch/gntpounce.c:414 ../pidgin/gtkpounce.c:646 -#, fuzzy +#: ../finch/gntpounce.c:414 +#: ../pidgin/gtkpounce.c:646 msgid "Action" -msgstr "Sted" +msgstr "Handling" #: ../finch/gntpounce.c:416 -#, fuzzy msgid "Open an IM window" -msgstr "Åpne vindu for direktem_elding" +msgstr "Åpne vindu for direktemelding" #: ../finch/gntpounce.c:417 -#, fuzzy msgid "Pop up a notification" -msgstr "Varslingsvindu spretter o_pp" +msgstr "Varslingsvindu spretter opp" #: ../finch/gntpounce.c:418 -#, fuzzy msgid "Send a message" -msgstr "Send _beskjed" +msgstr "Send en beskjed" #: ../finch/gntpounce.c:419 -#, fuzzy msgid "Execute a command" msgstr "Kjør en kommando" #: ../finch/gntpounce.c:420 -#, fuzzy msgid "Play a sound" msgstr "Spill av en lyd" #: ../finch/gntpounce.c:448 msgid "Pounce only when my status is not available" -msgstr "" - -#: ../finch/gntpounce.c:450 ../pidgin/gtkpounce.c:1281 +msgstr "Pounce kun når min status er ikke tilgjengelig" + +#: ../finch/gntpounce.c:450 +#: ../pidgin/gtkpounce.c:1281 msgid "Recurring" -msgstr "" +msgstr "Gjentar" #: ../finch/gntpounce.c:618 -#, fuzzy msgid "Cannot create pounce" -msgstr "Kan ikke endre kallenavn" +msgstr "Kan ikke opprette varsling" #: ../finch/gntpounce.c:619 msgid "You do not have any accounts." -msgstr "" +msgstr "Du har ingen kontoer." #: ../finch/gntpounce.c:620 msgid "You must create an account first before you can create a pounce." -msgstr "" - -#: ../finch/gntpounce.c:662 ../pidgin/gtkpounce.c:1096 -#, fuzzy, c-format +msgstr "Du må opprette en konto før du kan opprette en varsling." + +#: ../finch/gntpounce.c:662 +#: ../pidgin/gtkpounce.c:1096 +#, c-format msgid "Are you sure you want to delete the pounce on %s for %s?" -msgstr "Er du sikker på at du vil slette %s?" - -#: ../finch/gntpounce.c:696 ../finch/gntui.c:84 ../pidgin/gtkpounce.c:1325 -#, fuzzy +msgstr "Er du sikker på at du vil slette kontaktvarsling på %s for %s?" + +#: ../finch/gntpounce.c:696 +#: ../finch/gntui.c:84 +#: ../pidgin/gtkpounce.c:1325 msgid "Buddy Pounces" -msgstr "Legg til kompisvarsling" - -#: ../finch/gntpounce.c:810 ../pidgin/gtkpounce.c:1452 +msgstr "Kontaktvarsling" + +#: ../finch/gntpounce.c:810 +#: ../pidgin/gtkpounce.c:1452 #, c-format msgid "%s has started typing to you (%s)" msgstr "%s har begynt å skrive til deg (%s)" -#: ../finch/gntpounce.c:812 ../pidgin/gtkpounce.c:1454 -#, fuzzy, c-format +#: ../finch/gntpounce.c:812 +#: ../pidgin/gtkpounce.c:1454 +#, c-format msgid "%s has paused while typing to you (%s)" -msgstr "%s har begynt å skrive til deg (%s)" - -#: ../finch/gntpounce.c:814 ../pidgin/gtkpounce.c:1456 +msgstr "%s har pauset under skriving til deg (%s)" + +#: ../finch/gntpounce.c:814 +#: ../pidgin/gtkpounce.c:1456 #, c-format msgid "%s has signed on (%s)" msgstr "%s har logget på (%s)" -#: ../finch/gntpounce.c:816 ../pidgin/gtkpounce.c:1458 +#: ../finch/gntpounce.c:816 +#: ../pidgin/gtkpounce.c:1458 #, c-format msgid "%s has returned from being idle (%s)" msgstr "%s har blitt aktiv igjen (%s)" -#: ../finch/gntpounce.c:818 ../pidgin/gtkpounce.c:1460 +#: ../finch/gntpounce.c:818 +#: ../pidgin/gtkpounce.c:1460 #, c-format msgid "%s has returned from being away (%s)" msgstr "%s har kommet tilbake (%s)" -#: ../finch/gntpounce.c:820 ../pidgin/gtkpounce.c:1462 +#: ../finch/gntpounce.c:820 +#: ../pidgin/gtkpounce.c:1462 #, c-format msgid "%s has stopped typing to you (%s)" msgstr "%s har sluttet å skrive til deg (%s)" -#: ../finch/gntpounce.c:822 ../pidgin/gtkpounce.c:1464 +#: ../finch/gntpounce.c:822 +#: ../pidgin/gtkpounce.c:1464 #, c-format msgid "%s has signed off (%s)" msgstr "%s har logget av (%s)" -#: ../finch/gntpounce.c:824 ../pidgin/gtkpounce.c:1466 +#: ../finch/gntpounce.c:824 +#: ../pidgin/gtkpounce.c:1466 #, c-format msgid "%s has become idle (%s)" msgstr "%s har blitt inaktiv (%s)" -#: ../finch/gntpounce.c:826 ../pidgin/gtkpounce.c:1468 +#: ../finch/gntpounce.c:826 +#: ../pidgin/gtkpounce.c:1468 #, c-format msgid "%s has gone away. (%s)" msgstr "%s er borte. (%s)" -#: ../finch/gntpounce.c:828 ../pidgin/gtkpounce.c:1470 -#, fuzzy, c-format +#: ../finch/gntpounce.c:828 +#: ../pidgin/gtkpounce.c:1470 +#, c-format msgid "%s has sent you a message. (%s)" -msgstr "%s ønsker å sende deg %s (%s)" - -#: ../finch/gntpounce.c:829 ../pidgin/gtkpounce.c:1471 -#, c-format +msgstr "%s har sendt deg en beskjed. (%s)" + +#: ../finch/gntpounce.c:829 +#: ../pidgin/gtkpounce.c:1471 msgid "Unknown pounce event. Please report this!" msgstr "Ukjent varslingshendelse. Vennligst rapporter dette!" #: ../finch/gntprefs.c:92 msgid "Based on keyboard use" -msgstr "" - -#: ../finch/gntprefs.c:94 ../pidgin/gtkprefs.c:1930 -#, fuzzy +msgstr "Basert på tastatur bruk" + +#: ../finch/gntprefs.c:94 +#: ../pidgin/gtkprefs.c:1932 msgid "From last sent message" -msgstr "CTRL-Enter sender beskjeden" - -#: ../finch/gntprefs.c:96 ../pidgin/gtkprefs.c:898 ../pidgin/gtkprefs.c:907 -#: ../pidgin/gtkprefs.c:1929 ../pidgin/gtkprefs.c:1943 +msgstr "Fra sist sendte beskjed" + +#: ../finch/gntprefs.c:96 +#: ../pidgin/gtkprefs.c:898 +#: ../pidgin/gtkprefs.c:907 +#: ../pidgin/gtkprefs.c:1931 +#: ../pidgin/gtkprefs.c:1945 #: ../pidgin/plugins/win32/winprefs/winprefs.c:333 msgid "Never" msgstr "Aldri" #: ../finch/gntprefs.c:184 -#, fuzzy msgid "Show Idle Time" -msgstr "Sett fraværstid for konto" +msgstr "Vis inaktivtid" #: ../finch/gntprefs.c:185 -#, fuzzy msgid "Show Offline Buddies" -msgstr "/Kontakter/Vis _avloggede kontakter" +msgstr "Vis avloggede kontakter" #: ../finch/gntprefs.c:192 -#, fuzzy msgid "Notify buddies when you are typing" msgstr "Varsle kontakter når skriver til dem" #: ../finch/gntprefs.c:198 -#, fuzzy msgid "Log format" -msgstr "Logg_format:" +msgstr "Logg-format" #: ../finch/gntprefs.c:199 msgid "Log IMs" -msgstr "" +msgstr "Logg lynmeldinger" #: ../finch/gntprefs.c:200 -#, fuzzy msgid "Log chats" msgstr "Logg alle samtaler" #: ../finch/gntprefs.c:201 -#, fuzzy msgid "Log status change events" -msgstr "Logg alle status endinger til systemlogg" +msgstr "Logg alle status endinger" #: ../finch/gntprefs.c:207 -#, fuzzy msgid "Report Idle time" msgstr "Vis inaktiv tid" #: ../finch/gntprefs.c:208 -#, fuzzy msgid "Change status when idle" -msgstr "Sett som borte når inaktiv" +msgstr "Forandre status når inaktiv" #: ../finch/gntprefs.c:209 -#, fuzzy msgid "Minutes before changing status" -msgstr "Antall minutter før fraværsmarkert:" +msgstr "Antall minutter før fraværsmarkert" #: ../finch/gntprefs.c:210 -#, fuzzy msgid "Change status to" -msgstr "Endre adresse til:" +msgstr "Endre status til" #. Conversations -#: ../finch/gntprefs.c:259 ../pidgin/gtkprefs.c:993 ../pidgin/gtkprefs.c:2033 +#: ../finch/gntprefs.c:259 +#: ../pidgin/gtkprefs.c:993 +#: ../pidgin/gtkprefs.c:2035 #: ../pidgin/plugins/win32/winprefs/winprefs.c:340 msgid "Conversations" msgstr "Samtaler" -#: ../finch/gntprefs.c:260 ../pidgin/gtkprefs.c:1467 ../pidgin/gtkprefs.c:2044 +#: ../finch/gntprefs.c:260 +#: ../pidgin/gtkprefs.c:1469 +#: ../pidgin/gtkprefs.c:2046 msgid "Logging" msgstr "Logging" #: ../finch/gntrequest.c:583 -#, fuzzy msgid "Not implemented yet." -msgstr "Funksjonen er ikke implementert" - -#: ../finch/gntrequest.c:659 ../pidgin/gtkrequest.c:1555 +msgstr "Ikke implementert enda." + +#: ../finch/gntrequest.c:659 +#: ../pidgin/gtkrequest.c:1555 #: ../pidgin/gtkrequest.c:1601 msgid "Save File..." msgstr "Lagre fil..." -#: ../finch/gntrequest.c:659 ../pidgin/gtkrequest.c:1556 +#: ../finch/gntrequest.c:659 +#: ../pidgin/gtkrequest.c:1556 #: ../pidgin/gtkrequest.c:1602 msgid "Open File..." msgstr "Åpne fil..." -#: ../finch/gntsound.c:97 ../pidgin/gtksound.c:64 +#: ../finch/gntsound.c:97 +#: ../pidgin/gtksound.c:64 msgid "Buddy logs in" msgstr "Kontakt logger inn" -#: ../finch/gntsound.c:98 ../pidgin/gtksound.c:65 +#: ../finch/gntsound.c:98 +#: ../pidgin/gtksound.c:65 msgid "Buddy logs out" msgstr "Kontakt logger ut" -#: ../finch/gntsound.c:99 ../pidgin/gtksound.c:66 +#: ../finch/gntsound.c:99 +#: ../pidgin/gtksound.c:66 msgid "Message received" msgstr "Beskjed mottatt" -#: ../finch/gntsound.c:100 ../pidgin/gtksound.c:67 +#: ../finch/gntsound.c:100 +#: ../pidgin/gtksound.c:67 msgid "Message received begins conversation" msgstr "Beskjed mottas og samtale starter" -#: ../finch/gntsound.c:101 ../pidgin/gtksound.c:68 +#: ../finch/gntsound.c:101 +#: ../pidgin/gtksound.c:68 msgid "Message sent" msgstr "Beskjed sendt" -#: ../finch/gntsound.c:102 ../pidgin/gtksound.c:69 +#: ../finch/gntsound.c:102 +#: ../pidgin/gtksound.c:69 msgid "Person enters chat" msgstr "Person blir med i samtalen" -#: ../finch/gntsound.c:103 ../pidgin/gtksound.c:70 +#: ../finch/gntsound.c:103 +#: ../pidgin/gtksound.c:70 msgid "Person leaves chat" msgstr "Person forlater samtalen" -#: ../finch/gntsound.c:104 ../pidgin/gtksound.c:71 +#: ../finch/gntsound.c:104 +#: ../pidgin/gtksound.c:71 msgid "You talk in chat" msgstr "Du snakker i samtalen" -#: ../finch/gntsound.c:105 ../pidgin/gtksound.c:72 +#: ../finch/gntsound.c:105 +#: ../pidgin/gtksound.c:72 msgid "Others talk in chat" msgstr "Andre snakker i samtalen" -#: ../finch/gntsound.c:107 ../pidgin/gtksound.c:75 -#, fuzzy +#: ../finch/gntsound.c:107 +#: ../pidgin/gtksound.c:75 msgid "Someone says your screen name in chat" -msgstr "Noen sier navnet ditt i en samtale" - -#: ../finch/gntsound.c:361 ../pidgin/gtksound.c:311 +msgstr "Noen roper skjermnavnet ditt i en samtale" + +#: ../finch/gntsound.c:361 +#: ../pidgin/gtksound.c:311 msgid "GStreamer Failure" -msgstr "" - -#: ../finch/gntsound.c:362 ../pidgin/gtksound.c:312 +msgstr "Feil i GStreamer" + +#: ../finch/gntsound.c:362 +#: ../pidgin/gtksound.c:312 msgid "GStreamer failed to initialize." -msgstr "" - -#: ../finch/gntsound.c:716 ../finch/gntsound.c:802 ../pidgin/gtkprefs.c:1587 -#: ../pidgin/gtkprefs.c:1676 ../pidgin/gtkprefs.c:1872 -#, fuzzy +msgstr "Start av GStreamer feilet." + +#: ../finch/gntsound.c:716 +#: ../finch/gntsound.c:802 +#: ../pidgin/gtkprefs.c:1589 +#: ../pidgin/gtkprefs.c:1678 +#: ../pidgin/gtkprefs.c:1874 msgid "(default)" -msgstr "Gnome-standard" +msgstr "(forvalgt)" #: ../finch/gntsound.c:729 -#, fuzzy msgid "Select Sound File ..." -msgstr "Velg fil" +msgstr "Velg lydfil ..." #: ../finch/gntsound.c:904 -#, fuzzy msgid "Sound Preferences" -msgstr "Innstillinger" +msgstr "Lydinnstillinger" #: ../finch/gntsound.c:915 -#, fuzzy msgid "Profiles" -msgstr "Profil" - -#: ../finch/gntsound.c:954 ../pidgin/gtkprefs.c:1717 +msgstr "Profiler" + +#: ../finch/gntsound.c:954 +#: ../pidgin/gtkprefs.c:1719 msgid "Automatic" msgstr "Automatisk" #: ../finch/gntsound.c:957 -#, fuzzy msgid "Console Beep" msgstr "Konsollpip" -#: ../finch/gntsound.c:958 ../pidgin/gtkprefs.c:1721 +#: ../finch/gntsound.c:958 +#: ../pidgin/gtkprefs.c:1723 msgid "Command" msgstr "Kommando" #: ../finch/gntsound.c:959 -#, fuzzy msgid "No Sound" -msgstr "Lyder" - -#: ../finch/gntsound.c:961 ../pidgin/gtkprefs.c:1712 +msgstr "Ingen lyd" + +#: ../finch/gntsound.c:961 +#: ../pidgin/gtkprefs.c:1714 msgid "Sound Method" msgstr "Lydtype" #: ../finch/gntsound.c:966 -#, fuzzy msgid "Method: " -msgstr "_Metode:" +msgstr "Metode: " #: ../finch/gntsound.c:973 -#, fuzzy, c-format +#, c-format msgid "" "Sound Command\n" "(%s for filename)" msgstr "" -"_Program for lydavspilling\n" +"Lydkommando\n" "(%s for filnavn)" #. Sound options -#: ../finch/gntsound.c:981 ../pidgin/gtkprefs.c:1756 +#: ../finch/gntsound.c:981 +#: ../pidgin/gtkprefs.c:1758 msgid "Sound Options" msgstr "Lydinnstillinger" -# #: ../finch/gntsound.c:982 -#, fuzzy msgid "Sounds when conversation has focus" -msgstr "Lyder når samtalevinduet har _fokus" - -#: ../finch/gntsound.c:990 ../pidgin/gtkprefs.c:897 ../pidgin/gtkprefs.c:909 -#: ../pidgin/gtkprefs.c:1763 ../pidgin/plugins/timestamp_format.c:42 +msgstr "Lyder når samtalen har fokus" + +#: ../finch/gntsound.c:990 +#: ../pidgin/gtkprefs.c:897 +#: ../pidgin/gtkprefs.c:909 +#: ../pidgin/gtkprefs.c:1765 +#: ../pidgin/plugins/timestamp_format.c:42 #: ../pidgin/plugins/timestamp_format.c:51 #: ../pidgin/plugins/win32/winprefs/winprefs.c:334 -#, fuzzy msgid "Always" -msgstr "Borte" - -#: ../finch/gntsound.c:991 ../pidgin/gtkprefs.c:1761 -#, fuzzy +msgstr "Alltid" + +#: ../finch/gntsound.c:991 +#: ../pidgin/gtkprefs.c:1763 msgid "Only when available" -msgstr "Ikke tilgjengelig" - -#: ../finch/gntsound.c:992 ../pidgin/gtkprefs.c:1762 -#, fuzzy +msgstr "Bare hvis tilgjengelig" + +#: ../finch/gntsound.c:992 +#: ../pidgin/gtkprefs.c:1764 msgid "Only when not available" -msgstr "Snakkerom i %s er ikke tilgjengelig." +msgstr "Bare hvis ikke tilgjengelig" #: ../finch/gntsound.c:999 msgid "Volume(0-100):" -msgstr "" +msgstr "Volum(0-100):" #. Sound events -#: ../finch/gntsound.c:1018 ../pidgin/gtkprefs.c:1798 +#: ../finch/gntsound.c:1018 +#: ../pidgin/gtkprefs.c:1800 msgid "Sound Events" msgstr "Lydhendelser" -#: ../finch/gntsound.c:1020 ../pidgin/gtkprefs.c:1857 +#: ../finch/gntsound.c:1020 +#: ../pidgin/gtkprefs.c:1859 msgid "Event" msgstr "Hendelse" #: ../finch/gntsound.c:1020 -#, fuzzy msgid "File" -msgstr "Feilet." - -#: ../finch/gntsound.c:1039 ../pidgin/gtkprefs.c:1876 +msgstr "Fil" + +#: ../finch/gntsound.c:1039 +#: ../pidgin/gtkprefs.c:1878 msgid "Test" msgstr "Test" -#: ../finch/gntsound.c:1042 ../pidgin/gtkprefs.c:1880 +#: ../finch/gntsound.c:1042 +#: ../pidgin/gtkprefs.c:1882 msgid "Reset" msgstr "Nullstill" -#: ../finch/gntsound.c:1045 ../pidgin/gtkprefs.c:1884 +#: ../finch/gntsound.c:1045 +#: ../pidgin/gtkprefs.c:1886 msgid "Choose..." msgstr "Bla gjennom..." #: ../finch/gntstatus.c:138 -#, fuzzy, c-format +#, c-format msgid "Are you sure you want to delete \"%s\"" -msgstr "Er du sikker på at du vil slette %s?" +msgstr "Er du sikker på at du vil slette \"%s\"" #: ../finch/gntstatus.c:141 -#, fuzzy msgid "Delete Status" -msgstr "Påloggningsstatus" - -#: ../finch/gntstatus.c:176 ../pidgin/gtksavedstatuses.c:597 -#, fuzzy +msgstr "Slett status" + +#: ../finch/gntstatus.c:176 +#: ../pidgin/gtksavedstatuses.c:597 msgid "Saved Statuses" -msgstr "Tjenerstatistikk" - -#: ../finch/gntstatus.c:183 ../finch/gntstatus.c:539 +msgstr "Lagrede statuser" + +#: ../finch/gntstatus.c:183 +#: ../finch/gntstatus.c:539 #: ../libpurple/protocols/jabber/buddy.c:298 #: ../libpurple/protocols/jabber/buddy.c:1359 -#: ../libpurple/protocols/novell/novell.c:1484 +#: ../libpurple/protocols/novell/novell.c:1486 #: ../pidgin/gtksavedstatuses.c:500 msgid "Title" msgstr "Tittel" -#: ../finch/gntstatus.c:183 ../pidgin/gtksavedstatuses.c:515 +#: ../finch/gntstatus.c:183 +#: ../pidgin/gtksavedstatuses.c:515 msgid "Type" msgstr "Type" @@ -1772,31 +1972,43 @@ #. user_settable #. not independent #. Attributes - each status can have a message. -#: ../finch/gntstatus.c:183 ../finch/gntstatus.c:564 ../finch/gntstatus.c:576 +#: ../finch/gntstatus.c:183 +#: ../finch/gntstatus.c:564 +#: ../finch/gntstatus.c:576 #: ../libpurple/protocols/bonjour/bonjour.c:256 #: ../libpurple/protocols/bonjour/bonjour.c:263 #: ../libpurple/protocols/bonjour/bonjour.c:346 -#: ../libpurple/protocols/gg/gg.c:1077 ../libpurple/protocols/gg/gg.c:1579 -#: ../libpurple/protocols/gg/gg.c:1597 ../libpurple/protocols/gg/gg.c:1607 -#: ../libpurple/protocols/gg/gg.c:1613 ../libpurple/protocols/gg/gg.c:1622 -#: ../libpurple/protocols/gg/gg.c:1627 ../libpurple/protocols/irc/irc.c:234 +#: ../libpurple/protocols/gg/gg.c:1077 +#: ../libpurple/protocols/gg/gg.c:1579 +#: ../libpurple/protocols/gg/gg.c:1597 +#: ../libpurple/protocols/gg/gg.c:1607 +#: ../libpurple/protocols/gg/gg.c:1613 +#: ../libpurple/protocols/gg/gg.c:1622 +#: ../libpurple/protocols/gg/gg.c:1627 +#: ../libpurple/protocols/irc/irc.c:234 #: ../libpurple/protocols/jabber/jabber.c:1532 #: ../libpurple/protocols/jabber/jabber.c:1555 #: ../libpurple/protocols/jabber/jabber.c:1578 #: ../libpurple/protocols/jabber/jabber.c:1601 #: ../libpurple/protocols/jabber/jabber.c:1624 #: ../libpurple/protocols/jabber/jabber.c:1649 +#: ../libpurple/protocols/msn/msn.c:634 +#: ../libpurple/protocols/msn/msn.c:641 +#: ../libpurple/protocols/msn/msn.c:648 +#: ../libpurple/protocols/msn/msn.c:655 +#: ../libpurple/protocols/msn/msn.c:661 +#: ../libpurple/protocols/msn/msn.c:667 #: ../libpurple/protocols/myspace/myspace.c:148 -#: ../libpurple/protocols/novell/novell.c:2838 -#: ../libpurple/protocols/novell/novell.c:2941 -#: ../libpurple/protocols/novell/novell.c:2947 -#: ../libpurple/protocols/novell/novell.c:2953 -#: ../libpurple/protocols/oscar/oscar.c:5554 -#: ../libpurple/protocols/oscar/oscar.c:5772 -#: ../libpurple/protocols/oscar/oscar.c:5786 -#: ../libpurple/protocols/oscar/oscar.c:5802 -#: ../libpurple/protocols/oscar/oscar.c:5809 -#: ../libpurple/protocols/oscar/oscar.c:5816 +#: ../libpurple/protocols/novell/novell.c:2843 +#: ../libpurple/protocols/novell/novell.c:2946 +#: ../libpurple/protocols/novell/novell.c:2952 +#: ../libpurple/protocols/novell/novell.c:2958 +#: ../libpurple/protocols/oscar/oscar.c:5552 +#: ../libpurple/protocols/oscar/oscar.c:5770 +#: ../libpurple/protocols/oscar/oscar.c:5784 +#: ../libpurple/protocols/oscar/oscar.c:5800 +#: ../libpurple/protocols/oscar/oscar.c:5807 +#: ../libpurple/protocols/oscar/oscar.c:5814 #: ../libpurple/protocols/sametime/sametime.c:3286 #: ../libpurple/protocols/sametime/sametime.c:3292 #: ../libpurple/protocols/sametime/sametime.c:3298 @@ -1804,242 +2016,226 @@ #: ../libpurple/protocols/silc/buddy.c:1551 #: ../libpurple/protocols/silc10/buddy.c:1551 #: ../libpurple/protocols/simple/simple.c:246 -#: ../libpurple/protocols/yahoo/yahoo.c:3751 -#: ../libpurple/protocols/yahoo/yahoo.c:3757 +#: ../libpurple/protocols/yahoo/yahoo.c:3750 +#: ../libpurple/protocols/yahoo/yahoo.c:3756 #: ../libpurple/protocols/zephyr/zephyr.c:2337 -#: ../pidgin/gtksavedstatuses.c:526 ../pidgin/gtksavedstatuses.c:1010 +#: ../pidgin/gtksavedstatuses.c:526 +#: ../pidgin/gtksavedstatuses.c:1010 msgid "Message" -msgstr "Beskjed:" +msgstr "Beskjed" #. Use -#: ../finch/gntstatus.c:194 ../finch/gntstatus.c:593 -#, fuzzy +#: ../finch/gntstatus.c:194 +#: ../finch/gntstatus.c:593 msgid "Use" msgstr "Bruk" #: ../finch/gntstatus.c:301 -#, fuzzy msgid "Invalid title" -msgstr "Ugyldig authzid" +msgstr "Ugyldig tittel" #: ../finch/gntstatus.c:302 -#, fuzzy msgid "Please enter a non-empty title for the status." -msgstr "Vennligst skriv inn nytt navn for gruppen." +msgstr "Vennligst ikke angi et tom tittel til statusen." #: ../finch/gntstatus.c:310 -#, fuzzy msgid "Duplicate title" -msgstr "Dupliserings Korrigering" +msgstr "Dupliserings tittel" #: ../finch/gntstatus.c:311 -#, fuzzy msgid "Please enter a different title for the status." -msgstr "Vennligst skriv inn nytt navn for gruppen." +msgstr "Vennligst skriv inn en annen tittel til statusen." #: ../finch/gntstatus.c:452 -#, fuzzy msgid "Substatus" -msgstr "Status" - -#: ../finch/gntstatus.c:464 ../pidgin/gtkft.c:699 +msgstr "Understatus" + +#: ../finch/gntstatus.c:464 +#: ../pidgin/gtkft.c:699 msgid "Status:" msgstr "Status:" #: ../finch/gntstatus.c:479 -#, fuzzy msgid "Message:" msgstr "Beskjed:" #: ../finch/gntstatus.c:528 -#, fuzzy msgid "Edit Status" -msgstr "Sivilstatus" +msgstr "Endre status" #: ../finch/gntstatus.c:570 -#, fuzzy msgid "Use different status for following accounts" -msgstr "Bruk en annen status for noen kontoer" +msgstr "Bruk en annen status for følgende kontoer" #. Save & Use #: ../finch/gntstatus.c:604 -#, fuzzy msgid "Save & Use" -msgstr "Lagre & bruk" +msgstr "Lagre og bruk" #: ../finch/gntui.c:85 msgid "Certificates" -msgstr "" - -#: ../finch/gntui.c:89 ../pidgin/gtkprefs.c:2035 +msgstr "Sertifikater" + +#: ../finch/gntui.c:89 +#: ../pidgin/gtkprefs.c:2037 msgid "Sounds" msgstr "Lyder" #: ../finch/gntui.c:91 -#, fuzzy msgid "Statuses" -msgstr "Status" - -#: ../finch/plugins/gntclipboard.c:115 ../finch/plugins/gntclipboard.c:121 +msgstr "Statuser" + +#: ../finch/plugins/gntclipboard.c:115 +#: ../finch/plugins/gntclipboard.c:121 #: ../finch/plugins/gntclipboard.c:128 -#, fuzzy msgid "Error loading the plugin." -msgstr "Lar deg laste perl-tillegg." +msgstr "Feil ved lasting av tillegget." #: ../finch/plugins/gntclipboard.c:116 -#, fuzzy msgid "Couldn't find X display" -msgstr "Kan ikke sende fil" +msgstr "Kunne ikke finne X display" #: ../finch/plugins/gntclipboard.c:122 -#, fuzzy msgid "Couldn't find window" -msgstr "Kan ikke sende fil" +msgstr "Kan ikke finne vindu" #: ../finch/plugins/gntclipboard.c:129 msgid "This plugin cannot be loaded because it was not built with X11 support." -msgstr "" +msgstr "Dette tillegget kan ikke bli lastet fordi det ikke var bygd med X11 støtte." #: ../finch/plugins/gntclipboard.c:158 msgid "GntClipboard" -msgstr "" +msgstr "GntClipboard" #: ../finch/plugins/gntclipboard.c:160 msgid "Clipboard plugin" -msgstr "" +msgstr "Utklipstavle tillegg" #: ../finch/plugins/gntclipboard.c:161 -msgid "" -"When the gnt clipboard contents change, the contents are made available to " -"X, if possible." -msgstr "" +msgid "When the gnt clipboard contents change, the contents are made available to X, if possible." +msgstr "Når innholdet i gnt clipboard forandres, vil innholdet bli gjort tilgjengelig for X, om mulig." #: ../finch/plugins/gntgf.c:231 -#, fuzzy, c-format +#, c-format msgid "%s just signed on" -msgstr "%s har logget på" +msgstr "%s logget akkurat på" #: ../finch/plugins/gntgf.c:238 -#, fuzzy, c-format +#, c-format msgid "%s just signed off" -msgstr "%s logget av" +msgstr "%s logget akkurat av" #: ../finch/plugins/gntgf.c:246 -#, fuzzy, c-format +#, c-format msgid "%s sent you a message" -msgstr "%s ønsker å sende deg en fil." +msgstr "%s har sendt deg en beskjed" #: ../finch/plugins/gntgf.c:265 #, c-format msgid "%s said your nick in %s" -msgstr "" +msgstr "%s sa navnet ditt i %s" #: ../finch/plugins/gntgf.c:267 -#, fuzzy, c-format +#, c-format msgid "%s sent a message in %s" -msgstr "Send _beskjed" +msgstr "%s sendte en beskjed i %s" #: ../finch/plugins/gntgf.c:305 -#, fuzzy msgid "Buddy signs on/off" -msgstr "Kontakt er avlogget:" +msgstr "Kontakt logget på/av" #: ../finch/plugins/gntgf.c:306 msgid "You receive an IM" -msgstr "" +msgstr "Du mottok en lynmelding" #: ../finch/plugins/gntgf.c:307 -#, fuzzy msgid "Someone speaks in a chat" -msgstr "Noen sier navnet ditt i en samtale" +msgstr "Noen snakker i en samtale" #: ../finch/plugins/gntgf.c:308 -#, fuzzy msgid "Someone says your name in a chat" -msgstr "Noen sier navnet ditt i en samtale" +msgstr "Noen sa navnet ditt i en samtale" #: ../finch/plugins/gntgf.c:336 msgid "Notify with a toaster when" -msgstr "" +msgstr "Notify with a toaster when" #: ../finch/plugins/gntgf.c:351 msgid "Beep too!" -msgstr "" +msgstr "Pip også!" #: ../finch/plugins/gntgf.c:357 msgid "Set URGENT for the terminal window." -msgstr "" +msgstr "Sett HASTER for terminalvinduet." #: ../finch/plugins/gntgf.c:377 msgid "GntGf" -msgstr "" - -#: ../finch/plugins/gntgf.c:379 ../finch/plugins/gntgf.c:380 +msgstr "GntGf" + +#: ../finch/plugins/gntgf.c:379 +#: ../finch/plugins/gntgf.c:380 msgid "Toaster plugin" -msgstr "" - -#: ../finch/plugins/gnthistory.c:116 ../pidgin/plugins/history.c:120 -#, fuzzy, c-format +msgstr "Toaster tillegg" + +#: ../finch/plugins/gnthistory.c:116 +#: ../pidgin/plugins/history.c:123 +#, c-format msgid "Conversation with %s on %s:
" -msgstr "Samtaler med %s" - -#: ../finch/plugins/gnthistory.c:138 ../pidgin/plugins/history.c:147 +msgstr "Samtaler med %s på %s:
" + +#: ../finch/plugins/gnthistory.c:138 +#: ../pidgin/plugins/history.c:150 msgid "History Plugin Requires Logging" msgstr "Historie Tillegg Krever Logging" -#: ../finch/plugins/gnthistory.c:139 ../pidgin/plugins/history.c:148 +#: ../finch/plugins/gnthistory.c:139 +#: ../pidgin/plugins/history.c:151 msgid "" "Logging can be enabled from Tools -> Preferences -> Logging.\n" "\n" -"Enabling logs for instant messages and/or chats will activate history for " -"the same conversation type(s)." +"Enabling logs for instant messages and/or chats will activate history for the same conversation type(s)." msgstr "" "Logging kan slås på gjennom Verktøy -> Innstillinger -> Logging.\n" "\n" -"Å slå på logging for lynmeldinger og/eller prat vil aktivere historie for " -"den samme samtaletypen." +"Å slå på logging for lynmeldinger og/eller prat vil aktivere historie for den samme samtaletypen." #: ../finch/plugins/gnthistory.c:179 -#, fuzzy msgid "GntHistory" -msgstr "Historikk" - -#: ../finch/plugins/gnthistory.c:181 ../pidgin/plugins/history.c:190 +msgstr "GntHistorikk" + +#: ../finch/plugins/gnthistory.c:181 +#: ../pidgin/plugins/history.c:194 msgid "Shows recently logged conversations in new conversations." msgstr "Viser tidligere loggede samtaler i nye samtaler." -#: ../finch/plugins/gnthistory.c:182 ../pidgin/plugins/history.c:191 -msgid "" -"When a new conversation is opened this plugin will insert the last " -"conversation into the current conversation." -msgstr "" -"Når en ny samtale startes, vil dette tillegget sette inn den forrige " -"samtalen i den pågående." +#: ../finch/plugins/gnthistory.c:182 +#: ../pidgin/plugins/history.c:195 +msgid "When a new conversation is opened this plugin will insert the last conversation into the current conversation." +msgstr "Når en ny samtale startes, vil dette tillegget sette inn den forrige samtalen i den pågående." #: ../finch/plugins/lastlog.c:69 msgid "Lastlog" -msgstr "" - -#. Translator Note: The "backlog" is the conversation buffer/history. -#: ../finch/plugins/lastlog.c:100 +msgstr "Lastlog" + +#: ../finch/plugins/lastlog.c:99 msgid "lastlog: Searches for a substring in the backlog." -msgstr "" - -#: ../finch/plugins/lastlog.c:122 +msgstr "lastlog: Søker etter en understreng i backlog." + +#: ../finch/plugins/lastlog.c:121 msgid "GntLastlog" -msgstr "" - -#: ../finch/plugins/lastlog.c:124 ../finch/plugins/lastlog.c:125 +msgstr "GntLastlog" + +#: ../finch/plugins/lastlog.c:123 +#: ../finch/plugins/lastlog.c:124 msgid "Lastlog plugin." -msgstr "" +msgstr "Lastlog tillegg." #: ../libpurple/account.c:791 -#, fuzzy msgid "accounts" -msgstr "Kontoer" - -#: ../libpurple/account.c:958 ../libpurple/protocols/jabber/auth.c:195 -#, fuzzy +msgstr "kontoer" + +#: ../libpurple/account.c:958 +#: ../libpurple/protocols/jabber/auth.c:195 msgid "Password is required to sign on." msgstr "Passord kreves for å logge på." @@ -2049,28 +2245,29 @@ msgstr "Oppgi passord for %s (%s)" #: ../libpurple/account.c:999 -#, fuzzy msgid "Enter Password" -msgstr "Oppgi passord" +msgstr "Oppgi passord" # #: ../libpurple/account.c:1004 -#, fuzzy msgid "Save password" msgstr "Lagre passord" -#: ../libpurple/account.c:1039 ../libpurple/connection.c:105 +#: ../libpurple/account.c:1039 +#: ../libpurple/connection.c:105 #: ../libpurple/connection.c:178 #, c-format msgid "Missing protocol plugin for %s" msgstr "Mangler protokolltillegg for %s" -#: ../libpurple/account.c:1041 ../libpurple/connection.c:108 -#: ../pidgin/gtkblist.c:4036 +#: ../libpurple/account.c:1041 +#: ../libpurple/connection.c:108 +#: ../pidgin/gtkblist.c:4318 msgid "Connection Error" msgstr "Feil ved tilkobling" -#: ../libpurple/account.c:1199 ../libpurple/protocols/gg/gg.c:707 +#: ../libpurple/account.c:1199 +#: ../libpurple/protocols/gg/gg.c:707 #: ../libpurple/protocols/jabber/jabber.c:1687 msgid "New passwords do not match." msgstr "De nye passordene stemmer ikke overens." @@ -2079,17 +2276,14 @@ msgid "Fill out all fields completely." msgstr "Fyll ut alle feltene fullstendig." -# #: ../libpurple/account.c:1231 msgid "Original password" msgstr "Opprinnelig passord" -# #: ../libpurple/account.c:1238 msgid "New password" msgstr "Nytt passord" -# #: ../libpurple/account.c:1245 msgid "New password (again)" msgstr "Nytt passord (igjen)" @@ -2097,9 +2291,8 @@ #: ../libpurple/account.c:1251 #, c-format msgid "Change password for %s" -msgstr "Endre passord for %s:" - -# +msgstr "Endre passord for %s" + #: ../libpurple/account.c:1259 msgid "Please enter your current password and your new password." msgstr "Skriv inn ditt nåværende passord og ditt nye passord." @@ -2109,41 +2302,46 @@ msgid "Change user information for %s" msgstr "Endre brukerinformasjon for %s" -#: ../libpurple/account.c:1293 ../libpurple/protocols/toc/toc.c:1670 +#: ../libpurple/account.c:1293 +#: ../libpurple/protocols/toc/toc.c:1670 msgid "Set User Info" msgstr "Sett brukerinfo" -#: ../libpurple/account.c:1764 ../libpurple/protocols/gg/gg.c:1017 +#: ../libpurple/account.c:1764 +#: ../libpurple/protocols/gg/gg.c:1017 #: ../libpurple/protocols/jabber/buddy.c:782 -#: ../libpurple/protocols/jabber/buddy.c:2027 -#: ../libpurple/protocols/jabber/buddy.c:2044 -#: ../libpurple/protocols/novell/novell.c:2831 -#: ../libpurple/protocols/qq/qq.c:232 ../pidgin/gtkft.c:160 +#: ../libpurple/protocols/jabber/buddy.c:2030 +#: ../libpurple/protocols/jabber/buddy.c:2047 +#: ../libpurple/protocols/novell/novell.c:2836 +#: ../libpurple/protocols/qq/qq.c:232 +#: ../pidgin/gtkft.c:160 msgid "Unknown" msgstr "Ukjent" -#: ../libpurple/blist.c:521 ../libpurple/blist.c:1320 -#: ../libpurple/blist.c:1552 ../libpurple/protocols/jabber/roster.c:69 -#: ../libpurple/protocols/myspace/myspace.c:3244 ../pidgin/gtkblist.c:5373 +#: ../libpurple/blist.c:521 +#: ../libpurple/blist.c:1321 +#: ../libpurple/blist.c:1531 +#: ../libpurple/protocols/jabber/roster.c:69 +#: ../libpurple/protocols/myspace/myspace.c:3242 +#: ../pidgin/gtkblist.c:5662 #: ../pidgin/plugins/gevolution/gevo-util.c:67 #: ../pidgin/plugins/gevolution/gevolution.c:96 msgid "Buddies" msgstr "Kontakter" #: ../libpurple/blist.c:548 -#, fuzzy msgid "buddy list" -msgstr "Kontaktliste" +msgstr "kontaktliste" #: ../libpurple/certificate.c:545 msgid "(DOES NOT MATCH)" -msgstr "" +msgstr "(MATCHER IKKE)" #. Make messages #: ../libpurple/certificate.c:549 #, c-format msgid "%s has presented the following certificate for just-this-once use:" -msgstr "" +msgstr "%s har presentert følgende sertifikat for engangsbruk:" #: ../libpurple/certificate.c:550 #, c-format @@ -2151,52 +2349,54 @@ "Common name: %s %s\n" "Fingerprint (SHA1): %s" msgstr "" +"Vanlig navn: %s %s\n" +"Fingeravtrykk (SHA1): %s" #. TODO: Find what the handle ought to be #: ../libpurple/certificate.c:555 msgid "Single-use Certificate Verification" -msgstr "" +msgstr "Verifiserer engangsbuk sertifikat" #. Scheme name #. Pool name #: ../libpurple/certificate.c:872 msgid "Certificate Authorities" -msgstr "" +msgstr "Serifikat Myndigheter" #. Scheme name #. Pool name #: ../libpurple/certificate.c:1040 msgid "SSL Peers Cache" -msgstr "" +msgstr "SSL Peers Cache" #. Make messages #: ../libpurple/certificate.c:1171 -#, fuzzy, c-format +#, c-format msgid "Accept certificate for %s?" -msgstr "Aksepter samtaleinvitasjon?" +msgstr "Aksepter sertifikat for %s?" #. TODO: Find what the handle ought to be #: ../libpurple/certificate.c:1177 msgid "SSL Certificate Verification" -msgstr "" +msgstr "SSL Sertifikat Verifisering" #. Number of actions #: ../libpurple/certificate.c:1186 msgid "Accept" msgstr "Godta" -#: ../libpurple/certificate.c:1187 ../libpurple/protocols/qq/buddy_opt.c:214 +#: ../libpurple/certificate.c:1187 +#: ../libpurple/protocols/qq/buddy_opt.c:214 #: ../libpurple/protocols/qq/group_im.c:144 #: ../libpurple/protocols/qq/group_opt.c:127 #: ../libpurple/protocols/qq/sys_msg.c:90 #: ../libpurple/protocols/qq/sys_msg.c:246 -#, fuzzy msgid "Reject" -msgstr "Nullstill" +msgstr "Avslå" #: ../libpurple/certificate.c:1188 msgid "_View Certificate..." -msgstr "" +msgstr "_Se på sertfikat..." #. Prompt the user to authenticate the certificate #. TODO: Provide the user with more guidance about why he is @@ -2204,66 +2404,56 @@ #. vrq will be completed by user_auth #: ../libpurple/certificate.c:1288 #, c-format -msgid "" -"The certificate presented by \"%s\" claims to be from \"%s\" instead. This " -"could mean that you are not connecting to the service you believe you are." -msgstr "" +msgid "The certificate presented by \"%s\" claims to be from \"%s\" instead. This could mean that you are not connecting to the service you believe you are." +msgstr "Serifikatet presentert av \"%s\" hevder av være fra \"%s\" istedet. Dette kan bety at du ikke er tilkoblet til den tjenesten du tror du er." #. Prompt the user to authenticate the certificate #. vrq will be completed by user_auth #: ../libpurple/certificate.c:1313 #, c-format -msgid "" -"The certificate presented by \"%s\" is self-signed. It cannot be " -"automatically checked." -msgstr "" +msgid "The certificate presented by \"%s\" is self-signed. It cannot be automatically checked." +msgstr "Sertifikatet presentert av \"%s\" er sjøl signert. Det kan ikke bli automatisk sjekket." #: ../libpurple/certificate.c:1331 #, c-format msgid "The certificate chain presented for %s is not valid." -msgstr "" +msgstr "Sertifikat lenken presentert for %s gjelder ikke." #. TODO: Make this error either block the ensuing SSL #. connection error until the user dismisses this one, or #. stifle it. #. TODO: Probably wrong. #. TODO: Probably wrong -#: ../libpurple/certificate.c:1339 ../libpurple/certificate.c:1416 +#: ../libpurple/certificate.c:1339 +#: ../libpurple/certificate.c:1416 msgid "SSL Certificate Error" -msgstr "" +msgstr "SSL Sertifikat Feil" #: ../libpurple/certificate.c:1340 -#, fuzzy msgid "Invalid certificate chain" -msgstr "Ugyldig godkjennings mekanisme" +msgstr "Ugyldig sertifikat lenke" #. vrq will be completed by user_auth #: ../libpurple/certificate.c:1360 -msgid "" -"You have no database of root certificates, so this certificate cannot be " -"validated." -msgstr "" +msgid "You have no database of root certificates, so this certificate cannot be validated." +msgstr "Du har ingen database av root sertifikater, så dette sertifikatet kan ikke bli validisert." #. vrq will be completed by user_auth #: ../libpurple/certificate.c:1382 -msgid "" -"The root certificate this one claims to be issued by is unknown to Pidgin." -msgstr "" +msgid "The root certificate this one claims to be issued by is unknown to Pidgin." +msgstr "Root sertifikatet som denne hevder å bli utstedt av er ukjent for Pidgin." #: ../libpurple/certificate.c:1408 #, c-format -msgid "" -"The certificate chain presented by %s does not have a valid digital " -"signature from the Certificate Authority from which it claims to have a " -"signature." -msgstr "" +msgid "The certificate chain presented by %s does not have a valid digital signature from the Certificate Authority from which it claims to have a signature." +msgstr "Sertifikat lenken presentert av %s har ikke en gyldig digital signatur fra Sertifikat Myndigheten der den hevder å ha en signatur." #: ../libpurple/certificate.c:1417 msgid "Invalid certificate authority signature" -msgstr "" +msgstr "Ugyldig sertifikat myndighet signatur" #. Make messages -#: ../libpurple/certificate.c:1881 +#: ../libpurple/certificate.c:1882 #, c-format msgid "" "Common name: %s\n" @@ -2273,56 +2463,60 @@ "Activation date: %s\n" "Expiration date: %s\n" msgstr "" +"Vanlig navn: %s\n" +"\n" +"Fingeravtrykk (SHA1): %s\n" +"\n" +"Aktiviserings dato: %s\n" +"Går ut dato: %s\n" #. TODO: Find what the handle ought to be -#: ../libpurple/certificate.c:1890 -#, fuzzy +#: ../libpurple/certificate.c:1891 msgid "Certificate Information" -msgstr "Profilinformasjon" - -# +msgstr "Sertifikatinformasjon" + #: ../libpurple/connection.c:107 msgid "Registration Error" msgstr "Registreringsfeil" -# #: ../libpurple/connection.c:180 -#, fuzzy msgid "Unregistration Error" -msgstr "Registreringsfeil" +msgstr "Avregistreringsfeil" #: ../libpurple/connection.c:350 -#, fuzzy, c-format +#, c-format msgid "+++ %s signed on" -msgstr "%s har logget på" +msgstr "+++ %s logget på" #: ../libpurple/connection.c:380 -#, fuzzy, c-format +#, c-format msgid "+++ %s signed off" -msgstr "%s logget av" - -#: ../libpurple/connection.c:497 ../libpurple/plugin.c:282 -#: ../libpurple/protocols/jabber/buddy.c:2337 +msgstr "+++ %s logget av" + +#: ../libpurple/connection.c:497 +#: ../libpurple/plugin.c:282 +#: ../libpurple/protocols/jabber/buddy.c:2340 #: ../libpurple/protocols/msn/servconn.c:141 -#: ../libpurple/protocols/msn/session.c:322 +#: ../libpurple/protocols/msn/session.c:361 msgid "Unknown error" msgstr "Ukjent feil" #: ../libpurple/conversation.c:170 -#, fuzzy msgid "Unable to send message: The message is too large." -msgstr "Kunne ikke sende beskjed. Beskjeden er for stor." - -#: ../libpurple/conversation.c:173 ../libpurple/conversation.c:186 -#, fuzzy, c-format +msgstr "Kunne ikke sende beskjed: Beskjeden er for stor." + +#: ../libpurple/conversation.c:173 +#: ../libpurple/conversation.c:186 +#, c-format msgid "Unable to send message to %s." -msgstr "Kunne ikke sende beskjed til %s." +msgstr "Klarte ikke å sende beskjed til %s." #: ../libpurple/conversation.c:174 msgid "The message is too large." -msgstr "Meldingen er for stor." - -#: ../libpurple/conversation.c:183 ../libpurple/protocols/bonjour/jabber.c:255 +msgstr "Beskjeden er for stor." + +#: ../libpurple/conversation.c:183 +#: ../libpurple/protocols/bonjour/jabber.c:255 #: ../libpurple/protocols/bonjour/jabber.c:298 msgid "Unable to send message." msgstr "Kunne ikke sende beskjed." @@ -2332,9 +2526,8 @@ msgstr "Send beskjed" #: ../libpurple/conversation.c:1214 -#, fuzzy msgid "_Send Message" -msgstr "Send beskjed" +msgstr "_Send beskjed" #: ../libpurple/conversation.c:1620 #, c-format @@ -2349,7 +2542,7 @@ #: ../libpurple/conversation.c:1733 #, c-format msgid "You are now known as %s" -msgstr "Du heter nå %s." +msgstr "Du heter nå %s" #: ../libpurple/conversation.c:1753 #, c-format @@ -2367,77 +2560,75 @@ msgstr "%s forlot rommet (%s)." #: ../libpurple/dbus-server.c:584 -#, fuzzy, c-format +#, c-format msgid "Failed to get connection: %s" -msgstr "Klarte ikke velge cmodes for %s" +msgstr "Feilet i å få tilkobling: %s" #: ../libpurple/dbus-server.c:596 -#, fuzzy, c-format +#, c-format msgid "Failed to get name: %s" -msgstr "Klarte ikke å lagre bilde: %s\n" +msgstr "Feilet i å få navn: %s" #: ../libpurple/dbus-server.c:610 -#, fuzzy, c-format +#, c-format msgid "Failed to get serv name: %s" -msgstr "Klarte ikke å lagre bilde: %s\n" +msgstr "Feilet i å få serv navn: %s" #: ../libpurple/dbus-server.h:85 msgid "Purple's D-BUS server is not running for the reason listed below" -msgstr "" - -#: ../libpurple/desktopitem.c:287 ../libpurple/desktopitem.c:878 -#, fuzzy +msgstr "Purple's D-BUS server går ikke pga det som er nevnt nedenfor" + +#: ../libpurple/desktopitem.c:287 +#: ../libpurple/desktopitem.c:878 msgid "No name" -msgstr "Etternavn:" +msgstr "Ingen navn" #: ../libpurple/dnsquery.c:511 -#, fuzzy msgid "Unable to create new resolver process\n" -msgstr "Kunne ikke opprette socket" +msgstr "Kunne ikke opprette socket\n" #: ../libpurple/dnsquery.c:516 -#, fuzzy msgid "Unable to send request to resolver process\n" -msgstr "Kunne ikke sende beskjed til %s." - -#: ../libpurple/dnsquery.c:549 ../libpurple/dnsquery.c:697 -#, fuzzy, c-format +msgstr "Kunne ikke sende beskjed til %s\n" + +#: ../libpurple/dnsquery.c:549 +#: ../libpurple/dnsquery.c:697 +#, c-format msgid "" "Error resolving %s:\n" "%s" msgstr "" "Klarte ikke lese %s:\n" -"%s\n" - -#: ../libpurple/dnsquery.c:552 ../libpurple/dnsquery.c:711 +"%s" + +#: ../libpurple/dnsquery.c:552 +#: ../libpurple/dnsquery.c:711 #: ../libpurple/dnsquery.c:831 -#, fuzzy, c-format +#, c-format msgid "Error resolving %s: %d" -msgstr "" -"Klarte ikke lese %s:\n" -"%s\n" +msgstr "Klarte ikke lese %s: %d" #: ../libpurple/dnsquery.c:574 -#, fuzzy, c-format +#, c-format msgid "" "Error reading from resolver process:\n" "%s" -msgstr "Feil under lesing fra socket." +msgstr "" +"Feil under lesing fra socket:\n" +"%s" #: ../libpurple/dnsquery.c:578 -#, fuzzy, c-format msgid "EOF while reading from resolver process" -msgstr "Feil under lesing fra socket." +msgstr "Feil under lesing fra socket" #: ../libpurple/dnsquery.c:761 -#, fuzzy, c-format +#, c-format msgid "Thread creation failure: %s" -msgstr "Autentiseringsfeil" +msgstr "Autentiseringsfeil: %s" #: ../libpurple/dnsquery.c:762 -#, fuzzy msgid "Unknown reason" -msgstr "Ukjent grunn." +msgstr "Ukjent grunn" #: ../libpurple/ft.c:209 #, c-format @@ -2468,7 +2659,7 @@ #: ../libpurple/ft.c:253 msgid "Directory is not writable." -msgstr "" +msgstr "Katalogen er ikke skrivbar." #: ../libpurple/ft.c:268 msgid "Cannot send a file of 0 bytes." @@ -2481,9 +2672,7 @@ #: ../libpurple/ft.c:287 #, c-format msgid "%s is not a regular file. Cowardly refusing to overwrite it.\n" -msgstr "" -"%s er ikke en vanlig fil. Gaim nekter å overskrive den for å ikke risikere å " -"ødelegge noe.\n" +msgstr "%s er ikke en vanlig fil. Pidgin nekter å overskrive den for å ikke risikere å ødelegge noe.\n" #: ../libpurple/ft.c:347 #, c-format @@ -2493,7 +2682,7 @@ #: ../libpurple/ft.c:354 #, c-format msgid "%s wants to send you a file" -msgstr "%s ønsker å sende deg en fil." +msgstr "%s ønsker å sende deg en fil" #: ../libpurple/ft.c:397 #, c-format @@ -2512,9 +2701,9 @@ "Port: %d" #: ../libpurple/ft.c:436 -#, fuzzy, c-format +#, c-format msgid "%s is offering to send file %s" -msgstr "Tilbyr å sende %s til %s" +msgstr "%s tilbyr å sende filen %s" #: ../libpurple/ft.c:488 #, c-format @@ -2527,29 +2716,27 @@ msgstr "Tilbyr å sende %s til %s" #: ../libpurple/ft.c:521 -#, fuzzy, c-format +#, c-format msgid "Starting transfer of %s from %s" -msgstr "Aksepter forespørselen for filoverføring fra %s?" +msgstr "Starter overføring av %s fra %s" #: ../libpurple/ft.c:682 #, c-format msgid "Transfer of file %s complete" -msgstr "Overføring av filen %s er ferdig." +msgstr "Overføring av filen %s er ferdig" #: ../libpurple/ft.c:685 -#, c-format msgid "File transfer complete" msgstr "Filoverføring ferdig" #: ../libpurple/ft.c:1103 #, c-format msgid "You canceled the transfer of %s" -msgstr "Du avbrøt overføringen av %s." +msgstr "Du avbrøt overføringen av %s" #: ../libpurple/ft.c:1108 -#, c-format msgid "File transfer cancelled" -msgstr "Filoverføring avbrutt." +msgstr "Filoverføring avbrutt" #: ../libpurple/ft.c:1166 #, c-format @@ -2559,171 +2746,153 @@ #: ../libpurple/ft.c:1171 #, c-format msgid "%s canceled the file transfer" -msgstr "%s avbrøt filoverføringen." +msgstr "%s avbrøt filoverføringen" #: ../libpurple/ft.c:1228 -#, fuzzy, c-format +#, c-format msgid "File transfer to %s failed." -msgstr "Filoverføring til %s avbrutt.\n" +msgstr "Filoverføring til %s feilet." #: ../libpurple/ft.c:1230 -#, fuzzy, c-format +#, c-format msgid "File transfer from %s failed." -msgstr "Filoverføring fra %s avbrutt.\n" +msgstr "Filoverføring fra %s feilet." #: ../libpurple/gconf/purple.schemas.in.h:1 msgid "Run the command in a terminal" -msgstr "" +msgstr "Kjør kommandoen i en terminal" #: ../libpurple/gconf/purple.schemas.in.h:2 msgid "The command used to handle \"aim\" URLs, if enabled." -msgstr "" +msgstr "Kommando for å håndtere «aim»-URLer, hvis aktivert." #: ../libpurple/gconf/purple.schemas.in.h:3 msgid "The command used to handle \"gg\" URLs, if enabled." -msgstr "" +msgstr "Kommando for å håndtere «gg»-URLer, hvis aktivert." #: ../libpurple/gconf/purple.schemas.in.h:4 msgid "The command used to handle \"icq\" URLs, if enabled." -msgstr "" +msgstr "Kommando for å håndtere «icq»-URLer, hvis aktivert." #: ../libpurple/gconf/purple.schemas.in.h:5 msgid "The command used to handle \"irc\" URLs, if enabled." -msgstr "" +msgstr "Kommando for å håndtere «irc»-URLer, hvis aktivert." #: ../libpurple/gconf/purple.schemas.in.h:6 msgid "The command used to handle \"msnim\" URLs, if enabled." -msgstr "" +msgstr "Kommando for å håndtere «msnim»-URLer, hvis aktivert." #: ../libpurple/gconf/purple.schemas.in.h:7 msgid "The command used to handle \"sip\" URLs, if enabled." -msgstr "" +msgstr "Kommando for å håndtere «sip»-URLer, hvis aktivert." #: ../libpurple/gconf/purple.schemas.in.h:8 msgid "The command used to handle \"xmpp\" URLs, if enabled." -msgstr "" +msgstr "Kommando for å håndtere «xmpp»-URLer, hvis aktivert." #: ../libpurple/gconf/purple.schemas.in.h:9 msgid "The command used to handle \"ymsgr\" URLs, if enabled." -msgstr "" +msgstr "Kommando for å håndtere «ymsgr»-URLer, hvis aktivert." #: ../libpurple/gconf/purple.schemas.in.h:10 msgid "The handler for \"aim\" URLs" -msgstr "" +msgstr "Håndtereren for «aim»-URLer" #: ../libpurple/gconf/purple.schemas.in.h:11 msgid "The handler for \"gg\" URLs" -msgstr "" +msgstr "Håndtereren for «gg»-URLer" #: ../libpurple/gconf/purple.schemas.in.h:12 msgid "The handler for \"icq\" URLs" -msgstr "" +msgstr "Håndtereren for «icq»-URLer" #: ../libpurple/gconf/purple.schemas.in.h:13 msgid "The handler for \"irc\" URLs" -msgstr "" +msgstr "Håndtereren for «irc»-URLer" #: ../libpurple/gconf/purple.schemas.in.h:14 msgid "The handler for \"msnim\" URLs" -msgstr "" +msgstr "Håndtereren for «msnim»-URLer" #: ../libpurple/gconf/purple.schemas.in.h:15 msgid "The handler for \"sip\" URLs" -msgstr "" +msgstr "Håndtereren for «sip»-URLer" #: ../libpurple/gconf/purple.schemas.in.h:16 msgid "The handler for \"xmpp\" URLs" -msgstr "" +msgstr "Håndtereren for «xmpp»-URLer" #: ../libpurple/gconf/purple.schemas.in.h:17 msgid "The handler for \"ymsgr\" URLs" -msgstr "" +msgstr "Håndtereren for «ymsgr»-URLer" #: ../libpurple/gconf/purple.schemas.in.h:18 -msgid "" -"True if the command specified in the \"command\" key should handle \"aim\" " -"URLs." -msgstr "" +msgid "True if the command specified in the \"command\" key should handle \"aim\" URLs." +msgstr "Sann hvis kommandoen spesifisert i «kommando»-nøkkelen skal håndtere «aim»-URLer." #: ../libpurple/gconf/purple.schemas.in.h:19 -msgid "" -"True if the command specified in the \"command\" key should handle \"gg\" " -"URLs." -msgstr "" +msgid "True if the command specified in the \"command\" key should handle \"gg\" URLs." +msgstr "Sann hvis kommandoen spesifisert i «kommando»-nøkkelen skal håndtere «gg»-URLer." #: ../libpurple/gconf/purple.schemas.in.h:20 -msgid "" -"True if the command specified in the \"command\" key should handle \"icq\" " -"URLs." -msgstr "" +msgid "True if the command specified in the \"command\" key should handle \"icq\" URLs." +msgstr "Sann hvis kommandoen spesifisert i «kommando»-nøkkelen skal håndtere «icq»-URLer." #: ../libpurple/gconf/purple.schemas.in.h:21 -msgid "" -"True if the command specified in the \"command\" key should handle \"irc\" " -"URLs." -msgstr "" +msgid "True if the command specified in the \"command\" key should handle \"irc\" URLs." +msgstr "Sann hvis kommandoen spesifisert i «kommando»-nøkkelen skal håndtere «irc»-URLer." #: ../libpurple/gconf/purple.schemas.in.h:22 -msgid "" -"True if the command specified in the \"command\" key should handle \"msnim\" " -"URLs." -msgstr "" +msgid "True if the command specified in the \"command\" key should handle \"msnim\" URLs." +msgstr "Sann hvis kommandoen spesifisert i «kommando»-nøkkelen skal håndtere «msnim»-URLer." #: ../libpurple/gconf/purple.schemas.in.h:23 -msgid "" -"True if the command specified in the \"command\" key should handle \"sip\" " -"URLs." -msgstr "" +msgid "True if the command specified in the \"command\" key should handle \"sip\" URLs." +msgstr "Sann hvis kommandoen spesifisert i «kommando»-nøkkelen skal håndtere «sip»-URLer." #: ../libpurple/gconf/purple.schemas.in.h:24 -msgid "" -"True if the command specified in the \"command\" key should handle \"xmpp\" " -"URLs." -msgstr "" +msgid "True if the command specified in the \"command\" key should handle \"xmpp\" URLs." +msgstr "Sann hvis kommandoen spesifisert i «kommando»-nøkkelen skal håndtere «xmpp»-URLer." #: ../libpurple/gconf/purple.schemas.in.h:25 -msgid "" -"True if the command specified in the \"command\" key should handle \"ymsgr\" " -"URLs." -msgstr "" +msgid "True if the command specified in the \"command\" key should handle \"ymsgr\" URLs." +msgstr "Sann hvis kommandoen spesifisert i «kommando»-nøkkelen skal håndtere «ymsgr»-URLer." #: ../libpurple/gconf/purple.schemas.in.h:26 -msgid "" -"True if the command used to handle this type of URL should be run in a " -"terminal." -msgstr "" +msgid "True if the command used to handle this type of URL should be run in a terminal." +msgstr "Sann hvis kommandoen som skal håndtere denne type URLer skal kjøres i en terminal." #: ../libpurple/gconf/purple.schemas.in.h:27 msgid "Whether the specified command should handle \"aim\" URLs" -msgstr "" +msgstr "Om den spesifike kommandoen skal håndtere «aim»-URLer" #: ../libpurple/gconf/purple.schemas.in.h:28 msgid "Whether the specified command should handle \"gg\" URLs" -msgstr "" +msgstr "Om den spesifike kommandoen skal håndtere «gg»-URLer" #: ../libpurple/gconf/purple.schemas.in.h:29 msgid "Whether the specified command should handle \"icq\" URLs" -msgstr "" +msgstr "Om den spesifike kommandoen skal håndtere «icq»-URLer" #: ../libpurple/gconf/purple.schemas.in.h:30 msgid "Whether the specified command should handle \"irc\" URLs" -msgstr "" +msgstr "Om den spesifike kommandoen skal håndtere «irc»-URLer" #: ../libpurple/gconf/purple.schemas.in.h:31 msgid "Whether the specified command should handle \"msnim\" URLs" -msgstr "" +msgstr "Om den spesifike kommandoen skal håndtere «msnim»-URLer" #: ../libpurple/gconf/purple.schemas.in.h:32 msgid "Whether the specified command should handle \"sip\" URLs" -msgstr "" +msgstr "Om den spesifike kommandoen skal håndtere «sip»-URLer" #: ../libpurple/gconf/purple.schemas.in.h:33 msgid "Whether the specified command should handle \"xmpp\" URLs" -msgstr "" +msgstr "Om den spesifike kommandoen skal håndtere «xmpp»-URLer" #: ../libpurple/gconf/purple.schemas.in.h:34 msgid "Whether the specified command should handle \"ymsgr\" URLs" -msgstr "" +msgstr "Om den spesifike kommandoen skal håndtere «ymsgr»-URLer" #: ../libpurple/log.c:183 msgid "The logger has no read function" @@ -2739,7 +2908,7 @@ #: ../libpurple/log.c:626 msgid "Old flat format" -msgstr "" +msgstr "Gammelt flatt format" #: ../libpurple/log.c:839 msgid "Logging of this conversation failed." @@ -2751,27 +2920,21 @@ #: ../libpurple/log.c:1366 #, c-format -msgid "" -"(%s) %s <AUTO-" -"REPLY>: %s
\n" -msgstr "" -"(%s) %s <" -"STANDARDSVAR>: %s
\n" +msgid "(%s) %s <AUTO-REPLY>: %s
\n" +msgstr "(%s) %s <STANDARDSVAR>: %s
\n" #: ../libpurple/log.c:1368 #, c-format -msgid "" -"(%s) %s <AUTO-" -"REPLY>: %s
\n" -msgstr "" -"(%s) %s <" -"STANDARDSVAR>: %s
\n" - -#: ../libpurple/log.c:1426 ../libpurple/log.c:1559 +msgid "(%s) %s <AUTO-REPLY>: %s
\n" +msgstr "(%s) %s <STANDARDSVAR>: %s
\n" + +#: ../libpurple/log.c:1426 +#: ../libpurple/log.c:1559 msgid "Unable to find log path!" msgstr "Kunne ikke finne banen til loggen!" -#: ../libpurple/log.c:1438 ../libpurple/log.c:1568 +#: ../libpurple/log.c:1438 +#: ../libpurple/log.c:1568 #, c-format msgid "Could not read file: %s" msgstr "Kunne ikke lese fil: %s" @@ -2779,45 +2942,39 @@ #: ../libpurple/log.c:1500 #, c-format msgid "(%s) %s : %s\n" -msgstr "" +msgstr "(%s) %s : %s\n" #: ../libpurple/plugin.c:365 #, c-format msgid "You are using %s, but this plugin requires %s." -msgstr "" +msgstr "Du bruker %s, men dette tillegget krever %s." #: ../libpurple/plugin.c:380 -#, c-format msgid "This plugin has not defined an ID." -msgstr "" +msgstr "Dette tillegget har ikke definert en ID." #: ../libpurple/plugin.c:448 #, c-format msgid "Plugin magic mismatch %d (need %d)" -msgstr "" +msgstr "Tillegg magic mismatch %d (trenger %d)" #: ../libpurple/plugin.c:465 #, c-format msgid "ABI version mismatch %d.%d.x (need %d.%d.x)" -msgstr "" +msgstr "ABI versjon mismatch %d.%d.x (trenger %d.%d.x)" #: ../libpurple/plugin.c:482 msgid "Plugin does not implement all required functions" -msgstr "" +msgstr "Tillegget implenterer ikke alle funksjoner som kreves" #: ../libpurple/plugin.c:547 #, c-format -msgid "" -"The required plugin %s was not found. Please install this plugin and try " -"again." -msgstr "" -"Det nødvendige tillegget %s ble ikke funnet. Installer dette tillegget og " -"prøv igjen." +msgid "The required plugin %s was not found. Please install this plugin and try again." +msgstr "Det nødvendige tillegget %s ble ikke funnet. Installer dette tillegget og prøv igjen." #: ../libpurple/plugin.c:552 -#, fuzzy msgid "Unable to load the plugin" -msgstr "Gaim klarte ikke å laste tillegget." +msgstr "Klarte ikke å laste tillegget" #: ../libpurple/plugin.c:574 #, c-format @@ -2825,84 +2982,81 @@ msgstr "Det nødvendige tillegget %s kunne ikke lastes." #: ../libpurple/plugin.c:578 -#, fuzzy msgid "Unable to load your plugin." -msgstr "Gaim klarte ikke å laste tillegget." +msgstr "Kunne ikke laste tillegget ditt." #: ../libpurple/plugin.c:677 -#, fuzzy, c-format +#, c-format msgid "The dependent plugin %s failed to unload." msgstr "Det nødvendige tillegget %s kunne ikke lastes." #: ../libpurple/plugin.c:681 -#, fuzzy msgid "There were errors unloading the plugin." -msgstr "Lar deg laste perl-tillegg." +msgstr "Det oppsto feil i lossing av tillegget." #: ../libpurple/plugins/autoaccept.c:23 -#, fuzzy msgid "Autoaccept" -msgstr "Godta" - -#: ../libpurple/plugins/autoaccept.c:25 ../libpurple/plugins/autoaccept.c:26 -#, fuzzy +msgstr "Autoaksepter" + +#: ../libpurple/plugins/autoaccept.c:25 +#: ../libpurple/plugins/autoaccept.c:26 msgid "Auto-accept file transfer requests from selected users." -msgstr "Aksepter forespørselen for filoverføring fra %s?" +msgstr "Aksepter forespørselen for filoverføring fra valgte brukere." #: ../libpurple/plugins/autoaccept.c:80 -#, fuzzy, c-format +#, c-format msgid "Autoaccepted file transfer of \"%s\" from \"%s\" completed." -msgstr "Aksepter forespørselen for filoverføring fra %s?" +msgstr "Autoakseptert filoverføring av \"%s\" fra \"%s\" ferdig." #: ../libpurple/plugins/autoaccept.c:82 msgid "Autoaccept complete" -msgstr "" +msgstr "Autogodta ferdig" #: ../libpurple/plugins/autoaccept.c:160 -#, fuzzy, c-format +#, c-format msgid "When a file-transfer request arrives from %s" -msgstr "Aksepter forespørselen for filoverføring fra %s?" +msgstr "Når en filoverføring forespørsel kommer fra %s" #: ../libpurple/plugins/autoaccept.c:162 -#, fuzzy msgid "Set Autoaccept Setting" -msgstr "Skjulte Innstillinger" +msgstr "Sett Autoaksepter Innstillinger" #: ../libpurple/plugins/autoaccept.c:164 msgid "_Save" -msgstr "Lagre" - -#: ../libpurple/plugins/autoaccept.c:165 ../libpurple/plugins/idle.c:170 -#: ../libpurple/plugins/idle.c:204 ../libpurple/plugins/idle.c:230 +msgstr "_Lagre" + +#: ../libpurple/plugins/autoaccept.c:165 +#: ../libpurple/plugins/idle.c:170 +#: ../libpurple/plugins/idle.c:204 +#: ../libpurple/plugins/idle.c:230 #: ../libpurple/protocols/oscar/oscar.c:1453 -#: ../libpurple/protocols/oscar/oscar.c:2233 -#: ../libpurple/protocols/oscar/oscar.c:2282 -#: ../libpurple/protocols/oscar/oscar.c:5886 -#: ../libpurple/protocols/oscar/oscar.c:5941 -#: ../libpurple/protocols/oscar/oscar.c:6167 -#: ../libpurple/protocols/oscar/oscar.c:6237 ../libpurple/request.h:1388 +#: ../libpurple/protocols/oscar/oscar.c:2229 +#: ../libpurple/protocols/oscar/oscar.c:2278 +#: ../libpurple/protocols/oscar/oscar.c:5884 +#: ../libpurple/protocols/oscar/oscar.c:5939 +#: ../libpurple/protocols/oscar/oscar.c:6165 +#: ../libpurple/protocols/oscar/oscar.c:6235 +#: ../libpurple/request.h:1388 #: ../libpurple/request.h:1398 +#: ../pidgin/gtkblist.c:527 msgid "_Cancel" msgstr "_Avbryt" #: ../libpurple/plugins/autoaccept.c:168 msgid "Ask" -msgstr "" +msgstr "Spør" #: ../libpurple/plugins/autoaccept.c:169 -#, fuzzy msgid "Auto Accept" -msgstr "Godta" +msgstr "Auto Godta" #: ../libpurple/plugins/autoaccept.c:170 -#, fuzzy msgid "Auto Reject" -msgstr "Automatisk tilkobling ved brudd" +msgstr "Auto Avslå" #: ../libpurple/plugins/autoaccept.c:185 -#, fuzzy msgid "Autoaccept File Transfers..." -msgstr "Filoverføringer" +msgstr "Autoaksepter Filoverføringer..." #. XXX: Is there a better way than this? There really should be. #: ../libpurple/plugins/autoaccept.c:215 @@ -2910,9 +3064,10 @@ "Path to save the files in\n" "(Please provide the full path)" msgstr "" +"Bane for å lagre filene i\n" +"(Vennligst gi fullt banenavn)" #: ../libpurple/plugins/autoaccept.c:220 -#, fuzzy msgid "Automatically reject from users not in buddy list" msgstr "Tillat bare brukere fra kontaktlisten min" @@ -2921,20 +3076,22 @@ "Notify with a popup when an autoaccepted file transfer is complete\n" "(only when there's no conversation with the sender)" msgstr "" - -#: ../libpurple/plugins/buddynote.c:46 ../libpurple/protocols/msn/msn.c:1660 -#: ../libpurple/protocols/msn/msn.c:1690 -#, fuzzy +"Gi beskjed med en sprettopp når en autogodta filoverføring er ferdig\n" +"(kun når det ikke er en samtale med senderen)" + +#: ../libpurple/plugins/buddynote.c:46 +#: ../libpurple/protocols/msn/msn.c:1770 +#: ../libpurple/protocols/msn/msn.c:1800 msgid "Notes" -msgstr "Merknad" +msgstr "Merknader" #: ../libpurple/plugins/buddynote.c:47 msgid "Enter your notes below..." -msgstr "" +msgstr "Skriv inn merknadene dine under..." #: ../libpurple/plugins/buddynote.c:65 msgid "Edit Notes..." -msgstr "" +msgstr "Rediger merknader..." #. *< major version #. *< minor version @@ -2944,22 +3101,23 @@ #. *< dependencies #. *< priority #. *< id -#: ../libpurple/plugins/buddynote.c:90 ../pidgin/plugins/gtkbuddynote.c:74 -#, fuzzy +#: ../libpurple/plugins/buddynote.c:90 +#: ../pidgin/plugins/gtkbuddynote.c:74 msgid "Buddy Notes" -msgstr "Kontakter" +msgstr "Kontaktmerknader" #. *< name #. *< version -#: ../libpurple/plugins/buddynote.c:92 ../pidgin/plugins/gtkbuddynote.c:76 +#: ../libpurple/plugins/buddynote.c:92 +#: ../pidgin/plugins/gtkbuddynote.c:76 msgid "Store notes on particular buddies." -msgstr "" +msgstr "Lagre notater på en spesifikk kompis." #. *< summary -#: ../libpurple/plugins/buddynote.c:93 ../pidgin/plugins/gtkbuddynote.c:77 -#, fuzzy +#: ../libpurple/plugins/buddynote.c:93 +#: ../pidgin/plugins/gtkbuddynote.c:77 msgid "Adds the option to store notes for buddies on your buddy list." -msgstr "Legg til brukeren i kontaktlisten din" +msgstr "Legger til muligheten for å lagre notater for kompiser i kompislisten din." #. *< type #. *< ui_requirement @@ -2969,15 +3127,16 @@ #. *< id #: ../libpurple/plugins/ciphertest.c:264 msgid "Cipher Test" -msgstr "" +msgstr "Cipher Test" #. *< name #. *< version #. * summary #. * description -#: ../libpurple/plugins/ciphertest.c:267 ../libpurple/plugins/ciphertest.c:269 +#: ../libpurple/plugins/ciphertest.c:267 +#: ../libpurple/plugins/ciphertest.c:269 msgid "Tests the ciphers that ship with libpurple." -msgstr "" +msgstr "Test sifrene som sendes med libpurple." #. *< type #. *< ui_requirement @@ -2987,7 +3146,7 @@ #. *< id #: ../libpurple/plugins/dbus-example.c:155 msgid "DBus Example" -msgstr "" +msgstr "DBus-eksempel" #. *< name #. *< version @@ -2996,7 +3155,7 @@ #: ../libpurple/plugins/dbus-example.c:158 #: ../libpurple/plugins/dbus-example.c:160 msgid "DBus Plugin Example" -msgstr "" +msgstr "DBus Tillegg Eksempel" #. *< type #. *< ui_requirement @@ -3005,67 +3164,68 @@ #. *< priority #. *< id #: ../libpurple/plugins/filectl.c:248 -#, fuzzy msgid "File Control" -msgstr "Styre Gaim fra kontrollfil" +msgstr "Filkontroll" #. *< name #. *< version #. * summary #. * description -#: ../libpurple/plugins/filectl.c:251 ../libpurple/plugins/filectl.c:253 -#, fuzzy +#: ../libpurple/plugins/filectl.c:251 +#: ../libpurple/plugins/filectl.c:253 msgid "Allows control by entering commands in a file." -msgstr "Lar deg kontrollere Gaim ved å skrive inn kommandoer i en fil." - -#: ../libpurple/plugins/idle.c:158 ../libpurple/plugins/idle.c:218 +msgstr "Lar deg kontrollere Pidgin ved å skrive inn kommandoer i en fil." + +#: ../libpurple/plugins/idle.c:158 +#: ../libpurple/plugins/idle.c:218 msgid "Minutes" msgstr "Minutter" #. This is a cultural reference. Dy'er Mak'er is a song by Led Zeppelin. #. If that doesn't translate well into your language, drop the 's before translating. -#: ../libpurple/plugins/idle.c:165 ../libpurple/plugins/idle.c:199 -#: ../libpurple/plugins/idle.c:225 ../libpurple/plugins/idle.c:318 +#: ../libpurple/plugins/idle.c:165 +#: ../libpurple/plugins/idle.c:199 +#: ../libpurple/plugins/idle.c:225 +#: ../libpurple/plugins/idle.c:318 msgid "I'dle Mak'er" msgstr "I'dle Mak'er" -#: ../libpurple/plugins/idle.c:166 ../libpurple/plugins/idle.c:258 -#, fuzzy +#: ../libpurple/plugins/idle.c:166 +#: ../libpurple/plugins/idle.c:258 msgid "Set Account Idle Time" msgstr "Sett fraværstid for konto" -#: ../libpurple/plugins/idle.c:169 ../libpurple/plugins/idle.c:229 +#: ../libpurple/plugins/idle.c:169 +#: ../libpurple/plugins/idle.c:229 msgid "_Set" msgstr "_Sett" #: ../libpurple/plugins/idle.c:184 msgid "None of your accounts are idle." -msgstr "" - -#: ../libpurple/plugins/idle.c:200 ../libpurple/plugins/idle.c:262 -#, fuzzy +msgstr "Ingen av kontoene dine er inaktive." + +#: ../libpurple/plugins/idle.c:200 +#: ../libpurple/plugins/idle.c:262 msgid "Unset Account Idle Time" msgstr "Sett fraværstid for konto" #: ../libpurple/plugins/idle.c:203 -#, fuzzy msgid "_Unset" -msgstr "Bruk" - -#: ../libpurple/plugins/idle.c:226 ../libpurple/plugins/idle.c:266 -#, fuzzy +msgstr "_Frigi" + +#: ../libpurple/plugins/idle.c:226 +#: ../libpurple/plugins/idle.c:266 msgid "Set Idle Time for All Accounts" -msgstr "Frigi Borte-tid For Alle Idle Kontoer" +msgstr "Sett Borte-tid For Alle Kontoer" #: ../libpurple/plugins/idle.c:271 -#, fuzzy msgid "Unset Idle Time for All Idled Accounts" msgstr "Frigi Borte-tid For Alle Idle Kontoer" -#: ../libpurple/plugins/idle.c:320 ../libpurple/plugins/idle.c:321 -#, fuzzy +#: ../libpurple/plugins/idle.c:320 +#: ../libpurple/plugins/idle.c:321 msgid "Allows you to hand-configure how long you've been idle" -msgstr "Lar deg manuelt sette hvor lenge du har vært borte." +msgstr "Lar deg manuelt sette hvor lenge du har vært borte" #. *< type #. *< ui_requirement @@ -3086,12 +3246,8 @@ #. * description #: ../libpurple/plugins/ipc-test-client.c:92 -msgid "" -"Test plugin IPC support, as a client. This locates the server plugin and " -"calls the commands registered." -msgstr "" -"Test IPC-støtte for tillegg (som klient). Dette finner tjenertillegget og " -"kaller de registrerte kommandoene." +msgid "Test plugin IPC support, as a client. This locates the server plugin and calls the commands registered." +msgstr "Test IPC-støtte for tillegg (som klient). Dette finner tjenertillegget og kaller de registrerte kommandoene." # #. *< type @@ -3114,21 +3270,19 @@ #. * description #: ../libpurple/plugins/ipc-test-server.c:79 msgid "Test plugin IPC support, as a server. This registers the IPC commands." -msgstr "" -"Test IPC-støtte for tillegg (som tjener). Dette registrerer IPC-kommandoene." +msgstr "Test IPC-støtte for tillegg (som tjener). Dette registrerer IPC-kommandoene." #: ../libpurple/plugins/joinpart.c:229 -#, fuzzy msgid "Join/Part Hiding Configuration" -msgstr "Innstillinger for Evolution-integrasjon" +msgstr "Konfigurasjon for Join/Part Skjuling" #: ../libpurple/plugins/joinpart.c:233 msgid "Minimum Room Size" -msgstr "" +msgstr "Minimums Rom Størrelse" #: ../libpurple/plugins/joinpart.c:239 msgid "User Inactivity Timeout (in minutes)" -msgstr "" +msgstr "Brukers Inaktivitets Timeout (i minutter)" #. *< type #. *< ui_requirement @@ -3138,21 +3292,19 @@ #. *< id #: ../libpurple/plugins/joinpart.c:270 msgid "Join/Part Hiding" -msgstr "" +msgstr "Join/Part Skjuling" #. *< name #. *< version #. * summary #: ../libpurple/plugins/joinpart.c:273 msgid "Hides extraneous join/part messages." -msgstr "" +msgstr "Skjul fremmede join/part beskjeder." #. * description #: ../libpurple/plugins/joinpart.c:275 -msgid "" -"This plugin hides join/part messages in large rooms, except for those users " -"actively taking part in a conversation." -msgstr "" +msgid "This plugin hides join/part messages in large rooms, except for those users actively taking part in a conversation." +msgstr "Denne plugin skjuler join/part beskjeder i store rom, untatt for de brukerne som aktivt deltar i en samtale." #. This is used in the place of a timezone abbreviation if the #. * offset is way off. The user should never really see it, but @@ -3160,48 +3312,42 @@ #. * not a real timezone. #: ../libpurple/plugins/log_reader.c:493 msgid "(UTC)" -msgstr "" +msgstr "(UTC)" #: ../libpurple/plugins/log_reader.c:1577 -#, fuzzy msgid "User is offline." -msgstr "Brukeren er avlogget" +msgstr "Brukeren er avlogget." #: ../libpurple/plugins/log_reader.c:1583 -#, fuzzy msgid "Auto-response sent:" -msgstr "Automatisk tilkobling ved brudd" +msgstr "Auto-respons sendt:" #: ../libpurple/plugins/log_reader.c:1593 #: ../libpurple/plugins/log_reader.c:1596 #: ../libpurple/plugins/statenotify.c:80 -#, fuzzy, c-format +#, c-format msgid "%s has signed off." -msgstr "%s har logget av (%s)" +msgstr "%s har logget av." #: ../libpurple/plugins/log_reader.c:1610 msgid "One or more messages may have been undeliverable." -msgstr "" +msgstr "En eller flere beskjeder kunne ikke bli levert." #: ../libpurple/plugins/log_reader.c:1620 msgid "You were disconnected from the server." msgstr "Du har blitt koblet fra tjeneren." #: ../libpurple/plugins/log_reader.c:1628 -msgid "" -"You are currently disconnected. Messages will not be received unless you are " -"logged in." -msgstr "" +msgid "You are currently disconnected. Messages will not be received unless you are logged in." +msgstr "Du er for tiden avlogget. Beskjeder vil ikke bli mottatt uten at du er innlogget." #: ../libpurple/plugins/log_reader.c:1643 -#, fuzzy msgid "Message could not be sent because the maximum length was exceeded." -msgstr "Meldingen kunne ikke bli sendt, brukeren er frakoblet:" +msgstr "Meldingen kunne ikke bli sendt fordi max lengde ble overskredet." #: ../libpurple/plugins/log_reader.c:1648 -#, fuzzy msgid "Message could not be sent." -msgstr "Din Yahoo!-beskjed ble ikke sendt." +msgstr "Beskjeden kunne ikke bli sendt." #. The names of IM clients are marked for translation at the request of #. translators who wanted to transliterate them. Many translators @@ -3209,25 +3355,23 @@ #: ../libpurple/plugins/log_reader.c:2349 #: ../libpurple/plugins/log_reader.c:2472 msgid "Adium" -msgstr "" +msgstr "Adium" #. The names of IM clients are marked for translation at the request of #. translators who wanted to transliterate them. Many translators #. choose to leave them alone. Choose what's best for your language. #: ../libpurple/plugins/log_reader.c:2362 #: ../libpurple/plugins/log_reader.c:2477 -#, fuzzy msgid "Fire" -msgstr "Firefox" +msgstr "Fire" #. The names of IM clients are marked for translation at the request of #. translators who wanted to transliterate them. Many translators #. choose to leave them alone. Choose what's best for your language. #: ../libpurple/plugins/log_reader.c:2374 #: ../libpurple/plugins/log_reader.c:2481 -#, fuzzy msgid "Messenger Plus!" -msgstr "Melding fra %s" +msgstr "Messenger Plus!" #. The names of IM clients are marked for translation at the request of #. translators who wanted to transliterate them. Many translators @@ -3235,16 +3379,15 @@ #: ../libpurple/plugins/log_reader.c:2388 #: ../libpurple/plugins/log_reader.c:2486 msgid "QIP" -msgstr "" +msgstr "QIP" #. The names of IM clients are marked for translation at the request of #. translators who wanted to transliterate them. Many translators #. choose to leave them alone. Choose what's best for your language. #: ../libpurple/plugins/log_reader.c:2400 #: ../libpurple/plugins/log_reader.c:2490 -#, fuzzy msgid "MSN Messenger" -msgstr "Lynmeldingsklient" +msgstr "MSN Messenger" #. The names of IM clients are marked for translation at the request of #. translators who wanted to transliterate them. Many translators @@ -3252,28 +3395,27 @@ #: ../libpurple/plugins/log_reader.c:2412 #: ../libpurple/plugins/log_reader.c:2494 msgid "Trillian" -msgstr "" +msgstr "Trillian" #. Add general preferences. #: ../libpurple/plugins/log_reader.c:2454 -#, fuzzy msgid "General Log Reading Configuration" -msgstr "Innstillinger for trayikon" +msgstr "Generelle Instillinger for Logg Lesing" #: ../libpurple/plugins/log_reader.c:2458 msgid "Fast size calculations" -msgstr "" +msgstr "Kjapp størrelse kalkulasjon" #: ../libpurple/plugins/log_reader.c:2462 +#, fuzzy msgid "Use name heuristics" -msgstr "" +msgstr "Bruk navn heuristics" # #. Add Log Directory preferences. #: ../libpurple/plugins/log_reader.c:2468 -#, fuzzy msgid "Log Directory" -msgstr "_Søk etter:" +msgstr "Logg Katalog" #. *< type #. *< ui_requirement @@ -3282,7 +3424,6 @@ #. *< priority #. *< id #: ../libpurple/plugins/log_reader.c:2523 -#, fuzzy msgid "Log Reader" msgstr "Log Viser" @@ -3291,28 +3432,28 @@ #. * summary #: ../libpurple/plugins/log_reader.c:2527 msgid "Includes other IM clients' logs in the log viewer." -msgstr "" +msgstr "Inkluderer andre lynmeldingsklienters logger i logg-viseren." #. * description #: ../libpurple/plugins/log_reader.c:2531 msgid "" -"When viewing logs, this plugin will include logs from other IM clients. " -"Currently, this includes Adium, MSN Messenger, and Trillian.\n" -"\n" -"WARNING: This plugin is still alpha code and may crash frequently. Use it " -"at your own risk!" -msgstr "" +"When viewing logs, this plugin will include logs from other IM clients. Currently, this includes Adium, MSN Messenger, and Trillian.\n" +"\n" +"WARNING: This plugin is still alpha code and may crash frequently. Use it at your own risk!" +msgstr "" +"Når man ser på logger, vil dette tillegget inkludere logger fra andre lynmeldingsklienter. For tiden inkluderer dette Adium, MSN Messenger og Trillian.\n" +"\n" +"ADVARSEL: Dette tillegget er enda alpha kode og kan krasje ofte. Bruk den på egen risiko!" # #: ../libpurple/plugins/mono/loader/mono.c:217 -#, fuzzy msgid "Mono Plugin Loader" -msgstr "Tcl-tilleggslaster" +msgstr "Mono tilleggslaster" #: ../libpurple/plugins/mono/loader/mono.c:219 #: ../libpurple/plugins/mono/loader/mono.c:220 msgid "Loads .NET plugins with Mono." -msgstr "" +msgstr "Laster .NET tillegg med Mono." #. *< magic #. *< major version @@ -3324,85 +3465,81 @@ #. *< priority #. *< id #: ../libpurple/plugins/newline.c:68 -#, fuzzy msgid "New Line" -msgstr "Nytt vindu" +msgstr "Ny linje" #. *< name #. *< version #: ../libpurple/plugins/newline.c:70 -#, fuzzy msgid "Prepends a newline to displayed message." -msgstr "Kunne ikke sende beskjed." +msgstr "Legger til en ny linje på vist beskjed." #. *< summary #: ../libpurple/plugins/newline.c:71 -msgid "" -"Prepends a newline to messages so that the rest of the message appears below " -"the screen name in the conversation window." -msgstr "" +msgid "Prepends a newline to messages so that the rest of the message appears below the screen name in the conversation window." +msgstr "Setter inn en ny linje foran beskjeder sånn at resten av teksten kommer frem under skjermnavnet i samtalevinduet." #: ../libpurple/plugins/offlinemsg.c:23 msgid "Offline Message Emulation" -msgstr "" - -#: ../libpurple/plugins/offlinemsg.c:25 ../libpurple/plugins/offlinemsg.c:26 +msgstr "Emulering av avlogget-beskjed" + +#: ../libpurple/plugins/offlinemsg.c:25 +#: ../libpurple/plugins/offlinemsg.c:26 msgid "Save messages sent to an offline user as pounce." -msgstr "" +msgstr "Lagre beskjeder sendt til en avlogget bruker som pounce." #: ../libpurple/plugins/offlinemsg.c:95 -msgid "" -"The rest of the messages will be saved as pounce. You can edit/delete the " -"pounce from the `Buddy Pounce' dialog." -msgstr "" +msgid "The rest of the messages will be saved as pounce. You can edit/delete the pounce from the `Buddy Pounce' dialog." +msgstr "Resten av beskjeden vil bli lagret som pounce. Du kan forandre/slette varslingen fra Kompisvarslings dialogen." #: ../libpurple/plugins/offlinemsg.c:156 #, c-format -msgid "" -"\"%s\" is currently offline. Do you want to save the rest of the messages in " -"a pounce and automatically send them when \"%s\" logs back in?" -msgstr "" +msgid "\"%s\" is currently offline. Do you want to save the rest of the messages in a pounce and automatically send them when \"%s\" logs back in?" +msgstr "\"%s\" er for tiden avlogget. Vil du lagre resten av beskjeden i en pounce og automatisk sende den når \"%s\" logger inn igjen?" #: ../libpurple/plugins/offlinemsg.c:160 -#, fuzzy msgid "Offline Message" -msgstr "Avlogget" +msgstr "Avlogget Beskjed" #: ../libpurple/plugins/offlinemsg.c:161 msgid "You can edit/delete the pounce from the `Buddy Pounces' dialog" -msgstr "" +msgstr "Du kan forandre/slette varsling fra Kompisvarslings dialogen" #: ../libpurple/plugins/offlinemsg.c:165 -#: ../libpurple/protocols/msn/dialog.c:133 -#: ../libpurple/protocols/msn/msn.c:550 ../libpurple/protocols/msn/msn.c:560 -#: ../libpurple/protocols/novell/novell.c:1917 +#: ../libpurple/protocols/msn/dialog.c:141 +#: ../libpurple/protocols/msn/msn.c:622 +#: ../libpurple/protocols/novell/novell.c:1919 #: ../libpurple/protocols/silc/buddy.c:317 -#: ../libpurple/protocols/silc/pk.c:113 ../libpurple/protocols/silc/wb.c:304 +#: ../libpurple/protocols/silc/pk.c:113 +#: ../libpurple/protocols/silc/wb.c:304 #: ../libpurple/protocols/silc10/buddy.c:314 #: ../libpurple/protocols/silc10/pk.c:119 -#: ../libpurple/protocols/silc10/wb.c:304 ../pidgin/gtkrequest.c:268 +#: ../libpurple/protocols/silc10/wb.c:304 +#: ../pidgin/gtkrequest.c:268 msgid "Yes" msgstr "Ja" #: ../libpurple/plugins/offlinemsg.c:166 -#: ../libpurple/protocols/msn/dialog.c:134 -#: ../libpurple/protocols/msn/msn.c:550 ../libpurple/protocols/msn/msn.c:560 -#: ../libpurple/protocols/novell/novell.c:1918 +#: ../libpurple/protocols/msn/dialog.c:142 +#: ../libpurple/protocols/msn/msn.c:622 +#: ../libpurple/protocols/novell/novell.c:1920 #: ../libpurple/protocols/silc/buddy.c:318 -#: ../libpurple/protocols/silc/pk.c:114 ../libpurple/protocols/silc/wb.c:305 +#: ../libpurple/protocols/silc/pk.c:114 +#: ../libpurple/protocols/silc/wb.c:305 #: ../libpurple/protocols/silc10/buddy.c:315 #: ../libpurple/protocols/silc10/pk.c:120 -#: ../libpurple/protocols/silc10/wb.c:305 ../pidgin/gtkrequest.c:269 +#: ../libpurple/protocols/silc10/wb.c:305 +#: ../pidgin/gtkrequest.c:269 msgid "No" msgstr "Nei" #: ../libpurple/plugins/offlinemsg.c:193 msgid "Save offline messages in pounce" -msgstr "" +msgstr "Lagre avloggede beskjder i pounce" #: ../libpurple/plugins/offlinemsg.c:197 msgid "Do not ask. Always save in pounce." -msgstr "" +msgstr "Ikke spør. Alltid lagre i pounce." #. *< type #. *< ui_requirement @@ -3417,46 +3554,42 @@ #. *< name #. *< version #. *< summary -#: ../libpurple/plugins/perl/perl.c:603 ../libpurple/plugins/perl/perl.c:604 +#: ../libpurple/plugins/perl/perl.c:603 +#: ../libpurple/plugins/perl/perl.c:604 msgid "Provides support for loading perl plugins." msgstr "Lar deg laste perl-tillegg." #: ../libpurple/plugins/psychic.c:20 msgid "Psychic Mode" -msgstr "" +msgstr "Synsk Modus" #: ../libpurple/plugins/psychic.c:21 msgid "Psychic mode for incoming conversation" -msgstr "" +msgstr "Synsk modus for innkommende samtale" #: ../libpurple/plugins/psychic.c:22 -msgid "" -"Causes conversation windows to appear as other users begin to message you. " -"This works for AIM, ICQ, XMPP, Sametime, and Yahoo!" -msgstr "" +msgid "Causes conversation windows to appear as other users begin to message you. This works for AIM, ICQ, XMPP, Sametime, and Yahoo!" +msgstr "Gjør at samtalevinduet dukker opp idet andre brukere begynner å sende beskjed til deg. Dette fungerer for AIM, ICQ, XMPP, Sametime og Yahoo!" #: ../libpurple/plugins/psychic.c:72 msgid "You feel a disturbance in the force..." -msgstr "" +msgstr "You feel a disturbance in the force..." #: ../libpurple/plugins/psychic.c:91 -#, fuzzy msgid "Only enable for users on the buddy list" msgstr "Tillat bare brukere fra kontaktlisten min" #: ../libpurple/plugins/psychic.c:96 -#, fuzzy msgid "Disable when away" -msgstr "%s forsvant" +msgstr "Slå av når borte" #: ../libpurple/plugins/psychic.c:100 msgid "Display notification message in conversations" -msgstr "" +msgstr "Vis påminnelse i samtaler" #: ../libpurple/plugins/psychic.c:105 -#, fuzzy msgid "Raise psychic conversations" -msgstr "Samtalevinduer for direktemeldinger" +msgstr "Fremhev synske samtaler" #. *< type #. *< ui_requirement @@ -3486,21 +3619,22 @@ #. *< id #: ../libpurple/plugins/simple.c:37 msgid "Simple Plugin" -msgstr "Simpelt tillegg" +msgstr "Simpelt Tillegg" #. *< name #. *< version #. * summary #. * description -#: ../libpurple/plugins/simple.c:40 ../libpurple/plugins/simple.c:42 +#: ../libpurple/plugins/simple.c:40 +#: ../libpurple/plugins/simple.c:42 msgid "Tests to see that most things are working." msgstr "Test for å se at mesteparten fungerer." #. Scheme name -#: ../libpurple/plugins/ssl/ssl-gnutls.c:902 +#: ../libpurple/plugins/ssl/ssl-gnutls.c:903 #: ../libpurple/plugins/ssl/ssl-nss.c:725 msgid "X.509 Certificates" -msgstr "" +msgstr "X.509-sertifikater" #. *< type #. *< ui_requirement @@ -3508,7 +3642,7 @@ #. *< dependencies #. *< priority #. *< id -#: ../libpurple/plugins/ssl/ssl-gnutls.c:986 +#: ../libpurple/plugins/ssl/ssl-gnutls.c:987 msgid "GNUTLS" msgstr "GNUTLS" @@ -3516,8 +3650,8 @@ #. *< version #. * summary #. * description -#: ../libpurple/plugins/ssl/ssl-gnutls.c:989 -#: ../libpurple/plugins/ssl/ssl-gnutls.c:991 +#: ../libpurple/plugins/ssl/ssl-gnutls.c:990 +#: ../libpurple/plugins/ssl/ssl-gnutls.c:992 msgid "Provides SSL support through GNUTLS." msgstr "Tilbyr SSL-støtte gjennom GNUTLS." @@ -3554,7 +3688,8 @@ #. *< version #. * summary #. * description -#: ../libpurple/plugins/ssl/ssl.c:97 ../libpurple/plugins/ssl/ssl.c:99 +#: ../libpurple/plugins/ssl/ssl.c:97 +#: ../libpurple/plugins/ssl/ssl.c:99 msgid "Provides a wrapper around SSL support libraries." msgstr "Tilbyr ett felles grensesnitt for SSL-biblioteker." @@ -3571,17 +3706,17 @@ #: ../libpurple/plugins/statenotify.c:62 #, c-format msgid "%s has become idle." -msgstr "%s har blitt inaktiv" +msgstr "%s har blitt inaktiv." #: ../libpurple/plugins/statenotify.c:64 #, c-format msgid "%s is no longer idle." -msgstr "%s er ikke lenger inaktiv" +msgstr "%s er ikke lenger inaktiv." #: ../libpurple/plugins/statenotify.c:73 -#, fuzzy, c-format +#, c-format msgid "%s has signed on." -msgstr "%s har logget på (%s)" +msgstr "%s har logget på." #: ../libpurple/plugins/statenotify.c:91 msgid "Notify When" @@ -3589,16 +3724,15 @@ #: ../libpurple/plugins/statenotify.c:94 msgid "Buddy Goes _Away" -msgstr "Kontakt forsvinner" +msgstr "Kontakt _Forsvinner" #: ../libpurple/plugins/statenotify.c:97 msgid "Buddy Goes _Idle" -msgstr "Kontakt blir inaktiv:" +msgstr "Kontakt blir _Inaktiv" #: ../libpurple/plugins/statenotify.c:100 -#, fuzzy msgid "Buddy _Signs On/Off" -msgstr "Kontakt logger inn" +msgstr "Kontakt _Logger Inn/Ut" #. *< type #. *< ui_requirement @@ -3616,62 +3750,53 @@ #. * description #: ../libpurple/plugins/statenotify.c:151 #: ../libpurple/plugins/statenotify.c:154 -msgid "" -"Notifies in a conversation window when a buddy goes or returns from away or " -"idle." -msgstr "" -"Varsler i et samtalevindu når en kontakt blir borte/inaktiv, eller " -"returnerer." +msgid "Notifies in a conversation window when a buddy goes or returns from away or idle." +msgstr "Varsler i et samtalevindu når en kontakt blir borte/inaktiv, eller returnerer." # -#: ../libpurple/plugins/tcl/tcl.c:421 +#: ../libpurple/plugins/tcl/tcl.c:423 msgid "Tcl Plugin Loader" msgstr "Tcl-tilleggslaster" # -#: ../libpurple/plugins/tcl/tcl.c:423 ../libpurple/plugins/tcl/tcl.c:424 +#: ../libpurple/plugins/tcl/tcl.c:425 +#: ../libpurple/plugins/tcl/tcl.c:426 msgid "Provides support for loading Tcl plugins" -msgstr "Lar deg laste Tcl-tillegg." - -#: ../libpurple/plugins/tcl/tcl.c:507 -msgid "" -"Unable to detect ActiveTCL installation. If you wish to use TCL plugins, " -"install ActiveTCL from http://www.activestate.com\n" -msgstr "" +msgstr "Lar deg laste Tcl-tillegg" + +#: ../libpurple/plugins/tcl/tcl.c:509 +msgid "Unable to detect ActiveTCL installation. If you wish to use TCL plugins, install ActiveTCL from http://www.activestate.com\n" +msgstr "Kunne ikke finne en ActiveTCL installasjon. Om du ønsker å bruke TCL tillegg, installer ActiveTCL fra http://www.activestate.com\n" #. Send a message about the connection error #: ../libpurple/protocols/bonjour/bonjour.c:112 -#, fuzzy msgid "Unable to listen for incoming IM connections\n" -msgstr "Kunne ikke lage ny tilkobling." +msgstr "Kunne ikke lage ny tilkobling\n" #: ../libpurple/protocols/bonjour/bonjour.c:137 -msgid "" -"Unable to establish connection with the local mDNS server. Is it running?" -msgstr "" +msgid "Unable to establish connection with the local mDNS server. Is it running?" +msgstr "Kunne ikke etablere kontakt med den lokale mDNS serveren. Er den igang?" #. Creating the options for the protocol #: ../libpurple/protocols/bonjour/bonjour.c:351 #: ../libpurple/protocols/bonjour/bonjour.c:656 #: ../libpurple/protocols/gg/gg.c:632 #: ../libpurple/protocols/jabber/jabber.c:942 -#, fuzzy msgid "First name" -msgstr "Fornavn:" +msgstr "Fornavn" #: ../libpurple/protocols/bonjour/bonjour.c:353 #: ../libpurple/protocols/bonjour/bonjour.c:659 #: ../libpurple/protocols/gg/gg.c:627 #: ../libpurple/protocols/jabber/jabber.c:947 -#, fuzzy msgid "Last name" -msgstr "Etternavn:" +msgstr "Etternavn" #: ../libpurple/protocols/bonjour/bonjour.c:357 #: ../libpurple/protocols/jabber/buddy.c:295 #: ../libpurple/protocols/jabber/buddy.c:1325 #: ../libpurple/protocols/jabber/buddy.c:1335 -#: ../libpurple/protocols/jabber/buddy.c:2216 +#: ../libpurple/protocols/jabber/buddy.c:2219 #: ../libpurple/protocols/silc/ops.c:1041 #: ../libpurple/protocols/silc/util.c:555 #: ../libpurple/protocols/silc10/ops.c:1075 @@ -3682,16 +3807,14 @@ #: ../libpurple/protocols/bonjour/bonjour.c:360 #: ../libpurple/protocols/bonjour/bonjour.c:665 -#, fuzzy msgid "AIM Account" -msgstr "Legg til konto" +msgstr "AIM-konto" # #: ../libpurple/protocols/bonjour/bonjour.c:363 #: ../libpurple/protocols/bonjour/bonjour.c:668 -#, fuzzy msgid "XMPP Account" -msgstr "Konto" +msgstr "XMPP-konto" #. *< type #. *< ui_requirement @@ -3705,9 +3828,8 @@ #. * description #: ../libpurple/protocols/bonjour/bonjour.c:467 #: ../libpurple/protocols/bonjour/bonjour.c:469 -#, fuzzy msgid "Bonjour Protocol Plugin" -msgstr "Yahoo-protokolltillegg" +msgstr "Bonjour-protokolltillegg" #: ../libpurple/protocols/bonjour/bonjour.c:610 #, fuzzy @@ -3721,30 +3843,27 @@ #: ../libpurple/protocols/silc/silc.c:1011 #: ../libpurple/protocols/silc10/silc.c:681 #: ../libpurple/protocols/silc10/silc.c:922 -#, fuzzy msgid "E-mail" -msgstr "E-post:" +msgstr "E-post" #: ../libpurple/protocols/bonjour/bonjour.h:33 msgid "Bonjour" -msgstr "" +msgstr "Bonjour" #: ../libpurple/protocols/bonjour/jabber.c:380 -#, fuzzy, c-format +#, c-format msgid "%s has closed the conversation." -msgstr "%s har blitt invitert til denne samtalen." +msgstr "%s har lukket samtalen." #: ../libpurple/protocols/bonjour/jabber.c:437 #: ../libpurple/protocols/bonjour/jabber.c:660 #: ../libpurple/protocols/bonjour/jabber.c:678 -#, fuzzy msgid "Unable to send the message, the conversation couldn't be started." -msgstr "Kunne ikke sende beskjed. Beskjeden er for stor." +msgstr "Kunne ikke sende beskjed, samtalen ble ikke startet." #: ../libpurple/protocols/bonjour/jabber.c:583 -#, fuzzy msgid "Cannot open socket" -msgstr "Klartie ikke åpne socket" +msgstr "Klarte ikke åpne socket" #: ../libpurple/protocols/bonjour/jabber.c:591 #, fuzzy @@ -3752,185 +3871,180 @@ msgstr "Feil: kunne ikke koble til" #: ../libpurple/protocols/bonjour/jabber.c:615 -#, fuzzy msgid "Could not bind socket to port" -msgstr "Kunne ikke opprette socket" +msgstr "Kunne ikke knytte socket til port" #: ../libpurple/protocols/bonjour/jabber.c:623 -#, fuzzy msgid "Could not listen on socket" -msgstr "Kunne ikke opprette socket" - -#: ../libpurple/protocols/gg/gg.c:76 ../libpurple/proxy.c:1829 +msgstr "Kunne ikke lytte på socket" + +#: ../libpurple/protocols/gg/gg.c:76 +#: ../libpurple/proxy.c:1829 msgid "Invalid proxy settings" msgstr "Ugyldige proxyinnstilinger" -#: ../libpurple/protocols/gg/gg.c:77 ../libpurple/proxy.c:1829 -msgid "" -"Either the host name or port number specified for your given proxy type is " -"invalid." +#: ../libpurple/protocols/gg/gg.c:77 +#: ../libpurple/proxy.c:1829 +msgid "Either the host name or port number specified for your given proxy type is invalid." msgstr "Det spesifiserte maskinnavnet eller portnummeret for proxy er ugyldig." -#: ../libpurple/protocols/gg/gg.c:115 ../libpurple/protocols/gg/gg.c:137 +#: ../libpurple/protocols/gg/gg.c:115 +#: ../libpurple/protocols/gg/gg.c:137 #: ../libpurple/protocols/gg/gg.c:180 #, fuzzy msgid "Token Error" msgstr "Ukjent feil" -#: ../libpurple/protocols/gg/gg.c:116 ../libpurple/protocols/gg/gg.c:138 +#: ../libpurple/protocols/gg/gg.c:116 +#: ../libpurple/protocols/gg/gg.c:138 #: ../libpurple/protocols/gg/gg.c:181 -#, fuzzy msgid "Unable to fetch the token.\n" -msgstr "Klarte ikke hente ned romliste." - -#: ../libpurple/protocols/gg/gg.c:269 ../libpurple/protocols/gg/gg.c:288 -#, fuzzy +msgstr "Klarte ikke hente ned romliste.\n" + +#: ../libpurple/protocols/gg/gg.c:269 +#: ../libpurple/protocols/gg/gg.c:288 msgid "Save Buddylist..." -msgstr "Sende kontaktliste" +msgstr "Lagre kontaktliste..." #: ../libpurple/protocols/gg/gg.c:270 msgid "Your buddylist is empty, nothing was written to the file." msgstr "Kompislisten din er tom, ingenting ble skrevet til filen." -#: ../libpurple/protocols/gg/gg.c:276 ../libpurple/protocols/gg/gg.c:278 -#, fuzzy +#: ../libpurple/protocols/gg/gg.c:276 +#: ../libpurple/protocols/gg/gg.c:278 msgid "Couldn't open file" -msgstr "Kan ikke sende fil" +msgstr "Kunne ikke åpne filen" #: ../libpurple/protocols/gg/gg.c:289 -#, fuzzy msgid "Buddylist saved successfully!" -msgstr "Passordet er endret" - -#: ../libpurple/protocols/gg/gg.c:307 ../libpurple/protocols/gg/gg.c:308 -#, fuzzy +msgstr "Lagring av kompisliste var vellykket!" + +#: ../libpurple/protocols/gg/gg.c:307 +#: ../libpurple/protocols/gg/gg.c:308 msgid "Couldn't load buddylist" -msgstr "Kunne ikke eksportere kontaktliste" +msgstr "Kunne ikke laste kontaktliste" #: ../libpurple/protocols/gg/gg.c:324 -#, fuzzy msgid "Load Buddylist..." -msgstr "_Alias for kontakt..." +msgstr "Last Kontaktliste..." #: ../libpurple/protocols/gg/gg.c:325 -#, fuzzy msgid "Buddylist loaded successfully!" -msgstr "Passordet er endret" +msgstr "Lasting av kontaktliste var vellykket!" #: ../libpurple/protocols/gg/gg.c:336 -#, fuzzy msgid "Save buddylist..." -msgstr "Sende kontaktliste" +msgstr "Lagre kontaktliste..." #: ../libpurple/protocols/gg/gg.c:384 msgid "Fill in the registration fields." msgstr "Fyll inn registrerings feltene." #: ../libpurple/protocols/gg/gg.c:389 -#, fuzzy msgid "Passwords do not match." -msgstr "De nye passordene stemmer ikke overens." +msgstr "Passordene stemmer ikke overens." #: ../libpurple/protocols/gg/gg.c:398 -#, fuzzy msgid "Unable to register new account. Error occurred.\n" -msgstr "Kunne ikke lage ny tilkobling." +msgstr "Kunne ikke registere ny konto. En feil oppsto.\n" #: ../libpurple/protocols/gg/gg.c:411 msgid "New Gadu-Gadu Account Registered" msgstr "Ny Gadu-Gadu konto registrert" #: ../libpurple/protocols/gg/gg.c:412 -#, fuzzy msgid "Registration completed successfully!" msgstr "Registreringen var vellykket!" -#: ../libpurple/protocols/gg/gg.c:482 ../libpurple/protocols/gg/gg.c:775 +#: ../libpurple/protocols/gg/gg.c:482 +#: ../libpurple/protocols/gg/gg.c:775 #: ../libpurple/protocols/jabber/jabber.c:913 #: ../libpurple/protocols/jabber/jabber.c:916 #: ../libpurple/protocols/jabber/jabber.c:1722 msgid "Password" msgstr "Passord" -#: ../libpurple/protocols/gg/gg.c:487 ../libpurple/protocols/gg/gg.c:780 -#, fuzzy +#: ../libpurple/protocols/gg/gg.c:487 +#: ../libpurple/protocols/gg/gg.c:780 msgid "Password (retype)" -msgstr "Passord sendt" - -#: ../libpurple/protocols/gg/gg.c:492 ../libpurple/protocols/gg/gg.c:785 -#, fuzzy +msgstr "Passord (skriv på nytt)" + +#: ../libpurple/protocols/gg/gg.c:492 +#: ../libpurple/protocols/gg/gg.c:785 msgid "Enter current token" -msgstr "%s er ikke pålogget." - -#: ../libpurple/protocols/gg/gg.c:498 ../libpurple/protocols/gg/gg.c:791 -#, fuzzy +msgstr "Skriv inn gjeldende kjennemerke" + +#: ../libpurple/protocols/gg/gg.c:498 +#: ../libpurple/protocols/gg/gg.c:791 msgid "Current token" -msgstr "Pålogget på" - -#: ../libpurple/protocols/gg/gg.c:502 ../libpurple/protocols/gg/gg.c:503 -#, fuzzy +msgstr "Gjeldende kjennemerke" + +#: ../libpurple/protocols/gg/gg.c:502 +#: ../libpurple/protocols/gg/gg.c:503 msgid "Register New Gadu-Gadu Account" -msgstr "Registrere ny jabber-konto" +msgstr "Registrere Ny Gadu-Gadu Konto" #: ../libpurple/protocols/gg/gg.c:504 msgid "Please, fill in the following fields" -msgstr "Vennligst fyll ut de følgende felt." - -#: ../libpurple/protocols/gg/gg.c:642 ../libpurple/protocols/gg/gg.c:1054 +msgstr "Vennligst fyll ut de følgende felt" + +#: ../libpurple/protocols/gg/gg.c:642 +#: ../libpurple/protocols/gg/gg.c:1054 #: ../libpurple/protocols/gg/gg.c:1126 #: ../libpurple/protocols/jabber/jabber.c:957 -#: ../libpurple/protocols/oscar/oscar.c:3789 -#: ../libpurple/protocols/oscar/oscar.c:3802 +#: ../libpurple/protocols/oscar/oscar.c:3785 +#: ../libpurple/protocols/oscar/oscar.c:3798 #: ../libpurple/protocols/qq/buddy_info.c:49 msgid "City" msgstr "By" #: ../libpurple/protocols/gg/gg.c:647 msgid "Year of birth" -msgstr "Fødselsdato" - -#: ../libpurple/protocols/gg/gg.c:650 ../libpurple/protocols/msn/msn.c:1589 +msgstr "Fødselsår" + +#: ../libpurple/protocols/gg/gg.c:650 +#: ../libpurple/protocols/msn/msn.c:1699 #: ../libpurple/protocols/myspace/user.c:115 -#: ../libpurple/protocols/oscar/oscar.c:3732 +#: ../libpurple/protocols/oscar/oscar.c:3728 #: ../libpurple/protocols/qq/buddy_info.c:46 -#: ../libpurple/protocols/qq/qq.c:226 ../libpurple/protocols/qq/qq.c:229 -#: ../libpurple/protocols/qq/qq.c:232 ../libpurple/protocols/qq/qq.c:236 +#: ../libpurple/protocols/qq/qq.c:226 +#: ../libpurple/protocols/qq/qq.c:229 +#: ../libpurple/protocols/qq/qq.c:232 +#: ../libpurple/protocols/qq/qq.c:236 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1091 msgid "Gender" msgstr "Kjønn" #: ../libpurple/protocols/gg/gg.c:651 msgid "Male or female" -msgstr "" +msgstr "Hankjønn eller hunkjønn" #: ../libpurple/protocols/gg/gg.c:652 -#: ../libpurple/protocols/oscar/oscar.c:3732 +#: ../libpurple/protocols/oscar/oscar.c:3728 #: ../libpurple/protocols/qq/buddy_info.c:83 #: ../libpurple/protocols/qq/qq.c:226 msgid "Male" msgstr "Hankjønn" #: ../libpurple/protocols/gg/gg.c:653 -#: ../libpurple/protocols/oscar/oscar.c:3732 +#: ../libpurple/protocols/oscar/oscar.c:3728 #: ../libpurple/protocols/qq/buddy_info.c:84 #: ../libpurple/protocols/qq/qq.c:229 msgid "Female" msgstr "Hunkjønn" #: ../libpurple/protocols/gg/gg.c:657 -#, fuzzy msgid "Only online" -msgstr "Pålogget" - -#: ../libpurple/protocols/gg/gg.c:661 ../libpurple/protocols/gg/gg.c:662 -#, fuzzy +msgstr "Kun pålogget" + +#: ../libpurple/protocols/gg/gg.c:661 +#: ../libpurple/protocols/gg/gg.c:662 msgid "Find buddies" -msgstr "Dimme ned inaktive kontakter" +msgstr "Finn kontakter" #: ../libpurple/protocols/gg/gg.c:663 -#, fuzzy msgid "Please, enter your search criteria below" -msgstr "Skriv inn ditt nye passord" +msgstr "Vennligst fyll inn dine søke kriterier under" #: ../libpurple/protocols/gg/gg.c:701 msgid "Fill in the fields." @@ -3941,236 +4055,227 @@ msgstr "Ditt nåværende passord er forskjellig fra det du skrev." #: ../libpurple/protocols/gg/gg.c:727 -#, fuzzy msgid "Unable to change password. Error occurred.\n" -msgstr "Kunne ikke bytte Gadu-Gadu-passord" +msgstr "Kunne ikke bytte passord. En feil oppsto. \n" #: ../libpurple/protocols/gg/gg.c:736 -#, fuzzy msgid "Change password for the Gadu-Gadu account" -msgstr "Endre passord for %s:" +msgstr "Endre passord for Gadu-Gadu kontoen" #: ../libpurple/protocols/gg/gg.c:737 -#, fuzzy msgid "Password was changed successfully!" -msgstr "Passordet er endret" +msgstr "Endring av passord vellykket!" #: ../libpurple/protocols/gg/gg.c:770 -#, fuzzy msgid "Current password" -msgstr "Feil passord." +msgstr "Nåværende passord" # #: ../libpurple/protocols/gg/gg.c:795 -#, fuzzy msgid "Please, enter your current password and your new password for UIN: " -msgstr "Skriv inn ditt nåværende passord og ditt nye passord." - -#: ../libpurple/protocols/gg/gg.c:799 ../libpurple/protocols/gg/gg.c:800 -#, fuzzy +msgstr "Skriv inn ditt nåværende passord og ditt nye passord for UIN: " + +#: ../libpurple/protocols/gg/gg.c:799 +#: ../libpurple/protocols/gg/gg.c:800 msgid "Change Gadu-Gadu Password" -msgstr "Kunne ikke bytte Gadu-Gadu-passord" +msgstr "Endre Gadu-Gadu-passord" #: ../libpurple/protocols/gg/gg.c:876 -#, fuzzy, c-format +#, c-format msgid "Select a chat for buddy: %s" -msgstr "Fjern samtalen fra kontaktlisten din" - -#: ../libpurple/protocols/gg/gg.c:879 ../libpurple/protocols/gg/gg.c:880 -#, fuzzy +msgstr "Velg en samtale for kontakt: %s" + +#: ../libpurple/protocols/gg/gg.c:879 +#: ../libpurple/protocols/gg/gg.c:880 msgid "Add to chat..." -msgstr "Legg til samtalegruppe" +msgstr "Legg til samtale..." #: ../libpurple/protocols/gg/gg.c:1008 -#: ../libpurple/protocols/jabber/buddy.c:2031 -#: ../libpurple/protocols/novell/novell.c:2828 +#: ../libpurple/protocols/jabber/buddy.c:2034 +#: ../libpurple/protocols/novell/novell.c:2833 #: ../libpurple/protocols/oscar/oscar.c:828 -#: ../libpurple/protocols/oscar/oscar.c:5604 -#: ../libpurple/protocols/qq/qq.c:170 ../libpurple/protocols/qq/qq.c:177 +#: ../libpurple/protocols/oscar/oscar.c:5602 +#: ../libpurple/protocols/qq/qq.c:170 +#: ../libpurple/protocols/qq/qq.c:177 #: ../libpurple/protocols/qq/qq.c:292 -#: ../libpurple/protocols/yahoo/yahoo.c:3099 ../libpurple/status.c:154 -#: ../pidgin/gtkblist.c:3104 ../pidgin/gtkblist.c:3436 -#: ../pidgin/gtkdocklet.c:450 ../pidgin/gtkstatusbox.c:1061 +#: ../libpurple/protocols/yahoo/yahoo.c:3098 +#: ../libpurple/status.c:154 +#: ../pidgin/gtkblist.c:3302 +#: ../pidgin/gtkblist.c:3640 +#: ../pidgin/gtkdocklet.c:450 +#: ../pidgin/gtkstatusbox.c:1061 msgid "Offline" msgstr "Avlogget" #: ../libpurple/protocols/gg/gg.c:1011 -#: ../libpurple/protocols/jabber/buddy.c:2033 -#: ../libpurple/protocols/msn/state.c:29 ../libpurple/protocols/msn/state.c:30 -#: ../libpurple/protocols/msn/state.c:37 ../libpurple/protocols/msn/state.c:38 -#: ../libpurple/protocols/novell/novell.c:2816 +#: ../libpurple/protocols/jabber/buddy.c:2036 +#: ../libpurple/protocols/msn/state.c:29 +#: ../libpurple/protocols/msn/state.c:30 +#: ../libpurple/protocols/msn/state.c:37 +#: ../libpurple/protocols/msn/state.c:38 +#: ../libpurple/protocols/novell/novell.c:2821 #: ../libpurple/protocols/qq/qq.c:280 -#: ../libpurple/protocols/yahoo/yahoo.c:3101 ../libpurple/status.c:155 -#: ../pidgin/gtkdocklet.c:438 ../pidgin/gtkstatusbox.c:1057 +#: ../libpurple/protocols/yahoo/yahoo.c:3100 +#: ../libpurple/status.c:155 +#: ../pidgin/gtkdocklet.c:438 +#: ../pidgin/gtkstatusbox.c:1057 msgid "Available" msgstr "Tilgjengelig" #. get_yahoo_status_from_purple_status() returns YAHOO_STATUS_CUSTOM for #. * the generic away state (YAHOO_STATUS_TYPE_AWAY) with no message #. Away stuff -#: ../libpurple/protocols/gg/gg.c:1014 ../libpurple/protocols/irc/irc.c:528 +#: ../libpurple/protocols/gg/gg.c:1014 +#: ../libpurple/protocols/irc/irc.c:528 #: ../libpurple/protocols/irc/msgs.c:310 -#: ../libpurple/protocols/jabber/buddy.c:2037 -#: ../libpurple/protocols/novell/novell.c:2819 +#: ../libpurple/protocols/jabber/buddy.c:2040 +#: ../libpurple/protocols/novell/novell.c:2824 #: ../libpurple/protocols/oscar/oscar.c:733 -#: ../libpurple/protocols/oscar/oscar.c:4547 -#: ../libpurple/protocols/oscar/oscar.c:5632 -#: ../libpurple/protocols/qq/qq.c:180 ../libpurple/protocols/qq/qq.c:284 +#: ../libpurple/protocols/oscar/oscar.c:4543 +#: ../libpurple/protocols/oscar/oscar.c:5630 +#: ../libpurple/protocols/qq/qq.c:180 +#: ../libpurple/protocols/qq/qq.c:284 #: ../libpurple/protocols/silc/buddy.c:1476 #: ../libpurple/protocols/silc10/buddy.c:1476 -#: ../libpurple/protocols/yahoo/yahoo.c:3653 -#: ../libpurple/protocols/yahoo/yahoo.c:3727 ../libpurple/status.c:158 -#: ../pidgin/gtkdocklet.c:442 ../pidgin/gtkprefs.c:1939 +#: ../libpurple/protocols/yahoo/yahoo.c:3652 +#: ../libpurple/protocols/yahoo/yahoo.c:3726 +#: ../libpurple/status.c:158 +#: ../pidgin/gtkdocklet.c:442 +#: ../pidgin/gtkprefs.c:1941 #: ../pidgin/gtkstatusbox.c:1058 -#, c-format msgid "Away" msgstr "Borte" -#: ../libpurple/protocols/gg/gg.c:1043 ../libpurple/protocols/gg/gg.c:1117 -#: ../libpurple/protocols/oscar/oscar.c:2699 -#: ../libpurple/protocols/oscar/oscar.c:3699 +#: ../libpurple/protocols/gg/gg.c:1043 +#: ../libpurple/protocols/gg/gg.c:1117 +#: ../libpurple/protocols/oscar/oscar.c:2695 +#: ../libpurple/protocols/oscar/oscar.c:3695 msgid "UIN" msgstr "UIN" -#: ../libpurple/protocols/gg/gg.c:1046 ../libpurple/protocols/gg/gg.c:1120 -#: ../libpurple/protocols/jabber/buddy.c:2210 -#: ../libpurple/protocols/jabber/buddy.c:2386 -#: ../libpurple/protocols/oscar/oscar.c:3710 +#: ../libpurple/protocols/gg/gg.c:1046 +#: ../libpurple/protocols/gg/gg.c:1120 +#: ../libpurple/protocols/jabber/buddy.c:2213 +#: ../libpurple/protocols/jabber/buddy.c:2389 +#: ../libpurple/protocols/oscar/oscar.c:3706 #: ../libpurple/protocols/silc/ops.c:990 #: ../libpurple/protocols/silc10/ops.c:1024 msgid "First Name" msgstr "Fornavn" -#: ../libpurple/protocols/gg/gg.c:1059 ../libpurple/protocols/gg/gg.c:1129 +#: ../libpurple/protocols/gg/gg.c:1059 +#: ../libpurple/protocols/gg/gg.c:1129 msgid "Birth Year" msgstr "Fødselsår" -#: ../libpurple/protocols/gg/gg.c:1111 ../libpurple/protocols/gg/gg.c:1180 -#: ../libpurple/protocols/oscar/oscar.c:3911 -#, fuzzy +#: ../libpurple/protocols/gg/gg.c:1111 +#: ../libpurple/protocols/gg/gg.c:1180 +#: ../libpurple/protocols/oscar/oscar.c:3907 msgid "Unable to display the search results." -msgstr "Kunne ikke invitere bruker (%s)." +msgstr "Kunne ikke vise søke-resultatene." #: ../libpurple/protocols/gg/gg.c:1171 msgid "Gadu-Gadu Public Directory" -msgstr "" +msgstr "Gadu-Gadu Offentlig Mappe" #: ../libpurple/protocols/gg/gg.c:1172 -#, fuzzy msgid "Search results" msgstr "Søkeresultater" #: ../libpurple/protocols/gg/gg.c:1215 -#, fuzzy msgid "No matching users found" -msgstr "Ingen logger ble funnet" +msgstr "Ingen matchende brukere funnet" #: ../libpurple/protocols/gg/gg.c:1216 -#, fuzzy msgid "There are no users matching your search criteria." -msgstr "Skriv inn ditt nye passord" - -#: ../libpurple/protocols/gg/gg.c:1310 ../libpurple/protocols/gg/gg.c:1463 +msgstr "Ingen brukere matchet dine søkekriterier." + +#: ../libpurple/protocols/gg/gg.c:1310 +#: ../libpurple/protocols/gg/gg.c:1463 msgid "Unable to read socket" msgstr "Kunne ikke lese socket" #: ../libpurple/protocols/gg/gg.c:1395 -#, fuzzy msgid "Buddy list downloaded" -msgstr "Kontakt er inaktiv:" +msgstr "Kontaktliste nedlastet" #: ../libpurple/protocols/gg/gg.c:1396 -#, fuzzy msgid "Your buddy list was downloaded from the server." -msgstr "Du har blitt koblet fra tjeneren." +msgstr "Kontaktlisten din har blitt lastet ned fra serveren." #: ../libpurple/protocols/gg/gg.c:1403 -#, fuzzy msgid "Buddy list uploaded" -msgstr "Kontaktvisning" +msgstr "Kontaktliste lastet opp" #: ../libpurple/protocols/gg/gg.c:1404 -#, fuzzy msgid "Your buddy list was stored on the server." -msgstr "Det er ingen kontaktliste på Gadu-Gadu-tjeneren." - -#: ../libpurple/protocols/gg/gg.c:1509 ../libpurple/protocols/gg/gg.c:1715 -#, fuzzy +msgstr "Kontaktlisten ble lagret på serveren." + +#: ../libpurple/protocols/gg/gg.c:1509 +#: ../libpurple/protocols/gg/gg.c:1715 msgid "Connection failed." -msgstr "Tilkopling feilet" - -#: ../libpurple/protocols/gg/gg.c:1621 ../libpurple/protocols/msn/msn.c:559 +msgstr "Tilkobling feilet." + +#: ../libpurple/protocols/gg/gg.c:1621 +#: ../libpurple/protocols/msn/msn.c:621 msgid "Blocked" msgstr "Blokkert" #: ../libpurple/protocols/gg/gg.c:1644 -#, fuzzy msgid "Add to chat" msgstr "Legg til samtale" #: ../libpurple/protocols/gg/gg.c:1653 -#, fuzzy msgid "Unblock" -msgstr "Blokker" +msgstr "Ikke Blokker" #: ../libpurple/protocols/gg/gg.c:1657 msgid "Block" msgstr "Blokker" #: ../libpurple/protocols/gg/gg.c:1674 -#, fuzzy msgid "Chat _name:" -msgstr "Etternavn:" +msgstr "Samtale _navn:" #: ../libpurple/protocols/gg/gg.c:1914 -#, fuzzy msgid "Chat error" -msgstr "Lesefeil" +msgstr "Samtalefeil" #: ../libpurple/protocols/gg/gg.c:1915 -#, fuzzy msgid "This chat name is already in use" -msgstr "Filen eksisterer allerede." +msgstr "Dette samtalenavnet er allerede i bruk" #: ../libpurple/protocols/gg/gg.c:1998 -#, fuzzy msgid "Not connected to the server." -msgstr "Du har blitt koblet fra tjeneren." +msgstr "Ikke tilkoblet tjeneren." #: ../libpurple/protocols/gg/gg.c:2021 -#, fuzzy msgid "Find buddies..." -msgstr "Dimme ned inaktive kontakter" +msgstr "Finn kontakter..." #: ../libpurple/protocols/gg/gg.c:2027 -#, fuzzy msgid "Change password..." -msgstr "Bytt passord..." +msgstr "Endre passord..." #: ../libpurple/protocols/gg/gg.c:2033 -#, fuzzy msgid "Upload buddylist to Server" -msgstr "Eksporter kontaktliste til tjener" +msgstr "Eksporter kontaktliste til Server" #: ../libpurple/protocols/gg/gg.c:2037 -#, fuzzy msgid "Download buddylist from Server" -msgstr "Slett kontaktliste fra tjener" +msgstr "Last ned kontaktliste fra Server" #: ../libpurple/protocols/gg/gg.c:2041 -#, fuzzy msgid "Delete buddylist from Server" -msgstr "Slett kontaktliste fra tjener" +msgstr "Slett kontaktliste fra Server" #: ../libpurple/protocols/gg/gg.c:2045 -#, fuzzy msgid "Save buddylist to file..." -msgstr "Lagre kompisliste til fil" +msgstr "Lagre kompisliste til fil..." #: ../libpurple/protocols/gg/gg.c:2049 -#, fuzzy msgid "Load buddylist from file..." -msgstr "Importer kontaktliste fra tjener" +msgstr "Last inn kontaktliste fra fil..." #. magic #. major_version @@ -4190,12 +4295,11 @@ #. summary #: ../libpurple/protocols/gg/gg.c:2154 msgid "Polish popular IM" -msgstr "" +msgstr "Populær Polsk Lynmeldingsklient" #: ../libpurple/protocols/gg/gg.c:2208 -#, fuzzy msgid "Gadu-Gadu User" -msgstr "Gadu-Gadu søkemotor" +msgstr "Gadu-Gadu Bruker" #: ../libpurple/protocols/irc/cmds.c:43 #: ../libpurple/protocols/silc/silc.c:1637 @@ -4224,15 +4328,13 @@ #: ../libpurple/protocols/yahoo/yahoo_filexfer.c:269 #: ../libpurple/protocols/yahoo/yahoo_filexfer.c:278 #: ../libpurple/protocols/yahoo/yahoo_filexfer.c:287 -#, fuzzy msgid "File Transfer Failed" -msgstr "Filoverføring avbrutt." +msgstr "Filoverføring feilet" #: ../libpurple/protocols/irc/dcc_send.c:297 #: ../libpurple/protocols/irc/dcc_send.c:338 -#, fuzzy msgid "Could not open a listening port." -msgstr "Gaim kunne ikke åpne en inngående port" +msgstr "Kunne ikke åpne port for lytting." #: ../libpurple/protocols/irc/irc.c:79 msgid "Error displaying MOTD" @@ -4251,9 +4353,11 @@ msgid "MOTD for %s" msgstr "MOTD for %s" -#: ../libpurple/protocols/irc/irc.c:127 ../libpurple/protocols/irc/irc.c:165 -#: ../libpurple/protocols/irc/irc.c:612 ../libpurple/protocols/irc/irc.c:637 -#: ../libpurple/protocols/myspace/myspace.c:2356 +#: ../libpurple/protocols/irc/irc.c:127 +#: ../libpurple/protocols/irc/irc.c:165 +#: ../libpurple/protocols/irc/irc.c:612 +#: ../libpurple/protocols/irc/irc.c:637 +#: ../libpurple/protocols/myspace/myspace.c:2354 msgid "Server has disconnected" msgstr "Tjeneren har koplet fra" @@ -4261,15 +4365,17 @@ msgid "View MOTD" msgstr "Vis MOTD" -#: ../libpurple/protocols/irc/irc.c:261 ../libpurple/protocols/silc/chat.c:33 +#: ../libpurple/protocols/irc/irc.c:261 +#: ../libpurple/protocols/silc/chat.c:33 #: ../libpurple/protocols/silc10/chat.c:33 msgid "_Channel:" msgstr "_Kanal:" #: ../libpurple/protocols/irc/irc.c:267 -#: ../libpurple/protocols/jabber/chat.c:59 ../pidgin/gtkaccount.c:524 +#: ../libpurple/protocols/jabber/chat.c:59 +#: ../pidgin/gtkaccount.c:524 msgid "_Password:" -msgstr "_Passord" +msgstr "_Passord:" #: ../libpurple/protocols/irc/irc.c:298 msgid "IRC nicks may not contain whitespace" @@ -4279,15 +4385,16 @@ #. connect to the server #: ../libpurple/protocols/irc/irc.c:319 #: ../libpurple/protocols/jabber/jabber.c:1280 -#: ../libpurple/protocols/msn/session.c:345 -#: ../libpurple/protocols/myspace/myspace.c:301 -#: ../libpurple/protocols/novell/novell.c:2182 +#: ../libpurple/protocols/msn/session.c:384 +#: ../libpurple/protocols/myspace/myspace.c:302 +#: ../libpurple/protocols/novell/novell.c:2187 #: ../libpurple/protocols/oscar/oscar.c:1287 #: ../libpurple/protocols/qq/qq.c:136 #: ../libpurple/protocols/sametime/sametime.c:3723 -#: ../libpurple/protocols/simple/simple.c:1716 -#: ../libpurple/protocols/yahoo/yahoo.c:2939 -#: ../libpurple/protocols/zephyr/zephyr.c:1621 ../pidgin/gtkstatusbox.c:662 +#: ../libpurple/protocols/simple/simple.c:1718 +#: ../libpurple/protocols/yahoo/yahoo.c:2938 +#: ../libpurple/protocols/zephyr/zephyr.c:1621 +#: ../pidgin/gtkstatusbox.c:662 msgid "Connecting" msgstr "Kobler til" @@ -4300,20 +4407,21 @@ #. TODO: try other ports if in auto mode, then save #. * working port and try that first next time. #: ../libpurple/protocols/irc/irc.c:338 -#: ../libpurple/protocols/myspace/myspace.c:317 +#: ../libpurple/protocols/myspace/myspace.c:318 #: ../libpurple/protocols/simple/simple.c:464 -#: ../libpurple/protocols/simple/simple.c:1631 +#: ../libpurple/protocols/simple/simple.c:1633 msgid "Couldn't create socket" msgstr "Kunne ikke opprette socket" #: ../libpurple/protocols/irc/irc.c:421 -#: ../libpurple/protocols/myspace/myspace.c:2469 +#: ../libpurple/protocols/myspace/myspace.c:2467 #: ../libpurple/protocols/oscar/oscar.c:1283 msgid "Couldn't connect to host" msgstr "Kunne ikke koble til" -#: ../libpurple/protocols/irc/irc.c:609 ../libpurple/protocols/irc/irc.c:634 -#: ../libpurple/protocols/myspace/myspace.c:2352 +#: ../libpurple/protocols/irc/irc.c:609 +#: ../libpurple/protocols/irc/irc.c:634 +#: ../libpurple/protocols/myspace/myspace.c:2350 msgid "Read error" msgstr "Lesefeil" @@ -4332,7 +4440,7 @@ #: ../libpurple/protocols/silc10/ops.c:1382 #: ../libpurple/protocols/yahoo/yahoochat.c:1506 msgid "Topic" -msgstr "Tema:" +msgstr "Tema" #. *< type #. *< ui_requirement @@ -4349,26 +4457,28 @@ #. * summary #: ../libpurple/protocols/irc/irc.c:915 msgid "The IRC Protocol Plugin that Sucks Less" -msgstr "IRC-protokolltillegg" +msgstr "IRC-protokolltillegget som Suger mindre" #. host to connect to -#: ../libpurple/protocols/irc/irc.c:940 ../libpurple/protocols/irc/msgs.c:323 -#: ../libpurple/protocols/msn/msn.c:2185 -#: ../libpurple/protocols/oscar/oscar.c:6671 +#: ../libpurple/protocols/irc/irc.c:940 +#: ../libpurple/protocols/irc/msgs.c:323 +#: ../libpurple/protocols/msn/msn.c:2297 +#: ../libpurple/protocols/oscar/oscar.c:6669 #: ../libpurple/protocols/qq/qq.c:755 #: ../libpurple/protocols/sametime/sametime.c:5727 #: ../libpurple/protocols/silc/ops.c:1249 #: ../libpurple/protocols/silc/ops.c:1341 #: ../libpurple/protocols/silc10/ops.c:1244 #: ../libpurple/protocols/silc10/ops.c:1347 -#: ../libpurple/protocols/simple/simple.c:1896 +#: ../libpurple/protocols/simple/simple.c:1898 #: ../libpurple/protocols/toc/toc.c:2327 msgid "Server" -msgstr "Tjener" +msgstr "Server" #. port to connect to -#: ../libpurple/protocols/irc/irc.c:943 ../libpurple/protocols/msn/msn.c:2190 -#: ../libpurple/protocols/oscar/oscar.c:6674 +#: ../libpurple/protocols/irc/irc.c:943 +#: ../libpurple/protocols/msn/msn.c:2302 +#: ../libpurple/protocols/oscar/oscar.c:6672 #: ../libpurple/protocols/qq/qq.c:758 #: ../libpurple/protocols/sametime/sametime.c:5732 #: ../libpurple/protocols/silc/silc.c:1918 @@ -4379,9 +4489,10 @@ #: ../libpurple/protocols/irc/irc.c:946 msgid "Encodings" -msgstr "Tegnkodinger:" - -#: ../libpurple/protocols/irc/irc.c:949 ../libpurple/protocols/irc/msgs.c:316 +msgstr "Tegnkodinger" + +#: ../libpurple/protocols/irc/irc.c:949 +#: ../libpurple/protocols/irc/msgs.c:316 #: ../libpurple/protocols/jabber/jabber.c:904 #: ../libpurple/protocols/jabber/jabber.c:907 #: ../libpurple/protocols/silc/buddy.c:1539 @@ -4399,7 +4510,8 @@ msgid "Username" msgstr "Brukernavn" -#: ../libpurple/protocols/irc/irc.c:952 ../libpurple/protocols/irc/msgs.c:317 +#: ../libpurple/protocols/irc/irc.c:952 +#: ../libpurple/protocols/irc/msgs.c:317 #: ../libpurple/protocols/silc/silc.c:1009 #: ../libpurple/protocols/silc10/silc.c:920 msgid "Real name" @@ -4410,9 +4522,8 @@ #. prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); #. #: ../libpurple/protocols/irc/irc.c:960 -#, fuzzy msgid "Use SSL" -msgstr "SSL" +msgstr "Bruk SSL" #: ../libpurple/protocols/irc/msgs.c:187 msgid "Bad mode" @@ -4430,7 +4541,7 @@ #: ../libpurple/protocols/irc/msgs.c:216 #, c-format msgid "Cannot ban %s: banlist is full" -msgstr "Kan ikke bannlyse %s: Bannlysninslista er full." +msgstr "Kan ikke bannlyse %s: Bannlysninslista er full" #: ../libpurple/protocols/irc/msgs.c:301 msgid " (ircop)" @@ -4441,7 +4552,7 @@ msgstr " (registrert)" #: ../libpurple/protocols/irc/msgs.c:303 -#: ../libpurple/protocols/oscar/oscar.c:3700 +#: ../libpurple/protocols/oscar/oscar.c:3696 #: ../libpurple/protocols/silc/ops.c:1418 #: ../libpurple/protocols/silc10/ops.c:1414 msgid "Nick" @@ -4454,37 +4565,35 @@ msgstr "Pålogget på" #: ../libpurple/protocols/irc/msgs.c:334 -#, fuzzy msgid "Idle for" -msgstr "Inaktiv" +msgstr "Inaktiv for" #: ../libpurple/protocols/irc/msgs.c:337 msgid "Online since" msgstr "Pålogget siden" #: ../libpurple/protocols/irc/msgs.c:341 -#, fuzzy msgid "Defining adjective:" -msgstr "
Beskrivelse: Strålende
" +msgstr "Definerer adjektiv:" #: ../libpurple/protocols/irc/msgs.c:341 msgid "Glorious" -msgstr "" +msgstr "Strålende" #: ../libpurple/protocols/irc/msgs.c:420 #, c-format msgid "%s has changed the topic to: %s" -msgstr "%s har endret kanaltema til: %s" +msgstr "%s har endret temaet til: %s" #: ../libpurple/protocols/irc/msgs.c:422 -#, fuzzy, c-format +#, c-format msgid "%s has cleared the topic." -msgstr "%s har endret kanaltema til: %s" +msgstr "%s har endret tema." #: ../libpurple/protocols/irc/msgs.c:430 #, c-format msgid "The topic for %s is: %s" -msgstr "Kanaltema for %s er %s" +msgstr "Temaet for %s er: %s" #: ../libpurple/protocols/irc/msgs.c:448 #, c-format @@ -4496,9 +4605,8 @@ msgstr "Ukjent beskjed" #: ../libpurple/protocols/irc/msgs.c:449 -#, fuzzy msgid "The IRC server received a message it did not understand." -msgstr "Gaim har sendt en beskjed som IRC-tjeneren ikke forstod." +msgstr "Pidgin har sendt en beskjed som IRC-tjeneren ikke forstod." #: ../libpurple/protocols/irc/msgs.c:470 #, c-format @@ -4507,9 +4615,8 @@ # #: ../libpurple/protocols/irc/msgs.c:575 -#, fuzzy msgid "Time Response" -msgstr "Tid" +msgstr "Responstid" #: ../libpurple/protocols/irc/msgs.c:576 msgid "The IRC server's local time is:" @@ -4551,7 +4658,8 @@ msgstr "Du har blitt sparket ut fra %s: %s" #. Remove user from channel -#: ../libpurple/protocols/irc/msgs.c:800 ../libpurple/protocols/silc/ops.c:699 +#: ../libpurple/protocols/irc/msgs.c:800 +#: ../libpurple/protocols/silc/ops.c:699 #: ../libpurple/protocols/silc10/ops.c:720 #, c-format msgid "Kicked by %s (%s)" @@ -4562,26 +4670,18 @@ msgid "mode (%s %s) by %s" msgstr "mode (%s %s) av %s" -#: ../libpurple/protocols/irc/msgs.c:908 ../libpurple/protocols/irc/msgs.c:909 +#: ../libpurple/protocols/irc/msgs.c:908 +#: ../libpurple/protocols/irc/msgs.c:909 msgid "Invalid nickname" msgstr "Ugyldig brukernavn" #: ../libpurple/protocols/irc/msgs.c:910 -#, fuzzy -msgid "" -"Your selected nickname was rejected by the server. It probably contains " -"invalid characters." -msgstr "" -"Ditt valgte kontonavn ble avvist av tjeneren. Sannsynligvis inneholder det " -"ugyldige tegn." +msgid "Your selected nickname was rejected by the server. It probably contains invalid characters." +msgstr "Ditt valgte kontonavn ble avvist av tjeneren. Sannsynligvis inneholder det ugyldige tegn." #: ../libpurple/protocols/irc/msgs.c:915 -msgid "" -"Your selected account name was rejected by the server. It probably contains " -"invalid characters." -msgstr "" -"Ditt valgte kontonavn ble avvist av tjeneren. Sannsynligvis inneholder det " -"ugyldige tegn." +msgid "Your selected account name was rejected by the server. It probably contains invalid characters." +msgstr "Ditt valgte kontonavn ble avvist av tjeneren. Sannsynligvis inneholder det ugyldige tegn." #: ../libpurple/protocols/irc/msgs.c:954 msgid "Cannot change nick" @@ -4606,9 +4706,9 @@ msgstr "PING-svar -- lag: %lu sekunder" #: ../libpurple/protocols/irc/msgs.c:1110 -#, fuzzy, c-format +#, c-format msgid "Cannot join %s: Registration is required." -msgstr "Registrering kreves" +msgstr "Kan ikke joine %s: Registrering kreves." #: ../libpurple/protocols/irc/msgs.c:1111 #: ../libpurple/protocols/silc/ops.c:1093 @@ -4617,9 +4717,8 @@ msgstr "Kan ikke bli med i kanal" #: ../libpurple/protocols/irc/msgs.c:1145 -#, fuzzy msgid "Nick or channel is temporarily unavailable." -msgstr "Tjenesten er midlertidig utilgjengelig." +msgstr "Nick eller kanal er midlertidig utilgjengelig." #: ../libpurple/protocols/irc/msgs.c:1157 #, c-format @@ -4631,157 +4730,93 @@ msgstr "action <action to perform>: Utfør noe." #: ../libpurple/protocols/irc/parse.c:123 -#, fuzzy -msgid "" -"away [message]: Set an away message, or use no message to return from being " -"away." -msgstr "" -"fraværende [melding]: Sett en melding som skal vises når du er fraværende, " -"eller ikke sett noen for å returnere." +msgid "away [message]: Set an away message, or use no message to return from being away." +msgstr "fraværende [melding]: Sett en melding som skal vises når du er fraværende, eller ikke sett noen for å returnere." #: ../libpurple/protocols/irc/parse.c:124 -#, fuzzy msgid "chanserv: Send a command to chanserv" -msgstr "quote [...]: Send en rå kommando til serveren." +msgstr "chanserv: Send en kommando til chanserv" #: ../libpurple/protocols/irc/parse.c:125 -msgid "" -"deop <nick1> [nick2] ...: Remove channel operator status from " -"someone. You must be a channel operator to do this." -msgstr "" -"deop <nick1> [nick2] ...: Fjern kanal OP status fra noen. Du må være " -"kanal OP for å gjøre dette." +msgid "deop <nick1> [nick2] ...: Remove channel operator status from someone. You must be a channel operator to do this." +msgstr "deop <nick1> [nick2] ...: Fjern kanal OP status fra noen. Du må være kanal OP for å gjøre dette." #: ../libpurple/protocols/irc/parse.c:126 -msgid "" -"devoice <nick1> [nick2] ...: Remove channel voice status from " -"someone, preventing them from speaking if the channel is moderated (+m). You " -"must be a channel operator to do this." -msgstr "" -"devoice <nick1> [nick2] ...: Fjern kanal voice status fra noen, " -"hindre de fra å snakke om kanalen er moderert (+m). Du må være kanal OP for " -"å gjøre dette." +msgid "devoice <nick1> [nick2] ...: Remove channel voice status from someone, preventing them from speaking if the channel is moderated (+m). You must be a channel operator to do this." +msgstr "devoice <nick1> [nick2] ...: Fjern kanal voice status fra noen, hindre de fra å snakke om kanalen er moderert (+m). Du må være kanal OP for å gjøre dette." #: ../libpurple/protocols/irc/parse.c:127 -msgid "" -"invite <nick> [room]: Invite someone to join you in the specified " -"channel, or the current channel." -msgstr "" -"invite <nick> [room]: Inviter noen til å joine deg i spsifisert kanel " -"eller den nåværende kanalen." +msgid "invite <nick> [room]: Invite someone to join you in the specified channel, or the current channel." +msgstr "invite <nick> [room]: Inviter noen til å joine deg i spsifisert kanel eller den nåværende kanalen." #: ../libpurple/protocols/irc/parse.c:128 -msgid "" -"j <room1>[,room2][,...] [key1[,key2][,...]]: Enter one or more " -"channels, optionally providing a channel key for each if needed." -msgstr "" -"j <room1>[,room2][,...] [key1[,key2][,...]]: Fyll inn en eller flere " -"kanaler, alternativt gi en nøkkel for hver om nødvendig." +msgid "j <room1>[,room2][,...] [key1[,key2][,...]]: Enter one or more channels, optionally providing a channel key for each if needed." +msgstr "j <room1>[,room2][,...] [key1[,key2][,...]]: Fyll inn en eller flere kanaler, alternativt gi en nøkkel for hver om nødvendig." #: ../libpurple/protocols/irc/parse.c:129 -msgid "" -"join <room1>[,room2][,...] [key1[,key2][,...]]: Enter one or more " -"channels, optionally providing a channel key for each if needed." -msgstr "" -"join <room1>[,room2][,...] [key1[,key2][,...]]: Fyll inn en eller " -"flere kanaler, alternativt gi en nøkkel for hver om nødvendig." +msgid "join <room1>[,room2][,...] [key1[,key2][,...]]: Enter one or more channels, optionally providing a channel key for each if needed." +msgstr "join <room1>[,room2][,...] [key1[,key2][,...]]: Fyll inn en eller flere kanaler, alternativt gi en nøkkel for hver om nødvendig." #: ../libpurple/protocols/irc/parse.c:130 -msgid "" -"kick <nick> [message]: Remove someone from a channel. You must be a " -"channel operator to do this." -msgstr "" -"kick <nick> [message]: Fjern noen fra en kanal. Du må være kanal OP " -"for å gjøre dette." +msgid "kick <nick> [message]: Remove someone from a channel. You must be a channel operator to do this." +msgstr "kick <nick> [message]: Fjern noen fra en kanal. Du må være kanal OP for å gjøre dette." #: ../libpurple/protocols/irc/parse.c:131 -msgid "" -"list: Display a list of chat rooms on the network. Warning, some servers " -"may disconnect you upon doing this." -msgstr "" -"list: Vis en liste over samtalerom på et nettverk.Advarsel, noen servere " -"kan disconnecte om du gjør dette." +msgid "list: Display a list of chat rooms on the network. Warning, some servers may disconnect you upon doing this." +msgstr "list: Vis en liste over samtalerom på et nettverk.Advarsel, noen servere kan disconnecte om du gjør dette." #: ../libpurple/protocols/irc/parse.c:132 msgid "me <action to perform>: Perform an action." msgstr "me <action to perform>: Utfør noe." #: ../libpurple/protocols/irc/parse.c:133 -#, fuzzy msgid "memoserv: Send a command to memoserv" -msgstr "quote [...]: Send en rå kommando til serveren." +msgstr "memoserv: Send en kommando til memoserv" #: ../libpurple/protocols/irc/parse.c:134 -msgid "" -"mode <+|-><A-Za-z> <nick|channel>: Set or unset a channel " -"or user mode." -msgstr "" -"mode <+|-><A-Za-z> <nick|channel>: Sett er fjern en kanal " -"eller bruker modus." +msgid "mode <+|-><A-Za-z> <nick|channel>: Set or unset a channel or user mode." +msgstr "mode <+|-><A-Za-z> <nick|channel>: Sett er fjern en kanal eller bruker modus." #: ../libpurple/protocols/irc/parse.c:135 -msgid "" -"msg <nick> <message>: Send a private message to a user (as " -"opposed to a channel)." -msgstr "" -"msg <nick> <message>: Send en privat beskjed til en bruker." +msgid "msg <nick> <message>: Send a private message to a user (as opposed to a channel)." +msgstr "msg <nick> <message>: Send en privat beskjed til en bruker." #: ../libpurple/protocols/irc/parse.c:136 msgid "names [channel]: List the users currently in a channel." msgstr "names [channel]: Vis brukere i denne kanalen." #: ../libpurple/protocols/irc/parse.c:137 -#: ../libpurple/protocols/jabber/jabber.c:2261 +#: ../libpurple/protocols/jabber/jabber.c:2299 msgid "nick <new nickname>: Change your nickname." msgstr "nick <new nickname>: Skift nick." #: ../libpurple/protocols/irc/parse.c:138 -#, fuzzy msgid "nickserv: Send a command to nickserv" -msgstr "quote [...]: Send en rå kommando til serveren." +msgstr "nickserv: Send en kommando til nickserv" #: ../libpurple/protocols/irc/parse.c:139 -msgid "" -"op <nick1> [nick2] ...: Grant channel operator status to someone. You " -"must be a channel operator to do this." -msgstr "" -"op <nick1> [nick2] ...: Tillat OP status til noen. Du må være kanal " -"OP for å gjøre dette." +msgid "op <nick1> [nick2] ...: Grant channel operator status to someone. You must be a channel operator to do this." +msgstr "op <nick1> [nick2] ...: Tillat OP status til noen. Du må være kanal OP for å gjøre dette." #: ../libpurple/protocols/irc/parse.c:140 -msgid "" -"operwall <message>: If you don't know what this is, you probably " -"can't use it." -msgstr "" -"operwall <message>: Om du ikke vet hva dette er, kan du sannsynligvis " -"ikke bruke dette." +msgid "operwall <message>: If you don't know what this is, you probably can't use it." +msgstr "operwall <message>: Om du ikke vet hva dette er, kan du sannsynligvis ikke bruke dette." #: ../libpurple/protocols/irc/parse.c:141 -#, fuzzy msgid "operserv: Send a command to operserv" -msgstr "quote [...]: Send en rå kommando til serveren." +msgstr "operserv: Send en kommando til operserv" #: ../libpurple/protocols/irc/parse.c:142 -msgid "" -"part [room] [message]: Leave the current channel, or a specified channel, " -"with an optional message." -msgstr "" -"part [room] [message]: Forlat nåværende kanal eller en spesifisert kanal " -"med en beskjed." +msgid "part [room] [message]: Leave the current channel, or a specified channel, with an optional message." +msgstr "part [room] [message]: Forlat nåværende kanal eller en spesifisert kanal med en beskjed." #: ../libpurple/protocols/irc/parse.c:143 -msgid "" -"ping [nick]: Asks how much lag a user (or the server if no user specified) " -"has." +msgid "ping [nick]: Asks how much lag a user (or the server if no user specified) has." msgstr "ping [nick]: Send ping til en bruker." #: ../libpurple/protocols/irc/parse.c:144 -msgid "" -"query <nick> <message>: Send a private message to a user (as " -"opposed to a channel)." -msgstr "" -"query <nick> <message>: Send en privat beskjed til en bruker " -"(vises ikke i kanal)." +msgid "query <nick> <message>: Send a private message to a user (as opposed to a channel)." +msgstr "query <nick> <message>: Send en privat beskjed til en bruker (vises ikke i kanal)." #: ../libpurple/protocols/irc/parse.c:145 msgid "quit [message]: Disconnect from the server, with an optional message." @@ -4792,12 +4827,8 @@ msgstr "quote [...]: Send en rå kommando til serveren." #: ../libpurple/protocols/irc/parse.c:147 -msgid "" -"remove <nick> [message]: Remove someone from a room. You must be a " -"channel operator to do this." -msgstr "" -"remove <nick> [message]: Fjern noen fra et rom. Du må være kanal OP " -"for å gjøre dette." +msgid "remove <nick> [message]: Remove someone from a room. You must be a channel operator to do this." +msgstr "remove <nick> [message]: Fjern noen fra et rom. Du må være kanal OP for å gjøre dette." #: ../libpurple/protocols/irc/parse.c:148 msgid "time: Displays the current local time at the IRC server." @@ -4813,32 +4844,23 @@ #: ../libpurple/protocols/irc/parse.c:151 msgid "version [nick]: send CTCP VERSION request to a user" -msgstr "" +msgstr "versjon [nick]: send CTCP VERSION forespørsel til en bruker" #: ../libpurple/protocols/irc/parse.c:152 -msgid "" -"voice <nick1> [nick2] ...: Grant channel voice status to someone. You " -"must be a channel operator to do this." -msgstr "" -"voice <nick1> [nick2] ...: Gi voice til noen. Du må være kanal OP for " -"å gjøre dette." +msgid "voice <nick1> [nick2] ...: Grant channel voice status to someone. You must be a channel operator to do this." +msgstr "voice <nick1> [nick2] ...: Gi voice til noen. Du må være kanal OP for å gjøre dette." #: ../libpurple/protocols/irc/parse.c:153 -msgid "" -"wallops <message>: If you don't know what this is, you probably can't " -"use it." -msgstr "" -"wallops <message>: Om du ikke vet hva dette er, kan du sannsynligvis " -"ikke bruke det." +msgid "wallops <message>: If you don't know what this is, you probably can't use it." +msgstr "wallops <message>: Om du ikke vet hva dette er, kan du sannsynligvis ikke bruke det." #: ../libpurple/protocols/irc/parse.c:154 msgid "whois [server] <nick>: Get information on a user." msgstr "whois [server] <nick>: Hent informasjon om en bruker." #: ../libpurple/protocols/irc/parse.c:155 -#, fuzzy msgid "whowas <nick>: Get information on a user that has logged off." -msgstr "whois [server] <nick>: Hent informasjon om en bruker." +msgstr "whowas <nick>: Få informasjon om en bruker som er logget av." #: ../libpurple/protocols/irc/parse.c:465 #, c-format @@ -4854,8 +4876,10 @@ msgstr "CTCP PING-svar" #: ../libpurple/protocols/irc/parse.c:577 -#: ../libpurple/protocols/irc/parse.c:581 ../libpurple/protocols/toc/toc.c:191 -#: ../libpurple/protocols/toc/toc.c:694 ../libpurple/protocols/toc/toc.c:710 +#: ../libpurple/protocols/irc/parse.c:581 +#: ../libpurple/protocols/toc/toc.c:191 +#: ../libpurple/protocols/toc/toc.c:694 +#: ../libpurple/protocols/toc/toc.c:710 #: ../libpurple/protocols/toc/toc.c:786 msgid "Disconnected." msgstr "Frakoblet." @@ -4869,36 +4893,26 @@ #: ../libpurple/protocols/jabber/adhoccommands.c:139 #: ../libpurple/protocols/jabber/adhoccommands.c:140 -#, fuzzy msgid "Ad-Hoc Command Failed" -msgstr "Kommando deaktivert" - -#: ../libpurple/protocols/jabber/adhoccommands.c:173 -#, fuzzy +msgstr "Ad-Hoc Kommando Feilet" + +#: ../libpurple/protocols/jabber/adhoccommands.c:176 msgid "execute" -msgstr "Uventet" +msgstr "utfør" #: ../libpurple/protocols/jabber/auth.c:53 msgid "Server requires TLS/SSL for login. No TLS/SSL support found." -msgstr "" -"Tjeneren krever TLS/SSL for å logge inn, men støtte for dette ble ikke " -"funnet." +msgstr "Tjeneren krever TLS/SSL for å logge inn, men støtte for dette ble ikke funnet." #: ../libpurple/protocols/jabber/auth.c:116 msgid "Server requires plaintext authentication over an unencrypted stream" -msgstr "" -"Tjeneren forlanger identitetsbekreftelse i ren tekst over en ukryptert " -"forbindelse" +msgstr "Tjeneren forlanger identitetsbekreftelse i ren tekst over en ukryptert forbindelse" #: ../libpurple/protocols/jabber/auth.c:319 #: ../libpurple/protocols/jabber/auth.c:508 -#, fuzzy, c-format -msgid "" -"%s requires plaintext authentication over an unencrypted connection. Allow " -"this and continue authentication?" -msgstr "" -"Denne tjeneren forlanger autentifikasjon i ren tekst over en ukryptert " -"forbindelse. Tillat dette og fortsett identitetsbekreftelse?" +#, c-format +msgid "%s requires plaintext authentication over an unencrypted connection. Allow this and continue authentication?" +msgstr "%s forlanger autentifikasjon i ren tekst over en ukryptert forbindelse. Tillat dette og fortsett identitetsbekreftelse?" #: ../libpurple/protocols/jabber/auth.c:321 #: ../libpurple/protocols/jabber/auth.c:322 @@ -4927,22 +4941,17 @@ msgstr "Ugyldig svar fra tjener." #: ../libpurple/protocols/jabber/auth.c:600 -msgid "" -"This server requires plaintext authentication over an unencrypted " -"connection. Allow this and continue authentication?" -msgstr "" -"Denne tjeneren forlanger autentifikasjon i ren tekst over en ukryptert " -"forbindelse. Tillat dette og fortsett identitetsbekreftelse?" +msgid "This server requires plaintext authentication over an unencrypted connection. Allow this and continue authentication?" +msgstr "Denne tjeneren forlanger autentifikasjon i ren tekst over en ukryptert forbindelse. Tillat dette og fortsett identitetsbekreftelse?" #: ../libpurple/protocols/jabber/auth.c:797 #: ../libpurple/protocols/jabber/auth.c:820 msgid "Invalid challenge from server" -msgstr "Ugyldig utfordring fra tjener." +msgstr "Ugyldig utfordring fra server" #: ../libpurple/protocols/jabber/auth.c:892 -#, fuzzy msgid "SASL error" -msgstr "Lesefeil" +msgstr "SASL feil" #: ../libpurple/protocols/jabber/buddy.c:283 #: ../libpurple/protocols/jabber/buddy.c:1219 @@ -5024,49 +5033,43 @@ #: ../libpurple/protocols/jabber/buddy.c:300 #: ../libpurple/protocols/jabber/buddy.c:1250 -#: ../libpurple/protocols/msn/msn.c:1658 -#: ../libpurple/protocols/oscar/oscar.c:3749 +#: ../libpurple/protocols/msn/msn.c:1768 +#: ../libpurple/protocols/oscar/oscar.c:3745 msgid "Birthday" msgstr "Fødselsdag" #: ../libpurple/protocols/jabber/buddy.c:301 #: ../libpurple/protocols/jabber/buddy.c:1365 #: ../libpurple/protocols/jabber/chat.c:775 -#: ../libpurple/protocols/jabber/usermood.c:175 ../pidgin/gtkblist.c:3116 +#: ../libpurple/protocols/jabber/usermood.c:175 +#: ../pidgin/gtkblist.c:3314 #: ../pidgin/gtkprefs.c:739 msgid "Description" msgstr "Beskrivelse" #: ../libpurple/protocols/jabber/buddy.c:722 #: ../libpurple/protocols/jabber/buddy.c:723 -#, fuzzy msgid "Edit XMPP vCard" -msgstr "Rediger vCard for Jabber" +msgstr "Edit XMPP vCard" #: ../libpurple/protocols/jabber/buddy.c:724 -msgid "" -"All items below are optional. Enter only the information with which you feel " -"comfortable." -msgstr "" -"Alle feltene nedenfor er valgfrie. Du trenger bare å skrive den " -"informasjonen du ønsker" +msgid "All items below are optional. Enter only the information with which you feel comfortable." +msgstr "Alle feltene nedenfor er valgfrie. Du trenger bare å skrive den informasjonen du ønsker." #: ../libpurple/protocols/jabber/buddy.c:795 #: ../libpurple/protocols/jabber/buddy.c:960 -#, fuzzy msgid "Client" -msgstr "By" +msgstr "Klient" #: ../libpurple/protocols/jabber/buddy.c:799 #: ../libpurple/protocols/jabber/buddy.c:964 -#, fuzzy msgid "Operating System" -msgstr "Skjul operativsystem" +msgstr "Operativsystem" #: ../libpurple/protocols/jabber/buddy.c:815 #: ../libpurple/protocols/jabber/buddy.c:975 msgid "Last Activity" -msgstr "" +msgstr "Siste aktivitet" #: ../libpurple/protocols/jabber/buddy.c:817 #: ../libpurple/protocols/jabber/buddy.c:977 @@ -5077,7 +5080,7 @@ #: ../libpurple/protocols/jabber/buddy.c:819 #: ../libpurple/protocols/jabber/buddy.c:979 msgid "Service Discovery Items" -msgstr "" +msgstr "Service Discovery Items" #: ../libpurple/protocols/jabber/buddy.c:821 #: ../libpurple/protocols/jabber/buddy.c:981 @@ -5093,35 +5096,33 @@ #: ../libpurple/protocols/jabber/buddy.c:825 #: ../libpurple/protocols/jabber/buddy.c:985 -#, fuzzy msgid "Multi-User Chat Extended Presence Information" -msgstr "Brukeren har ingen kataloginformasjon." +msgstr "Brukeren har ingen kataloginformasjon" #: ../libpurple/protocols/jabber/buddy.c:827 #: ../libpurple/protocols/jabber/buddy.c:987 msgid "In-Band Bytestreams" -msgstr "" +msgstr "In-Band Bytestreams" #: ../libpurple/protocols/jabber/buddy.c:829 #: ../libpurple/protocols/jabber/buddy.c:989 -#, fuzzy msgid "Ad-Hoc Commands" -msgstr "Kommando" +msgstr "Ad-Hoc Kommandoer" #: ../libpurple/protocols/jabber/buddy.c:831 #: ../libpurple/protocols/jabber/buddy.c:991 msgid "PubSub Service" -msgstr "" +msgstr "PubSub Service" #: ../libpurple/protocols/jabber/buddy.c:833 #: ../libpurple/protocols/jabber/buddy.c:993 msgid "SOCKS5 Bytestreams" -msgstr "" +msgstr "SOCKS5 Bytestreams" #: ../libpurple/protocols/jabber/buddy.c:835 #: ../libpurple/protocols/jabber/buddy.c:995 msgid "Out of Band Data" -msgstr "" +msgstr "Out of Band Data" #: ../libpurple/protocols/jabber/buddy.c:837 #: ../libpurple/protocols/jabber/buddy.c:997 @@ -5145,7 +5146,7 @@ #: ../libpurple/protocols/jabber/buddy.c:843 #: ../libpurple/protocols/jabber/buddy.c:1003 msgid "User Avatar" -msgstr "" +msgstr "Bruker Avatar" #: ../libpurple/protocols/jabber/buddy.c:845 #: ../libpurple/protocols/jabber/buddy.c:1005 @@ -5155,15 +5156,13 @@ #: ../libpurple/protocols/jabber/buddy.c:847 #: ../libpurple/protocols/jabber/buddy.c:1007 -#, fuzzy msgid "Software Version" -msgstr "Denne versjonen er ikke støttet" +msgstr "Software Versjon" #: ../libpurple/protocols/jabber/buddy.c:849 #: ../libpurple/protocols/jabber/buddy.c:1009 -#, fuzzy msgid "Stream Initiation" -msgstr "Organisasjon" +msgstr "Stream Initiation" #: ../libpurple/protocols/jabber/buddy.c:851 #: ../libpurple/protocols/jabber/buddy.c:1011 @@ -5192,8 +5191,9 @@ #: ../libpurple/protocols/jabber/buddy.c:859 #: ../libpurple/protocols/jabber/buddy.c:1019 +#, fuzzy msgid "Encrypted Session Negotiations" -msgstr "" +msgstr "Krypterte formidlinger av økt" #: ../libpurple/protocols/jabber/buddy.c:861 #: ../libpurple/protocols/jabber/buddy.c:1021 @@ -5227,8 +5227,9 @@ #: ../libpurple/protocols/jabber/buddy.c:871 #: ../libpurple/protocols/jabber/buddy.c:1031 +#, fuzzy msgid "Jingle Audio" -msgstr "" +msgstr "Live Audio" #: ../libpurple/protocols/jabber/buddy.c:873 #: ../libpurple/protocols/jabber/buddy.c:1033 @@ -5239,17 +5240,17 @@ #: ../libpurple/protocols/jabber/buddy.c:875 #: ../libpurple/protocols/jabber/buddy.c:1035 msgid "Jingle ICE UDP" -msgstr "" +msgstr "Jingle ICE UDP" #: ../libpurple/protocols/jabber/buddy.c:877 #: ../libpurple/protocols/jabber/buddy.c:1037 msgid "Jingle ICE TCP" -msgstr "" +msgstr "Jingle ICE TCP" #: ../libpurple/protocols/jabber/buddy.c:879 #: ../libpurple/protocols/jabber/buddy.c:1039 msgid "Jingle Raw UDP" -msgstr "" +msgstr "Jingle Raw UDP" #: ../libpurple/protocols/jabber/buddy.c:881 #: ../libpurple/protocols/jabber/buddy.c:1041 @@ -5260,7 +5261,7 @@ #: ../libpurple/protocols/jabber/buddy.c:883 #: ../libpurple/protocols/jabber/buddy.c:1043 msgid "Jingle DTMF" -msgstr "" +msgstr "Jingle DTMF" #: ../libpurple/protocols/jabber/buddy.c:885 #: ../libpurple/protocols/jabber/buddy.c:1045 @@ -5316,42 +5317,43 @@ #: ../libpurple/protocols/jabber/buddy.c:901 #: ../libpurple/protocols/jabber/buddy.c:1061 +#, fuzzy msgid "Entity Time" -msgstr "" +msgstr "Enhets Tid" #: ../libpurple/protocols/jabber/buddy.c:903 #: ../libpurple/protocols/jabber/buddy.c:1063 msgid "Delayed Delivery" -msgstr "" +msgstr "Forsinket Levering" #: ../libpurple/protocols/jabber/buddy.c:905 #: ../libpurple/protocols/jabber/buddy.c:1065 msgid "Collaborative Data Objects" -msgstr "" +msgstr "Samarbeidende Data Objekter" #: ../libpurple/protocols/jabber/buddy.c:907 #: ../libpurple/protocols/jabber/buddy.c:1067 msgid "File Repository and Sharing" -msgstr "" +msgstr "Fil Oppbevaring og Deling" #: ../libpurple/protocols/jabber/buddy.c:909 #: ../libpurple/protocols/jabber/buddy.c:1069 msgid "STUN Service Discovery for Jingle" -msgstr "" +msgstr "STUN Service Discovery for Jingle" #: ../libpurple/protocols/jabber/buddy.c:911 #: ../libpurple/protocols/jabber/buddy.c:1071 msgid "Simplified Encrypted Session Negotiation" -msgstr "" +msgstr "Forenklet formidling av kryptert økt" #: ../libpurple/protocols/jabber/buddy.c:913 #: ../libpurple/protocols/jabber/buddy.c:1073 msgid "Hop Check" -msgstr "" +msgstr "Hop Sjekk" #: ../libpurple/protocols/jabber/buddy.c:921 #: ../libpurple/protocols/jabber/buddy.c:1081 -#: ../libpurple/protocols/oscar/oscar.c:2906 +#: ../libpurple/protocols/oscar/oscar.c:2902 msgid "Capabilities" msgstr "Evner" @@ -5367,9 +5369,8 @@ #: ../libpurple/protocols/jabber/jabber.c:1577 #: ../libpurple/protocols/jabber/jabber.c:1600 #: ../libpurple/protocols/jabber/jabber.c:1623 -#, fuzzy msgid "Priority" -msgstr "Port" +msgstr "Prioritet" #: ../libpurple/protocols/jabber/buddy.c:1237 #: ../libpurple/protocols/silc/ops.c:994 @@ -5379,8 +5380,8 @@ #: ../libpurple/protocols/jabber/buddy.c:1270 #: ../libpurple/protocols/jabber/jabber.c:952 -#: ../libpurple/protocols/oscar/oscar.c:3788 -#: ../libpurple/protocols/oscar/oscar.c:3801 +#: ../libpurple/protocols/oscar/oscar.c:3784 +#: ../libpurple/protocols/oscar/oscar.c:3797 #: ../libpurple/protocols/qq/buddy_info.c:56 #: ../libpurple/protocols/silc/ops.c:1030 #: ../libpurple/protocols/silc10/ops.c:1064 @@ -5399,118 +5400,108 @@ msgid "Logo" msgstr "Logo" -#: ../libpurple/protocols/jabber/buddy.c:1942 +#: ../libpurple/protocols/jabber/buddy.c:1945 msgid "Un-hide From" msgstr "Fjern fraværsmarkering for" -#: ../libpurple/protocols/jabber/buddy.c:1946 +#: ../libpurple/protocols/jabber/buddy.c:1949 msgid "Temporarily Hide From" msgstr "Midlertidig borte for" #. && NOT ME -#: ../libpurple/protocols/jabber/buddy.c:1954 +#: ../libpurple/protocols/jabber/buddy.c:1957 msgid "Cancel Presence Notification" msgstr "Avbryt varsling av tilstedeværelse" -#: ../libpurple/protocols/jabber/buddy.c:1961 +#: ../libpurple/protocols/jabber/buddy.c:1964 msgid "(Re-)Request authorization" msgstr "Spør på nytt om godkjenning" #. if(NOT ME) #. shouldn't this just happen automatically when the buddy is #. removed? -#: ../libpurple/protocols/jabber/buddy.c:1970 +#: ../libpurple/protocols/jabber/buddy.c:1973 msgid "Unsubscribe" msgstr "Fjern abonnement" -#: ../libpurple/protocols/jabber/buddy.c:1985 -#, fuzzy +#: ../libpurple/protocols/jabber/buddy.c:1988 msgid "Log In" -msgstr "Innlogging" - -#: ../libpurple/protocols/jabber/buddy.c:1989 -#, fuzzy +msgstr "Logg inn" + +#: ../libpurple/protocols/jabber/buddy.c:1992 msgid "Log Out" -msgstr "Logget ut" - -#: ../libpurple/protocols/jabber/buddy.c:2035 +msgstr "Logg ut" + +#: ../libpurple/protocols/jabber/buddy.c:2038 #: ../libpurple/protocols/jabber/jabber.c:1553 msgid "Chatty" msgstr "Pratsom" -#: ../libpurple/protocols/jabber/buddy.c:2039 +#: ../libpurple/protocols/jabber/buddy.c:2042 msgid "Extended Away" msgstr "Utvidet borte" -#: ../libpurple/protocols/jabber/buddy.c:2041 +#: ../libpurple/protocols/jabber/buddy.c:2044 #: ../libpurple/protocols/jabber/jabber.c:1622 #: ../libpurple/protocols/oscar/oscar.c:727 -#: ../libpurple/protocols/oscar/oscar.c:5808 +#: ../libpurple/protocols/oscar/oscar.c:5806 #: ../libpurple/protocols/sametime/sametime.c:3297 -#, c-format msgid "Do Not Disturb" msgstr "Ikke forstyrr" -#: ../libpurple/protocols/jabber/buddy.c:2208 +#: ../libpurple/protocols/jabber/buddy.c:2211 msgid "JID" -msgstr "" - -#: ../libpurple/protocols/jabber/buddy.c:2212 -#: ../libpurple/protocols/jabber/buddy.c:2391 -#: ../libpurple/protocols/oscar/oscar.c:3711 +msgstr "JID" + +#: ../libpurple/protocols/jabber/buddy.c:2215 +#: ../libpurple/protocols/jabber/buddy.c:2394 +#: ../libpurple/protocols/oscar/oscar.c:3707 msgid "Last Name" msgstr "Etternavn" -#: ../libpurple/protocols/jabber/buddy.c:2244 +#: ../libpurple/protocols/jabber/buddy.c:2247 msgid "The following are the results of your search" msgstr "Følgende resultat fra ditt søk" #. current comment from Jabber User Directory users.jabber.org -#: ../libpurple/protocols/jabber/buddy.c:2319 -msgid "" -"Find a contact by entering the search criteria in the given fields. Note: " -"Each field supports wild card searches (%)" -msgstr "" - -#: ../libpurple/protocols/jabber/buddy.c:2339 -#, fuzzy +#: ../libpurple/protocols/jabber/buddy.c:2322 +msgid "Find a contact by entering the search criteria in the given fields. Note: Each field supports wild card searches (%)" +msgstr "Finn en kontakt ved å skrive inn søkekriterier i gitte felter. NB: Hvert felt har støtte for wild card søk (%)" + +#: ../libpurple/protocols/jabber/buddy.c:2342 msgid "Directory Query Failed" -msgstr "Direktekopling feilet" - -#: ../libpurple/protocols/jabber/buddy.c:2340 -#, fuzzy +msgstr "Mappe Forespørsel Feilet" + +#: ../libpurple/protocols/jabber/buddy.c:2343 msgid "Could not query the directory server." -msgstr "Kunne ikke starte filoverføring" +msgstr "Kunne ikke legge til kø hos katalog server." #. Try to translate the message (see static message #. list in jabber_user_dir_comments[]) -#: ../libpurple/protocols/jabber/buddy.c:2374 -#, fuzzy, c-format +#: ../libpurple/protocols/jabber/buddy.c:2377 +#, c-format msgid "Server Instructions: %s" -msgstr "Tjenerinformasjon" - -#: ../libpurple/protocols/jabber/buddy.c:2381 -#, fuzzy +msgstr "Server Instructions: %s" + +#: ../libpurple/protocols/jabber/buddy.c:2384 msgid "Fill in one or more fields to search for any matching XMPP users." -msgstr "" -"Fyll inn ett eller flere felt for å søke etter matchende Jabber brukere." - -#: ../libpurple/protocols/jabber/buddy.c:2401 -#: ../libpurple/protocols/novell/novell.c:1488 -#: ../libpurple/protocols/oscar/oscar.c:3714 -#: ../libpurple/protocols/oscar/oscar.c:3723 +msgstr "Fyll inn ett eller flere felt for å søke etter matchende XMPP brukere." + +#: ../libpurple/protocols/jabber/buddy.c:2404 +#: ../libpurple/protocols/novell/novell.c:1490 +#: ../libpurple/protocols/oscar/oscar.c:3710 +#: ../libpurple/protocols/oscar/oscar.c:3719 msgid "E-Mail Address" msgstr "E-postadresse" # -#: ../libpurple/protocols/jabber/buddy.c:2410 -#: ../libpurple/protocols/jabber/buddy.c:2411 -#, fuzzy +#: ../libpurple/protocols/jabber/buddy.c:2413 +#: ../libpurple/protocols/jabber/buddy.c:2414 msgid "Search for XMPP users" -msgstr "_Søk etter:" +msgstr "Søk etter XMPP-brukere" #. "Search" -#: ../libpurple/protocols/jabber/buddy.c:2412 +#: ../libpurple/protocols/jabber/buddy.c:2415 #: ../libpurple/protocols/qq/group.c:123 #: ../libpurple/protocols/qq/group_im.c:147 #: ../libpurple/protocols/qq/sys_msg.c:174 @@ -5522,29 +5513,25 @@ msgid "Search" msgstr "Søk" -#: ../libpurple/protocols/jabber/buddy.c:2427 -#, fuzzy +#: ../libpurple/protocols/jabber/buddy.c:2430 msgid "Invalid Directory" -msgstr "Ugyldig feil" - -#: ../libpurple/protocols/jabber/buddy.c:2444 -#, fuzzy +msgstr "Ugyldig mappe" + +#: ../libpurple/protocols/jabber/buddy.c:2447 msgid "Enter a User Directory" -msgstr "Kan ikke sende en katalog." - -#: ../libpurple/protocols/jabber/buddy.c:2445 -#, fuzzy +msgstr "Kan ikke sende en katalog" + +#: ../libpurple/protocols/jabber/buddy.c:2448 msgid "Select a user directory to search" -msgstr "Velg en konferanseserver å spørre" +msgstr "Velg en brukermappe å søke i" # -#: ../libpurple/protocols/jabber/buddy.c:2448 -#, fuzzy +#: ../libpurple/protocols/jabber/buddy.c:2451 msgid "Search Directory" -msgstr "_Søk etter:" +msgstr "Søke Katalog" #: ../libpurple/protocols/jabber/chat.c:41 -#: ../libpurple/protocols/oscar/oscar.c:5294 +#: ../libpurple/protocols/oscar/oscar.c:5290 #: ../libpurple/protocols/yahoo/yahoochat.c:1048 msgid "_Room:" msgstr "_Rom:" @@ -5618,19 +5605,16 @@ #: ../libpurple/protocols/jabber/chat.c:689 #: ../libpurple/protocols/silc/ops.c:1456 #: ../libpurple/protocols/silc10/ops.c:1451 -#, fuzzy msgid "Error retrieving room list" msgstr "Klarte ikke hente romliste" #: ../libpurple/protocols/jabber/chat.c:737 -#, fuzzy msgid "Invalid Server" -msgstr "Ugyldig tjenernavn" +msgstr "Ugyldig Server" #: ../libpurple/protocols/jabber/chat.c:781 -#, fuzzy msgid "Enter a Conference Server" -msgstr "Kople til en konferansetjener" +msgstr "Skriv inn en konferansetjener" #: ../libpurple/protocols/jabber/chat.c:782 msgid "Select a conference server to query" @@ -5646,7 +5630,7 @@ #: ../libpurple/protocols/jabber/jabber.c:145 msgid "You require encryption, but it is not available on this server." -msgstr "" +msgstr "Du krever kryptering, men det er ikke støtte for det på denne serveren." #: ../libpurple/protocols/jabber/jabber.c:259 #: ../libpurple/protocols/jabber/jabber.c:312 @@ -5660,14 +5644,16 @@ msgstr "Lesefeil" #: ../libpurple/protocols/jabber/jabber.c:482 -#: ../libpurple/protocols/oscar/flap_connection.c:394 -#: ../libpurple/protocols/yahoo/yahoo.c:2558 -#: ../libpurple/protocols/yahoo/yahoo.c:2590 +#: ../libpurple/protocols/oscar/flap_connection.c:396 +#: ../libpurple/protocols/yahoo/yahoo.c:2557 +#: ../libpurple/protocols/yahoo/yahoo.c:2589 #, c-format msgid "" "Could not establish a connection with the server:\n" "%s" msgstr "" +"Kunne ikke etablere kontakt med serveren:\n" +"%s" #: ../libpurple/protocols/jabber/jabber.c:529 msgid "Unable to create socket" @@ -5675,13 +5661,12 @@ #: ../libpurple/protocols/jabber/jabber.c:575 #: ../libpurple/protocols/jabber/jabber.c:1063 -#, fuzzy msgid "Invalid XMPP ID" -msgstr "Ugyldig ID" +msgstr "Ugyldig XMPP ID" #: ../libpurple/protocols/jabber/jabber.c:580 msgid "Invalid XMPP ID. Domain must be set." -msgstr "" +msgstr "Ugyldig XMPP ID. Domenet må være satt." #: ../libpurple/protocols/jabber/jabber.c:656 #, c-format @@ -5689,14 +5674,14 @@ msgstr "Registrering av %s@%s vellykket" #: ../libpurple/protocols/jabber/jabber.c:662 -#, fuzzy, c-format +#, c-format msgid "Registration to %s successful" -msgstr "Registrering av %s@%s vellykket" +msgstr "Registrering til %s vellykket" #: ../libpurple/protocols/jabber/jabber.c:664 #: ../libpurple/protocols/jabber/jabber.c:665 msgid "Registration Successful" -msgstr "Registreringen var vellykket!" +msgstr "Registreringen var vellykket" #: ../libpurple/protocols/jabber/jabber.c:673 #: ../libpurple/protocols/jabber/jabber.c:674 @@ -5704,21 +5689,19 @@ msgstr "Registrering feilet" #: ../libpurple/protocols/jabber/jabber.c:692 -#, fuzzy, c-format +#, c-format msgid "Registration from %s successfully removed" -msgstr "Registrering av %s@%s vellykket" +msgstr "Registrering av %s ble fjernet" #: ../libpurple/protocols/jabber/jabber.c:694 #: ../libpurple/protocols/jabber/jabber.c:695 -#, fuzzy msgid "Unregistration Successful" -msgstr "Registreringen var vellykket!" +msgstr "Avregistreringen var vellykket" #: ../libpurple/protocols/jabber/jabber.c:703 #: ../libpurple/protocols/jabber/jabber.c:704 -#, fuzzy msgid "Unregistration Failed" -msgstr "Registrering feilet" +msgstr "Avregistrering feilet" #: ../libpurple/protocols/jabber/jabber.c:864 #: ../libpurple/protocols/jabber/jabber.c:865 @@ -5726,13 +5709,12 @@ msgstr "Du er allerede registrert" #: ../libpurple/protocols/jabber/jabber.c:962 -#: ../libpurple/protocols/oscar/oscar.c:3790 -#: ../libpurple/protocols/oscar/oscar.c:3803 +#: ../libpurple/protocols/oscar/oscar.c:3786 +#: ../libpurple/protocols/oscar/oscar.c:3799 msgid "State" msgstr "Fylke/stat" #: ../libpurple/protocols/jabber/jabber.c:967 -#, fuzzy msgid "Postal code" msgstr "Postnummer" @@ -5756,10 +5738,8 @@ msgstr "Registrer" #: ../libpurple/protocols/jabber/jabber.c:994 -#, fuzzy -msgid "" -"Please fill out the information below to change your account registration." -msgstr "Fyll ut feltene under for å registrere den nye kontoen din." +msgid "Please fill out the information below to change your account registration." +msgstr "Fyll ut feltene under for å forandre registrering av kontoen din." #: ../libpurple/protocols/jabber/jabber.c:997 msgid "Please fill out the information below to register your new account." @@ -5767,9 +5747,8 @@ #: ../libpurple/protocols/jabber/jabber.c:1005 #: ../libpurple/protocols/jabber/jabber.c:1006 -#, fuzzy msgid "Register New XMPP Account" -msgstr "Registrere ny jabber-konto" +msgstr "Registrer Ny XMPP-Konto" #: ../libpurple/protocols/jabber/jabber.c:1007 #: ../libpurple/protocols/jabber/jabber.c:1016 @@ -5777,56 +5756,53 @@ msgstr "Registrer" #: ../libpurple/protocols/jabber/jabber.c:1012 -#, fuzzy, c-format +#, c-format msgid "Change Account Registration at %s" msgstr "Endre brukerinformasjon for %s" #: ../libpurple/protocols/jabber/jabber.c:1013 -#, fuzzy, c-format +#, c-format msgid "Register New Account at %s" -msgstr "Registrere ny jabber-konto" +msgstr "Registrere Ny Konto på %s" # #: ../libpurple/protocols/jabber/jabber.c:1016 -#, fuzzy msgid "Change Registration" -msgstr "Registreringsfeil" +msgstr "Forandre Registrering" #: ../libpurple/protocols/jabber/jabber.c:1120 #: ../libpurple/protocols/jabber/jabber.c:1121 -#, fuzzy msgid "Error unregistering account" -msgstr "Feil ved endring av kontoinformasjon" +msgstr "Feil ved avregistrering av konto" #: ../libpurple/protocols/jabber/jabber.c:1126 #: ../libpurple/protocols/jabber/jabber.c:1127 msgid "Account successfully unregistered" -msgstr "" +msgstr "Avregistrering av konto vellykket" #: ../libpurple/protocols/jabber/jabber.c:1284 msgid "Initializing Stream" -msgstr "Nullstiller datastrøm" +msgstr "Initialiserer datastrøm" #: ../libpurple/protocols/jabber/jabber.c:1289 -#, fuzzy msgid "Initializing SSL/TLS" -msgstr "Nullstiller datastrøm" +msgstr "Initialiserer SSL/TLS" #: ../libpurple/protocols/jabber/jabber.c:1293 -#: ../libpurple/protocols/msn/session.c:351 +#: ../libpurple/protocols/msn/session.c:390 msgid "Authenticating" msgstr "Autentiserer" #: ../libpurple/protocols/jabber/jabber.c:1302 msgid "Re-initializing Stream" -msgstr "Nullstiller datastrøm på nytt" +msgstr "Re-Initialiserer datastrøm" #: ../libpurple/protocols/jabber/jabber.c:1396 #: ../libpurple/protocols/jabber/jabber.c:1865 #: ../libpurple/protocols/jabber/jabber.c:1909 #: ../libpurple/protocols/jabber/jabber.c:1945 #: ../libpurple/protocols/oscar/oscar.c:826 -#: ../libpurple/protocols/oscar/oscar.c:5602 +#: ../libpurple/protocols/oscar/oscar.c:5600 msgid "Not Authorized" msgstr "Ikke godkjent" @@ -5835,7 +5811,6 @@ msgstr "Begge" #: ../libpurple/protocols/jabber/jabber.c:1444 -#, fuzzy msgid "From (To pending)" msgstr "Fra (Til avventende)" @@ -5849,7 +5824,6 @@ msgstr "Til" #: ../libpurple/protocols/jabber/jabber.c:1451 -#, fuzzy msgid "None (To pending)" msgstr "Ingen (til avventende)" @@ -5883,9 +5857,8 @@ #: ../libpurple/protocols/jabber/jabber.c:1580 #: ../libpurple/protocols/jabber/jabber.c:1603 #: ../libpurple/protocols/jabber/jabber.c:1626 -#, fuzzy msgid "Mood Text" -msgstr "Sinnsstemning" +msgstr "Sinnsstemnings tekst" #: ../libpurple/protocols/jabber/jabber.c:1535 #: ../libpurple/protocols/jabber/jabber.c:1558 @@ -5893,14 +5866,13 @@ #: ../libpurple/protocols/jabber/jabber.c:1604 #: ../libpurple/protocols/jabber/jabber.c:1627 msgid "Tune Artist" -msgstr "" +msgstr "Artist" #: ../libpurple/protocols/jabber/jabber.c:1536 #: ../libpurple/protocols/jabber/jabber.c:1559 #: ../libpurple/protocols/jabber/jabber.c:1582 #: ../libpurple/protocols/jabber/jabber.c:1605 #: ../libpurple/protocols/jabber/jabber.c:1628 -#, fuzzy msgid "Tune Title" msgstr "Tittel" @@ -5910,7 +5882,7 @@ #: ../libpurple/protocols/jabber/jabber.c:1606 #: ../libpurple/protocols/jabber/jabber.c:1629 msgid "Tune Album" -msgstr "" +msgstr "Album" #: ../libpurple/protocols/jabber/jabber.c:1538 #: ../libpurple/protocols/jabber/jabber.c:1561 @@ -5918,16 +5890,15 @@ #: ../libpurple/protocols/jabber/jabber.c:1607 #: ../libpurple/protocols/jabber/jabber.c:1630 msgid "Tune Genre" -msgstr "" +msgstr "Sjanger" #: ../libpurple/protocols/jabber/jabber.c:1539 #: ../libpurple/protocols/jabber/jabber.c:1562 #: ../libpurple/protocols/jabber/jabber.c:1585 #: ../libpurple/protocols/jabber/jabber.c:1608 #: ../libpurple/protocols/jabber/jabber.c:1631 -#, fuzzy msgid "Tune Comment" -msgstr "Kommentar om kontakt:" +msgstr "Kommentar" #: ../libpurple/protocols/jabber/jabber.c:1540 #: ../libpurple/protocols/jabber/jabber.c:1563 @@ -5935,7 +5906,7 @@ #: ../libpurple/protocols/jabber/jabber.c:1609 #: ../libpurple/protocols/jabber/jabber.c:1632 msgid "Tune Track" -msgstr "" +msgstr "Spor" # #: ../libpurple/protocols/jabber/jabber.c:1541 @@ -5943,7 +5914,6 @@ #: ../libpurple/protocols/jabber/jabber.c:1587 #: ../libpurple/protocols/jabber/jabber.c:1610 #: ../libpurple/protocols/jabber/jabber.c:1633 -#, fuzzy msgid "Tune Time" msgstr "Tid" @@ -5953,7 +5923,7 @@ #: ../libpurple/protocols/jabber/jabber.c:1611 #: ../libpurple/protocols/jabber/jabber.c:1634 msgid "Tune Year" -msgstr "" +msgstr "År" #: ../libpurple/protocols/jabber/jabber.c:1543 #: ../libpurple/protocols/jabber/jabber.c:1566 @@ -5961,14 +5931,13 @@ #: ../libpurple/protocols/jabber/jabber.c:1612 #: ../libpurple/protocols/jabber/jabber.c:1635 msgid "Tune URL" -msgstr "" +msgstr "URL" #: ../libpurple/protocols/jabber/jabber.c:1545 #: ../libpurple/protocols/jabber/jabber.c:1568 #: ../libpurple/protocols/jabber/jabber.c:1591 #: ../libpurple/protocols/jabber/jabber.c:1614 #: ../libpurple/protocols/jabber/jabber.c:1637 -#, fuzzy msgid "Allow Buzz" msgstr "Tillat" @@ -5983,7 +5952,7 @@ #: ../libpurple/protocols/jabber/jabber.c:1670 #: ../libpurple/protocols/jabber/jabber.c:1671 msgid "Error changing password" -msgstr "Feil under endring av passord." +msgstr "Feil ved skifting av passord" #: ../libpurple/protocols/jabber/jabber.c:1728 msgid "Password (again)" @@ -5991,16 +5960,15 @@ #: ../libpurple/protocols/jabber/jabber.c:1734 #: ../libpurple/protocols/jabber/jabber.c:1735 -#, fuzzy msgid "Change XMPP Password" -msgstr "Bytt passord" +msgstr "Endre XMPP-passord" #: ../libpurple/protocols/jabber/jabber.c:1735 msgid "Please enter your new password" msgstr "Skriv inn ditt nye passord" #: ../libpurple/protocols/jabber/jabber.c:1749 -#: ../libpurple/protocols/oscar/oscar.c:6388 +#: ../libpurple/protocols/oscar/oscar.c:6386 #: ../libpurple/protocols/silc/silc.c:1093 #: ../libpurple/protocols/silc10/silc.c:1004 msgid "Set User Info..." @@ -6008,7 +5976,7 @@ #. if (js->protocol_options & CHANGE_PASSWORD) { #: ../libpurple/protocols/jabber/jabber.c:1754 -#: ../libpurple/protocols/oscar/oscar.c:6399 +#: ../libpurple/protocols/oscar/oscar.c:6397 #: ../libpurple/protocols/silc/silc.c:1089 #: ../libpurple/protocols/silc10/silc.c:1000 msgid "Change Password..." @@ -6017,9 +5985,8 @@ # #. } #: ../libpurple/protocols/jabber/jabber.c:1759 -#, fuzzy msgid "Search for Users..." -msgstr "_Søk etter:" +msgstr "Søk etter brukere..." #: ../libpurple/protocols/jabber/jabber.c:1845 msgid "Bad Request" @@ -6048,12 +6015,11 @@ #: ../libpurple/protocols/jabber/jabber.c:1857 msgid "Item Not Found" -msgstr "" +msgstr "Sak ikke funnet" #: ../libpurple/protocols/jabber/jabber.c:1859 -#, fuzzy msgid "Malformed XMPP ID" -msgstr "Ugyldig jabber-ID" +msgstr "Ugyldig XMPP-ID" #: ../libpurple/protocols/jabber/jabber.c:1861 msgid "Not Acceptable" @@ -6104,7 +6070,6 @@ msgstr "Godkjenning avbrutt" #: ../libpurple/protocols/jabber/jabber.c:1894 -#, fuzzy msgid "Incorrect encoding in authorization" msgstr "Feil koding i godkjenning" @@ -6228,24 +6193,24 @@ msgstr "Klarte ikke forby brukeren %s" #: ../libpurple/protocols/jabber/jabber.c:2072 -#, fuzzy, c-format +#, c-format msgid "Unknown affiliation: \"%s\"" -msgstr "Ukjent kommando: %s" +msgstr "Ukjent tilhørighet:\" %s\"" #: ../libpurple/protocols/jabber/jabber.c:2077 -#, fuzzy, c-format +#, c-format msgid "Unable to affiliate user %s as \"%s\"" -msgstr "Kunne ikke invitere bruker (%s)." +msgstr "Kunne ikke knytte til bruker %s som \"%s\"" #: ../libpurple/protocols/jabber/jabber.c:2096 -#, fuzzy, c-format +#, c-format msgid "Unknown role: \"%s\"" -msgstr "Ukjent kommando: %s" +msgstr "Ukjent rolle: \"%s\"" #: ../libpurple/protocols/jabber/jabber.c:2101 -#, fuzzy, c-format +#, c-format msgid "Unable to set role \"%s\" for user: %s" -msgstr "Kunne ikke sende beskjed: %s" +msgstr "Kunne ikke sette rolle \"%s\" for bruker: %s" #: ../libpurple/protocols/jabber/jabber.c:2154 #, c-format @@ -6261,82 +6226,90 @@ #: ../libpurple/protocols/jabber/jabber.c:2217 #, c-format msgid "Unable to buzz, because there is nothing known about user %s." -msgstr "" +msgstr "Kunne ikke vekke, fordi det er ingenting kjent med bruker %s." #: ../libpurple/protocols/jabber/jabber.c:2213 #, c-format msgid "Unable to buzz, because user %s might be offline." -msgstr "" +msgstr "Kunne ikke vekke, fordi bruker %s kan være avlogget." #: ../libpurple/protocols/jabber/jabber.c:2239 -#, fuzzy, c-format +#, c-format msgid "Unable to buzz, because the user %s does not support it." -msgstr "Kunne ikke spille av lyd fordi lydfilen (%s) ikke eksisterer." - -#: ../libpurple/protocols/jabber/jabber.c:2253 +msgstr "Kunne ikke vekke, fordi brukeren %s ikke støtter det." + +#: ../libpurple/protocols/jabber/jabber.c:2250 +#: ../libpurple/protocols/yahoo/yahoo.c:4118 +msgid "Buzz" +msgstr "Vekke" + +#: ../libpurple/protocols/jabber/jabber.c:2251 +#: ../libpurple/protocols/jabber/message.c:307 +#: ../libpurple/protocols/yahoo/yahoo.c:4119 +#, c-format +msgid "%s has buzzed you!" +msgstr "%s har buzzet deg!" + +#: ../libpurple/protocols/jabber/jabber.c:2252 +#: ../libpurple/protocols/yahoo/yahoo.c:4120 +#, c-format +msgid "Buzzing %s..." +msgstr "Vekker %s..." + +#: ../libpurple/protocols/jabber/jabber.c:2291 msgid "config: Configure a chat room." -msgstr "config: Endre innstillingene for et samtalerom" - -#: ../libpurple/protocols/jabber/jabber.c:2257 +msgstr "config: Endre innstillingene for et samtalerom." + +#: ../libpurple/protocols/jabber/jabber.c:2295 msgid "configure: Configure a chat room." -msgstr "configure: Endre innstillingene for et samtalerom" - -#: ../libpurple/protocols/jabber/jabber.c:2266 +msgstr "configure: Endre innstillingene for et samtalerom." + +#: ../libpurple/protocols/jabber/jabber.c:2304 msgid "part [room]: Leave the room." -msgstr "part [rom]: Forlat rommet" - -#: ../libpurple/protocols/jabber/jabber.c:2271 +msgstr "part [rom]: Forlat rommet." + +#: ../libpurple/protocols/jabber/jabber.c:2309 msgid "register: Register with a chat room." msgstr "register: Registrer med et gruppesamtalerom." -#: ../libpurple/protocols/jabber/jabber.c:2277 +#: ../libpurple/protocols/jabber/jabber.c:2315 msgid "topic [new topic]: View or change the topic." -msgstr "topic [nytt emne]: Vis eller endre emnet" - -#: ../libpurple/protocols/jabber/jabber.c:2283 +msgstr "topic [nytt emne]: Vis eller endre emnet." + +#: ../libpurple/protocols/jabber/jabber.c:2321 msgid "ban <user> [room]: Ban a user from the room." -msgstr "ban <bruker> [rom]: Forby en bruker fra rommet" - -#: ../libpurple/protocols/jabber/jabber.c:2289 -msgid "" -"affiliate <user> <owner|admin|member|outcast|none>: Set a user's " -"affiliation with the room." -msgstr "" - -#: ../libpurple/protocols/jabber/jabber.c:2295 -msgid "" -"role <user> <moderator|participant|visitor|none>: Set a user's " -"role in the room." -msgstr "" - -#: ../libpurple/protocols/jabber/jabber.c:2301 -#, fuzzy +msgstr "ban <bruker> [rom]: Forby en bruker fra rommet." + +#: ../libpurple/protocols/jabber/jabber.c:2327 +msgid "affiliate <user> <owner|admin|member|outcast|none>: Set a user's affiliation with the room." +msgstr "Knytt <bruker> <eier|admin|medlem|utstøtt|ingen>: Sett en brukers tilknyting til rommet." + +#: ../libpurple/protocols/jabber/jabber.c:2333 +msgid "role <user> <moderator|participant|visitor|none>: Set a user's role in the room." +msgstr "rolle <user> <moderator|deltaker|besøkende|ingen>: Sett en brukers rolle i rommet." + +#: ../libpurple/protocols/jabber/jabber.c:2339 msgid "invite <user> [message]: Invite a user to the room." -msgstr "invite <bruker> [rom]: Inviter en bruker til rommet" - -#: ../libpurple/protocols/jabber/jabber.c:2307 +msgstr "invite <bruker> [rom]: Inviter en bruker til rommet." + +#: ../libpurple/protocols/jabber/jabber.c:2345 msgid "join: <room> [server]: Join a chat on this server." -msgstr "" -"join: <rom> [vert]: Bli med i en gruppesamtale på denne serveren" - -#: ../libpurple/protocols/jabber/jabber.c:2313 +msgstr "join: <rom> [vert]: Bli med i en samtale på denne serveren." + +#: ../libpurple/protocols/jabber/jabber.c:2351 msgid "kick <user> [room]: Kick a user from the room." -msgstr "kick <bruker> [rom]: Spark en bruker ut av rommet" - -#: ../libpurple/protocols/jabber/jabber.c:2318 -msgid "" -"msg <user> <message>: Send a private message to another user." -msgstr "" -"msg <bruker> <melding>: Send en privatmelding til en annen " -"bruker" - -#: ../libpurple/protocols/jabber/jabber.c:2324 +msgstr "kick <bruker> [rom]: Spark en bruker ut av rommet." + +#: ../libpurple/protocols/jabber/jabber.c:2356 +msgid "msg <user> <message>: Send a private message to another user." +msgstr "msg <bruker> <melding>: Send en privatmelding til en annen bruker." + +#: ../libpurple/protocols/jabber/jabber.c:2362 msgid "ping <jid>:\tPing a user/component/server." -msgstr "" - -#: ../libpurple/protocols/jabber/jabber.c:2329 -#: ../libpurple/protocols/yahoo/yahoo.c:4145 -#, fuzzy +msgstr "ping <jid>:\tPing en bruker/komponent/server." + +#: ../libpurple/protocols/jabber/jabber.c:2367 +#: ../libpurple/protocols/yahoo/yahoo.c:4144 msgid "buzz: Buzz a user to get their attention" msgstr "buzz: Buzz en kontakt for å få deres oppmerksomhet" @@ -6352,52 +6325,49 @@ #. * description #: ../libpurple/protocols/jabber/libxmpp.c:170 #: ../libpurple/protocols/jabber/libxmpp.c:172 -#, fuzzy msgid "XMPP Protocol Plugin" -msgstr "MSN-protokolltillegg" +msgstr "XMPP-protokolltillegg" # #. Translators: 'domain' is used here in the context of Internet domains, e.g. pidgin.im -#: ../libpurple/protocols/jabber/libxmpp.c:202 ../pidgin/gtkaccount.c:506 -#, fuzzy +#: ../libpurple/protocols/jabber/libxmpp.c:202 +#: ../pidgin/gtkaccount.c:506 msgid "Domain" -msgstr "Rumensk" +msgstr "Domene" #: ../libpurple/protocols/jabber/libxmpp.c:210 -#, fuzzy msgid "Require SSL/TLS" -msgstr "Krev TLS" +msgstr "Krever SSL/TLS" #: ../libpurple/protocols/jabber/libxmpp.c:214 -#, fuzzy msgid "Force old (port 5223) SSL" -msgstr "Tving bruk av gammel SSL" +msgstr "Tving bruk av gammel SSL (port 5223)" #: ../libpurple/protocols/jabber/libxmpp.c:219 msgid "Allow plaintext auth over unencrypted streams" msgstr "Tillat identitetsbekreftelse i ren tekst over ukrypterte forbindelser" #: ../libpurple/protocols/jabber/libxmpp.c:224 -#: ../libpurple/protocols/myspace/myspace.c:3277 -#: ../libpurple/protocols/simple/simple.c:1902 -#, fuzzy +#: ../libpurple/protocols/myspace/myspace.c:3275 +#: ../libpurple/protocols/simple/simple.c:1904 msgid "Connect port" -msgstr "Koble til" +msgstr "Koble til port" #. TODO: default to automatically try different ports. Make the user be #. * able to set the first port to try (like LastConnectedPort in Windows client). #. Account options #: ../libpurple/protocols/jabber/libxmpp.c:228 -#: ../libpurple/protocols/myspace/myspace.c:3274 +#: ../libpurple/protocols/myspace/myspace.c:3272 #: ../libpurple/protocols/silc/silc.c:1914 -#: ../libpurple/protocols/silc10/silc.c:1857 ../pidgin/gtkaccount.c:837 +#: ../libpurple/protocols/silc10/silc.c:1857 +#: ../pidgin/gtkaccount.c:837 msgid "Connect server" msgstr "Koble til tjener" #: ../libpurple/protocols/jabber/message.c:106 -#, fuzzy, c-format +#, c-format msgid "%s has left the conversation." -msgstr "%s har blitt invitert til denne samtalen." +msgstr "%s har forlatt samtalen." #: ../libpurple/protocols/jabber/message.c:161 #, c-format @@ -6420,15 +6390,8 @@ msgstr "Beskjedlevering til %s feilet: %s" #: ../libpurple/protocols/jabber/message.c:278 -#, fuzzy msgid "XMPP Message Error" -msgstr "Jabber beskjedfeil" - -#: ../libpurple/protocols/jabber/message.c:307 -#: ../libpurple/protocols/yahoo/yahoo.c:4120 -#, fuzzy, c-format -msgid "%s has buzzed you!" -msgstr "Brukeren har blokkert deg" +msgstr "XMPP beskjedfeil" #: ../libpurple/protocols/jabber/message.c:407 #, c-format @@ -6439,39 +6402,33 @@ msgid "XML Parse error" msgstr "XML-parsefeil" -#: ../libpurple/protocols/jabber/presence.c:427 +#: ../libpurple/protocols/jabber/presence.c:422 msgid "Unknown Error in presence" msgstr "Ukjent feil i tilstedeværelse" -#: ../libpurple/protocols/jabber/presence.c:508 -#: ../libpurple/protocols/jabber/presence.c:509 +#: ../libpurple/protocols/jabber/presence.c:503 +#: ../libpurple/protocols/jabber/presence.c:504 msgid "Create New Room" msgstr "Skap nytt samtalerom" -#: ../libpurple/protocols/jabber/presence.c:510 -msgid "" -"You are creating a new room. Would you like to configure it, or accept the " -"default settings?" -msgstr "" -"Du er i ferd med å lage et nytt rom. Ønsker du å endre innstillingene, eller " -"bruke standardinnstillingene?" - -#: ../libpurple/protocols/jabber/presence.c:516 -#, fuzzy +#: ../libpurple/protocols/jabber/presence.c:505 +msgid "You are creating a new room. Would you like to configure it, or accept the default settings?" +msgstr "Du er i ferd med å lage et nytt rom. Ønsker du å endre innstillingene, eller bruke standardinnstillingene?" + +#: ../libpurple/protocols/jabber/presence.c:511 msgid "_Configure Room" -msgstr "Konfigurer rom" - -#: ../libpurple/protocols/jabber/presence.c:517 -#, fuzzy +msgstr "_Konfigurer rom" + +#: ../libpurple/protocols/jabber/presence.c:512 msgid "_Accept Defaults" -msgstr "Aksepter standardinstillinger" - -#: ../libpurple/protocols/jabber/presence.c:559 +msgstr "_Aksepter standardinstillinger" + +#: ../libpurple/protocols/jabber/presence.c:554 #, c-format msgid "Error in chat %s" msgstr "Feil i gruppesamtale %s" -#: ../libpurple/protocols/jabber/presence.c:563 +#: ../libpurple/protocols/jabber/presence.c:558 #, c-format msgid "Error joining chat %s" msgstr "Klarte ikke bli med i gruppesamtale %s" @@ -6488,14 +6445,14 @@ msgstr "Filsending feilet" #: ../libpurple/protocols/jabber/si.c:838 -#, fuzzy, c-format +#, c-format msgid "Unable to send file to %s, invalid JID" -msgstr "Kunne ikke sende beskjed til %s." +msgstr "Kunne ikke sende fil til %s, ugyldig JID" #: ../libpurple/protocols/jabber/si.c:840 -#, fuzzy, c-format +#, c-format msgid "Unable to send file to %s, user is not online" -msgstr "Klarte ikke sende fil til %s - brukeren støtter ikke filoverføringer" +msgstr "Klarte ikke sende fil til %s, brukeren er ikke pålogget" #: ../libpurple/protocols/jabber/si.c:842 #, fuzzy, c-format @@ -6505,7 +6462,7 @@ #: ../libpurple/protocols/jabber/si.c:857 #, c-format msgid "Please select which resource of %s you would like to send a file to" -msgstr "" +msgstr "Vennligst velg hvilken ressurs av %s du vil sende en fil til" #: ../libpurple/protocols/jabber/si.c:873 #, fuzzy @@ -6520,39 +6477,32 @@ #: ../libpurple/protocols/jabber/usermood.c:181 msgid "Please select your mood from the list." -msgstr "" +msgstr "Vennligst velg din stemning fra listen." #: ../libpurple/protocols/jabber/usermood.c:183 #: ../libpurple/protocols/jabber/usernick.c:78 -#, fuzzy msgid "Set" -msgstr "_Sett" +msgstr "Sett" #: ../libpurple/protocols/jabber/usermood.c:191 -#, fuzzy msgid "Set Mood..." -msgstr "Lagre fil..." - -#: ../libpurple/protocols/jabber/usernick.c:76 -#, fuzzy -msgid "Set User Nickname" -msgstr "Sett brukergrense" +msgstr "Sett Sinnstemning..." #: ../libpurple/protocols/jabber/usernick.c:76 -#, fuzzy +msgid "Set User Nickname" +msgstr "Sett Brukers Skjermnavn" + +#: ../libpurple/protocols/jabber/usernick.c:76 msgid "Please specify a new nickname for you." -msgstr "Vennligst skriv inn nytt navn for gruppen." +msgstr "Vennligst spesifiser et nytt skjermnavn for deg." #: ../libpurple/protocols/jabber/usernick.c:77 -msgid "" -"This information is visible to all contacts on your contact list, so choose " -"something appropriate." -msgstr "" - -#: ../libpurple/protocols/jabber/usernick.c:99 -#, fuzzy +msgid "This information is visible to all contacts on your contact list, so choose something appropriate." +msgstr "Denne informasjonen vises til alle dine kontakter i kontaktlisten din, så velg noe passende." + +#: ../libpurple/protocols/jabber/usernick.c:100 msgid "Set Nickname..." -msgstr "Kallenavn" +msgstr "Sett Nick..." #: ../libpurple/protocols/jabber/xdata.c:378 #, fuzzy @@ -6564,265 +6514,221 @@ msgid "Select an action" msgstr "Velg fil" -#: ../libpurple/protocols/msn/dialog.c:110 +#: ../libpurple/protocols/msn/contact.c:207 +msgid "Unable to connect to contact server" +msgstr "Kan ikke koble til tjener" + +#: ../libpurple/protocols/msn/contact.c:954 +#, fuzzy +msgid "Unable to retrieve MSN Address Book" +msgstr "Legg til i adresseboka" + +#: ../libpurple/protocols/msn/dialog.c:118 #, c-format msgid "Buddy list synchronization issue in %s (%s)" -msgstr "Synkronisasjonsproblem med vennelista i %s (%s)" - -#: ../libpurple/protocols/msn/dialog.c:116 -#, c-format -msgid "" -"%s on the local list is inside the group \"%s\" but not on the server list. " -"Do you want this buddy to be added?" -msgstr "" -"%s er på den lokale lista innenfor gruppa \"%s\", men ikke på tjenerlista. " -"Ønsker du at denne kontakten skal bli lagt til?" +msgstr "Synkronisasjonsproblem med kontaktlisten i %s (%s)" #: ../libpurple/protocols/msn/dialog.c:124 #, c-format -msgid "" -"%s is on the local list but not on the server list. Do you want this buddy " -"to be added?" -msgstr "" -"%s er på den lokale lista, men ikke på tjenerlista. Ønsker du at denne " -"kontakten skal bli lagt til?" +msgid "%s on the local list is inside the group \"%s\" but not on the server list. Do you want this buddy to be added?" +msgstr "%s er på den lokale lista innenfor gruppa \"%s\", men ikke på tjenerlista. Ønsker du at denne kontakten skal bli lagt til?" + +#: ../libpurple/protocols/msn/dialog.c:132 +#, c-format +msgid "%s is on the local list but not on the server list. Do you want this buddy to be added?" +msgstr "%s er på den lokale lista, men ikke på tjenerlista. Ønsker du at denne kontakten skal bli lagt til?" #: ../libpurple/protocols/msn/error.c:36 -#, c-format msgid "Unable to parse message" -msgstr "Kunne ikke tolke beskjed." +msgstr "Kunne ikke tolke beskjed" #: ../libpurple/protocols/msn/error.c:41 -#, fuzzy, c-format msgid "Syntax Error (probably a client bug)" -msgstr "Syntaksfeil (sannsynligvis en Gaim-bug)" +msgstr "Syntaksfeil (sannsynligvis en Pidgin-bug)" #: ../libpurple/protocols/msn/error.c:46 -#, c-format msgid "Invalid e-mail address" msgstr "Ugyldig epostadresse" #: ../libpurple/protocols/msn/error.c:49 -#, c-format msgid "User does not exist" msgstr "Brukeren eksisterer ikke" #: ../libpurple/protocols/msn/error.c:53 -#, fuzzy, c-format msgid "Fully qualified domain name missing" msgstr "Fullstending domenenavn mangler" #: ../libpurple/protocols/msn/error.c:56 -#, fuzzy, c-format msgid "Already logged in" msgstr "Allerede logget inn" #: ../libpurple/protocols/msn/error.c:59 -#, fuzzy, c-format msgid "Invalid screen name" msgstr "Ugyldig brukernavn" #: ../libpurple/protocols/msn/error.c:62 -#, fuzzy, c-format msgid "Invalid friendly name" msgstr "Ugyldig kallenavn" #: ../libpurple/protocols/msn/error.c:65 -#, fuzzy, c-format msgid "List full" msgstr "Listen er full" #: ../libpurple/protocols/msn/error.c:68 -#, c-format msgid "Already there" msgstr "Du er allerede der" #: ../libpurple/protocols/msn/error.c:72 -#, c-format msgid "Not on list" msgstr "Ikke på listen" #: ../libpurple/protocols/msn/error.c:75 #: ../libpurple/protocols/zephyr/zephyr.c:756 -#, c-format msgid "User is offline" msgstr "Brukeren er avlogget" #: ../libpurple/protocols/msn/error.c:78 -#, c-format msgid "Already in the mode" msgstr "Du er allerede i modusen" #: ../libpurple/protocols/msn/error.c:82 -#, c-format msgid "Already in opposite list" msgstr "Du er allerede i den andre listen" #: ../libpurple/protocols/msn/error.c:86 -#, c-format msgid "Too many groups" msgstr "For mange grupper" #: ../libpurple/protocols/msn/error.c:89 -#, c-format msgid "Invalid group" msgstr "Ugyldig gruppe" #: ../libpurple/protocols/msn/error.c:92 -#, c-format msgid "User not in group" msgstr "Brukeren er ikke i gruppen" #: ../libpurple/protocols/msn/error.c:95 -#, c-format msgid "Group name too long" msgstr "Gruppenavnet er for langt" #: ../libpurple/protocols/msn/error.c:98 -#, c-format msgid "Cannot remove group zero" msgstr "Kan ikke fjerne gruppe null" #: ../libpurple/protocols/msn/error.c:103 -#, fuzzy, c-format msgid "Tried to add a user to a group that doesn't exist" msgstr "Prøvde å legge en kontakt til i en ikke-eksisterende gruppe" #: ../libpurple/protocols/msn/error.c:107 -#, c-format msgid "Switchboard failed" msgstr "Feil med switchboard-tjenesten" #: ../libpurple/protocols/msn/error.c:111 -#, fuzzy, c-format +#, fuzzy msgid "Notify transfer failed" msgstr "Overføring av varsling feilet" #: ../libpurple/protocols/msn/error.c:116 -#, c-format msgid "Required fields missing" msgstr "Du har ikke fylt inn alle nødvendige felt" #: ../libpurple/protocols/msn/error.c:120 -#, c-format msgid "Too many hits to a FND" msgstr "For mange treff på en FND" #: ../libpurple/protocols/msn/error.c:124 #: ../libpurple/protocols/oscar/oscar.c:120 -#, c-format msgid "Not logged in" msgstr "Ikke pålogget" #: ../libpurple/protocols/msn/error.c:128 -#, fuzzy, c-format msgid "Service temporarily unavailable" -msgstr "Tjenesten midlertidig uttilgjengelig" +msgstr "Tjenesten midlertidig utilgjengelig" #: ../libpurple/protocols/msn/error.c:131 -#, c-format msgid "Database server error" msgstr "Feil på databasetjeneren" #: ../libpurple/protocols/msn/error.c:135 -#, c-format msgid "Command disabled" msgstr "Kommando deaktivert" #: ../libpurple/protocols/msn/error.c:139 -#, c-format msgid "File operation error" msgstr "Filoperasjonsfeil" #: ../libpurple/protocols/msn/error.c:143 -#, c-format msgid "Memory allocation error" msgstr "Feil ved minneallokering" #: ../libpurple/protocols/msn/error.c:147 -#, c-format msgid "Wrong CHL value sent to server" msgstr "Feil CHL-verdi sendt til tjener" #: ../libpurple/protocols/msn/error.c:152 -#, c-format msgid "Server busy" msgstr "Tjeneren er opptatt" #: ../libpurple/protocols/msn/error.c:155 #: ../libpurple/protocols/msn/error.c:170 #: ../libpurple/protocols/msn/error.c:230 -#, c-format msgid "Server unavailable" msgstr "Tjeneren er ikke tilgjengelig" #: ../libpurple/protocols/msn/error.c:158 -#, fuzzy, c-format +#, fuzzy msgid "Peer notification server down" msgstr "Varslingstjeneren er ikke tilgjengelig" #: ../libpurple/protocols/msn/error.c:162 -#, c-format msgid "Database connect error" msgstr "Kunne ikke koble til databasen" #: ../libpurple/protocols/msn/error.c:167 -#, c-format msgid "Server is going down (abandon ship)" msgstr "Tjeneren er på vei nei (redde seg den som kan)" #: ../libpurple/protocols/msn/error.c:174 -#, c-format msgid "Error creating connection" msgstr "Feil: kunne ikke koble til" #: ../libpurple/protocols/msn/error.c:179 -#, c-format msgid "CVR parameters are either unknown or not allowed" msgstr "CVR-parametre er enten ukjent eller ikke tillatt" #: ../libpurple/protocols/msn/error.c:183 -#, c-format msgid "Unable to write" msgstr "Kunne ikke skrive" #: ../libpurple/protocols/msn/error.c:186 -#, c-format msgid "Session overload" msgstr "Sesjonsoverlast" #: ../libpurple/protocols/msn/error.c:190 -#, c-format msgid "User is too active" msgstr "Brukeren er for aktiv" #: ../libpurple/protocols/msn/error.c:193 -#, c-format msgid "Too many sessions" msgstr "For mange sesjoner" #: ../libpurple/protocols/msn/error.c:196 -#, c-format msgid "Passport not verified" msgstr "Passport-konto er ikke blitt verifisert" #: ../libpurple/protocols/msn/error.c:199 -#, c-format msgid "Bad friend file" msgstr "Ugyldig 'friend'-fil" #: ../libpurple/protocols/msn/error.c:203 -#, c-format msgid "Not expected" msgstr "Uventet" #: ../libpurple/protocols/msn/error.c:209 -#, c-format msgid "Friendly name changes too rapidly" msgstr "Visningsnavnet endres for raskt" #: ../libpurple/protocols/msn/error.c:218 -#, c-format msgid "Server too busy" msgstr "Tjeneren er for opptatt" @@ -6830,33 +6736,28 @@ #: ../libpurple/protocols/oscar/oscar.c:1380 #: ../libpurple/protocols/silc/silc.c:233 #: ../libpurple/protocols/silc10/ops.c:1709 -#: ../libpurple/protocols/toc/toc.c:728 ../libpurple/proxy.c:1380 -#, c-format +#: ../libpurple/protocols/toc/toc.c:728 +#: ../libpurple/proxy.c:1380 msgid "Authentication failed" msgstr "Autentisering feilet" #: ../libpurple/protocols/msn/error.c:225 -#, c-format msgid "Not allowed when offline" msgstr "Ikke tillatt når avlogget" #: ../libpurple/protocols/msn/error.c:233 -#, c-format msgid "Not accepting new users" msgstr "Nye brukere vil ikke bli godtatt" #: ../libpurple/protocols/msn/error.c:237 -#, c-format msgid "Kids Passport without parental consent" msgstr "Passport for barn, men har ikke foreldregodkjenning" #: ../libpurple/protocols/msn/error.c:241 -#, c-format msgid "Passport account not yet verified" msgstr "Passport-konto er ikke blitt verifisert enda" #: ../libpurple/protocols/msn/error.c:244 -#, c-format msgid "Bad ticket" msgstr "Bad ticket" @@ -6872,417 +6773,391 @@ #: ../libpurple/protocols/msn/msn.c:130 msgid "Nudge" -msgstr "" +msgstr "Nudge" #: ../libpurple/protocols/msn/msn.c:131 -#, fuzzy, c-format +#, c-format msgid "%s has nudged you!" -msgstr "%s er borte." +msgstr "%s har nudga deg!" #: ../libpurple/protocols/msn/msn.c:132 #, c-format msgid "Nudging %s..." -msgstr "" +msgstr "Nudging %s..." #: ../libpurple/protocols/msn/msn.c:174 msgid "Your new MSN friendly name is too long." msgstr "Det nye MSN-kallenavnet er for langt." -#: ../libpurple/protocols/msn/msn.c:282 +#: ../libpurple/protocols/msn/msn.c:285 msgid "Set your friendly name." msgstr "Sett kallenavn." -#: ../libpurple/protocols/msn/msn.c:283 +#: ../libpurple/protocols/msn/msn.c:286 msgid "This is the name that other MSN buddies will see you as." msgstr "Dette er navnet som andre MSN-kompiser vil se deg som." -#: ../libpurple/protocols/msn/msn.c:301 +#: ../libpurple/protocols/msn/msn.c:304 msgid "Set your home phone number." msgstr "Sett telefonnummer (hjemme)." -#: ../libpurple/protocols/msn/msn.c:318 +#: ../libpurple/protocols/msn/msn.c:321 msgid "Set your work phone number." msgstr "Sett telefonnummer (arbeid)." -#: ../libpurple/protocols/msn/msn.c:335 +#: ../libpurple/protocols/msn/msn.c:338 msgid "Set your mobile phone number." -msgstr "Sett mobiltelefonnummer" - -#: ../libpurple/protocols/msn/msn.c:350 +msgstr "Sett ditt mobiltelefonnummer." + +#: ../libpurple/protocols/msn/msn.c:353 msgid "Allow MSN Mobile pages?" -msgstr "Tillat tekstmeldinger via MSN" - -#: ../libpurple/protocols/msn/msn.c:351 -msgid "" -"Do you want to allow or disallow people on your buddy list to send you MSN " -"Mobile pages to your cell phone or other mobile device?" -msgstr "" -"Ønsker du å tillate eller forby kontakter å sende deg tekstmeldinger via MSN?" - -#: ../libpurple/protocols/msn/msn.c:357 +msgstr "Tillat tekstmeldinger via MSN?" + +#: ../libpurple/protocols/msn/msn.c:354 +msgid "Do you want to allow or disallow people on your buddy list to send you MSN Mobile pages to your cell phone or other mobile device?" +msgstr "Ønsker du å tillate eller forby kontakter å sende deg tekstmeldinger via MSN?" + +#: ../libpurple/protocols/msn/msn.c:360 msgid "Allow" msgstr "Tillat" -#: ../libpurple/protocols/msn/msn.c:358 +#: ../libpurple/protocols/msn/msn.c:361 msgid "Disallow" msgstr "Forby" -#: ../libpurple/protocols/msn/msn.c:374 +#: ../libpurple/protocols/msn/msn.c:377 msgid "This Hotmail account may not be active." msgstr "Det kan hende denne Hotmail kontoen ikke er aktiv." -#: ../libpurple/protocols/msn/msn.c:400 +#: ../libpurple/protocols/msn/msn.c:403 msgid "Send a mobile message." -msgstr "Send tekstmelding" - -#: ../libpurple/protocols/msn/msn.c:402 +msgstr "Send tekstmelding." + +#: ../libpurple/protocols/msn/msn.c:405 msgid "Page" msgstr "Send" -#: ../libpurple/protocols/msn/msn.c:549 -#, fuzzy -msgid "Has you" -msgstr "Har deg" - -#: ../libpurple/protocols/msn/msn.c:579 ../libpurple/protocols/msn/state.c:33 -#: ../libpurple/protocols/yahoo/yahoo.c:3077 -#: ../libpurple/protocols/yahoo/yahoo.c:3761 +#: ../libpurple/protocols/msn/msn.c:610 +#: ../libpurple/protocols/msn/msn.c:635 +#: ../libpurple/protocols/msn/msn.c:642 +#: ../libpurple/protocols/msn/msn.c:649 +#: ../libpurple/protocols/msn/msn.c:656 +#: ../libpurple/protocols/msn/msn.c:662 +#: ../libpurple/protocols/msn/msn.c:668 +msgid "Current media" +msgstr "Gjeldende media" + +#: ../libpurple/protocols/msn/msn.c:647 +#: ../libpurple/protocols/msn/state.c:33 +#: ../libpurple/protocols/yahoo/yahoo.c:3076 +#: ../libpurple/protocols/yahoo/yahoo.c:3760 msgid "Be Right Back" msgstr "Straks tilbake" -#: ../libpurple/protocols/msn/msn.c:583 ../libpurple/protocols/msn/state.c:31 -#: ../libpurple/protocols/novell/novell.c:2822 -#: ../libpurple/protocols/novell/novell.c:2952 +#: ../libpurple/protocols/msn/msn.c:654 +#: ../libpurple/protocols/msn/state.c:31 +#: ../libpurple/protocols/novell/novell.c:2827 +#: ../libpurple/protocols/novell/novell.c:2957 #: ../libpurple/protocols/silc/buddy.c:1480 #: ../libpurple/protocols/silc/silc.c:56 #: ../libpurple/protocols/silc10/buddy.c:1480 #: ../libpurple/protocols/silc10/silc.c:47 -#: ../libpurple/protocols/yahoo/yahoo.c:3079 -#: ../libpurple/protocols/yahoo/yahoo.c:3764 +#: ../libpurple/protocols/yahoo/yahoo.c:3078 +#: ../libpurple/protocols/yahoo/yahoo.c:3763 msgid "Busy" msgstr "Opptatt" -#: ../libpurple/protocols/msn/msn.c:587 -#: ../libpurple/protocols/yahoo/yahoo.c:3087 -#: ../libpurple/protocols/yahoo/yahoo.c:3776 -#, fuzzy +#: ../libpurple/protocols/msn/msn.c:660 +#: ../libpurple/protocols/yahoo/yahoo.c:3086 +#: ../libpurple/protocols/yahoo/yahoo.c:3775 msgid "On the Phone" msgstr "I telefonen" -#: ../libpurple/protocols/msn/msn.c:591 -#: ../libpurple/protocols/yahoo/yahoo.c:3091 -#: ../libpurple/protocols/yahoo/yahoo.c:3782 -#, fuzzy +#: ../libpurple/protocols/msn/msn.c:666 +#: ../libpurple/protocols/yahoo/yahoo.c:3090 +#: ../libpurple/protocols/yahoo/yahoo.c:3781 msgid "Out to Lunch" msgstr "Ute til lunsj" -#: ../libpurple/protocols/msn/msn.c:619 -#, fuzzy +#: ../libpurple/protocols/msn/msn.c:697 msgid "Set Friendly Name..." -msgstr "Sett kallenavn" - -#: ../libpurple/protocols/msn/msn.c:624 -#, fuzzy +msgstr "Sett kallenavn..." + +#: ../libpurple/protocols/msn/msn.c:702 msgid "Set Home Phone Number..." -msgstr "Sett telefonnummer (hjemme)" - -#: ../libpurple/protocols/msn/msn.c:628 -#, fuzzy +msgstr "Sett telefonnummer (hjemme)..." + +#: ../libpurple/protocols/msn/msn.c:706 msgid "Set Work Phone Number..." -msgstr "Sett telefonnummer (arbeid)" - -#: ../libpurple/protocols/msn/msn.c:632 -#, fuzzy +msgstr "Sett telefonnummer (arbeid)..." + +#: ../libpurple/protocols/msn/msn.c:710 msgid "Set Mobile Phone Number..." -msgstr "Sett mobiltelefonnummer" - -#: ../libpurple/protocols/msn/msn.c:638 -#, fuzzy +msgstr "Sett telefonnummer (mobil)..." + +#: ../libpurple/protocols/msn/msn.c:716 msgid "Enable/Disable Mobile Devices..." -msgstr "Bruk/ikke bruk mobile enheter" - -#: ../libpurple/protocols/msn/msn.c:643 -#, fuzzy +msgstr "Bruk/ikke bruk mobile enheter..." + +#: ../libpurple/protocols/msn/msn.c:721 msgid "Allow/Disallow Mobile Pages..." -msgstr "Tillate/forby tekstmeldinger" - -#: ../libpurple/protocols/msn/msn.c:654 +msgstr "Tillate/forby tekstmeldinger..." + +#: ../libpurple/protocols/msn/msn.c:732 msgid "Open Hotmail Inbox" msgstr "Åpne Hotmail Inbox" -#: ../libpurple/protocols/msn/msn.c:678 +#: ../libpurple/protocols/msn/msn.c:756 msgid "Send to Mobile" msgstr "Send til mobil" -#: ../libpurple/protocols/msn/msn.c:688 -#: ../libpurple/protocols/novell/novell.c:3408 +#: ../libpurple/protocols/msn/msn.c:766 +#: ../libpurple/protocols/novell/novell.c:3413 msgid "Initiate _Chat" msgstr "Start gruppesamtale" -#: ../libpurple/protocols/msn/msn.c:726 -#, fuzzy +#: ../libpurple/protocols/msn/msn.c:804 msgid "SSL support is needed for MSN. Please install a supported SSL library." -msgstr "" -"SSL-støtte kreves for MSN, vennligst installer et støttet SSL-bibliotek. Se " -"http://gaim.sf.net/faq-ssl.php for mer informasjon." - -#: ../libpurple/protocols/msn/msn.c:754 +msgstr "SSL-støtte kreves for MSN. Vennligst installer et støttet SSL-bibliotek." + +#: ../libpurple/protocols/msn/msn.c:832 msgid "Failed to connect to server." msgstr "Klarte ikke koble til tjener." -#: ../libpurple/protocols/msn/msn.c:1510 ../libpurple/protocols/msn/msn.c:1858 +#: ../libpurple/protocols/msn/msn.c:1620 +#: ../libpurple/protocols/msn/msn.c:1968 #: ../libpurple/protocols/yahoo/yahoo_profile.c:808 msgid "Error retrieving profile" msgstr "Klarte ikke hente profil" -#: ../libpurple/protocols/msn/msn.c:1581 ../pidgin/plugins/convcolors.c:309 -#: ../pidgin/plugins/pidginrc.c:366 -#, fuzzy +#: ../libpurple/protocols/msn/msn.c:1691 +#: ../pidgin/plugins/convcolors.c:309 +#: ../pidgin/plugins/pidginrc.c:360 msgid "General" -msgstr "Kjønn" - -#: ../libpurple/protocols/msn/msn.c:1588 +msgstr "Generellt " + +#: ../libpurple/protocols/msn/msn.c:1698 #: ../libpurple/protocols/myspace/user.c:110 -#: ../libpurple/protocols/oscar/oscar.c:3755 +#: ../libpurple/protocols/oscar/oscar.c:3751 #: ../libpurple/protocols/qq/buddy_info.c:45 #: ../libpurple/protocols/qq/qq.c:221 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1081 msgid "Age" msgstr "Alder" -#: ../libpurple/protocols/msn/msn.c:1590 +#: ../libpurple/protocols/msn/msn.c:1700 #: ../libpurple/protocols/qq/buddy_info.c:51 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1096 msgid "Occupation" msgstr "Yrke" -#: ../libpurple/protocols/msn/msn.c:1591 +#: ../libpurple/protocols/msn/msn.c:1701 #: ../libpurple/protocols/myspace/user.c:119 -#: ../libpurple/protocols/novell/novell.c:1478 +#: ../libpurple/protocols/novell/novell.c:1480 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1076 #: ../libpurple/protocols/zephyr/zephyr.c:798 #: ../libpurple/protocols/zephyr/zephyr.c:1215 msgid "Location" msgstr "Sted" -#: ../libpurple/protocols/msn/msn.c:1596 ../libpurple/protocols/msn/msn.c:1788 -#: ../libpurple/protocols/msn/msn.c:1794 ../libpurple/protocols/msn/msn.c:1801 +#: ../libpurple/protocols/msn/msn.c:1706 +#: ../libpurple/protocols/msn/msn.c:1898 +#: ../libpurple/protocols/msn/msn.c:1904 +#: ../libpurple/protocols/msn/msn.c:1911 msgid "Hobbies and Interests" msgstr "Hobbyer og interesser" -#: ../libpurple/protocols/msn/msn.c:1602 ../libpurple/protocols/msn/msn.c:1722 -#: ../libpurple/protocols/msn/msn.c:1728 ../libpurple/protocols/msn/msn.c:1735 -#: ../libpurple/protocols/msn/msn.c:1743 ../libpurple/protocols/msn/msn.c:1750 +#: ../libpurple/protocols/msn/msn.c:1712 +#: ../libpurple/protocols/msn/msn.c:1832 +#: ../libpurple/protocols/msn/msn.c:1838 +#: ../libpurple/protocols/msn/msn.c:1845 +#: ../libpurple/protocols/msn/msn.c:1853 +#: ../libpurple/protocols/msn/msn.c:1860 msgid "A Little About Me" msgstr "Noen ord om meg" -#: ../libpurple/protocols/msn/msn.c:1619 +#: ../libpurple/protocols/msn/msn.c:1729 msgid "Social" -msgstr "" - -#: ../libpurple/protocols/msn/msn.c:1621 +msgstr "Sosial" + +#: ../libpurple/protocols/msn/msn.c:1731 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1086 msgid "Marital Status" msgstr "Sivilstatus" -#: ../libpurple/protocols/msn/msn.c:1622 -#, fuzzy +#: ../libpurple/protocols/msn/msn.c:1732 msgid "Interests" -msgstr "Sett _inn" - -#: ../libpurple/protocols/msn/msn.c:1623 -#, fuzzy +msgstr "Interesser" + +#: ../libpurple/protocols/msn/msn.c:1733 msgid "Pets" -msgstr "Porter" - -#: ../libpurple/protocols/msn/msn.c:1624 -#, fuzzy +msgstr "Dyr" + +#: ../libpurple/protocols/msn/msn.c:1734 msgid "Hometown" -msgstr "Maskin ukjent" - -#: ../libpurple/protocols/msn/msn.c:1625 +msgstr "Hjemby" + +#: ../libpurple/protocols/msn/msn.c:1735 msgid "Places Lived" -msgstr "" - -#: ../libpurple/protocols/msn/msn.c:1626 +msgstr "Steder du har bodd" + +#: ../libpurple/protocols/msn/msn.c:1736 msgid "Fashion" -msgstr "" - -#: ../libpurple/protocols/msn/msn.c:1627 +msgstr "Mote" + +#: ../libpurple/protocols/msn/msn.c:1737 msgid "Humor" -msgstr "" - -#: ../libpurple/protocols/msn/msn.c:1628 +msgstr "Humor" + +#: ../libpurple/protocols/msn/msn.c:1738 msgid "Music" -msgstr "" - -#: ../libpurple/protocols/msn/msn.c:1629 ../libpurple/protocols/msn/msn.c:1810 -#: ../libpurple/protocols/msn/msn.c:1816 +msgstr "Musikk" + +#: ../libpurple/protocols/msn/msn.c:1739 +#: ../libpurple/protocols/msn/msn.c:1920 +#: ../libpurple/protocols/msn/msn.c:1926 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1138 msgid "Favorite Quote" msgstr "Yndlingssitat" -#: ../libpurple/protocols/msn/msn.c:1646 -#, fuzzy +#: ../libpurple/protocols/msn/msn.c:1756 msgid "Contact Info" -msgstr "Kontoinformasjon" - -#: ../libpurple/protocols/msn/msn.c:1647 -#, fuzzy +msgstr "Kontaktinformasjon" + +#: ../libpurple/protocols/msn/msn.c:1757 msgid "Personal" -msgstr "Tittel" - -#: ../libpurple/protocols/msn/msn.c:1650 +msgstr "Personlig" + +#: ../libpurple/protocols/msn/msn.c:1760 msgid "Significant Other" -msgstr "" - -#: ../libpurple/protocols/msn/msn.c:1651 -#, fuzzy +msgstr "Annet Spesielt" + +#: ../libpurple/protocols/msn/msn.c:1761 msgid "Home Phone" -msgstr "Hjemmeside" - -#: ../libpurple/protocols/msn/msn.c:1652 -#, fuzzy +msgstr "Hjemmetelefon" + +#: ../libpurple/protocols/msn/msn.c:1762 msgid "Home Phone 2" -msgstr "Sett telefonnummer (hjemme)" - -#: ../libpurple/protocols/msn/msn.c:1653 -#: ../libpurple/protocols/oscar/oscar.c:3793 +msgstr "Hjemmetelefon 2" + +#: ../libpurple/protocols/msn/msn.c:1763 +#: ../libpurple/protocols/oscar/oscar.c:3789 msgid "Home Address" msgstr "Hjemstedsadresse" -#: ../libpurple/protocols/msn/msn.c:1654 -#, fuzzy +#: ../libpurple/protocols/msn/msn.c:1764 msgid "Personal Mobile" -msgstr "Tittel" - -#: ../libpurple/protocols/msn/msn.c:1655 -#, fuzzy +msgstr "Mobil" + +#: ../libpurple/protocols/msn/msn.c:1765 msgid "Home Fax" -msgstr "Hjemmeside" - -#: ../libpurple/protocols/msn/msn.c:1656 -#, fuzzy +msgstr "Fax" + +#: ../libpurple/protocols/msn/msn.c:1766 msgid "Personal E-Mail" -msgstr "Tittel" - -#: ../libpurple/protocols/msn/msn.c:1657 -#, fuzzy +msgstr "E-post" + +#: ../libpurple/protocols/msn/msn.c:1767 msgid "Personal IM" -msgstr "Tittel" - -#: ../libpurple/protocols/msn/msn.c:1659 +msgstr "Lynmelding" + +#: ../libpurple/protocols/msn/msn.c:1769 msgid "Anniversary" -msgstr "" +msgstr "Bursdag" #. Business -#: ../libpurple/protocols/msn/msn.c:1675 +#: ../libpurple/protocols/msn/msn.c:1785 msgid "Work" -msgstr "" - -#: ../libpurple/protocols/msn/msn.c:1677 +msgstr "Arbeid" + +#: ../libpurple/protocols/msn/msn.c:1787 #: ../libpurple/protocols/silc/ops.c:1010 #: ../libpurple/protocols/silc10/ops.c:1044 msgid "Job Title" msgstr "Tittel" -#: ../libpurple/protocols/msn/msn.c:1678 -#: ../libpurple/protocols/oscar/oscar.c:3814 +#: ../libpurple/protocols/msn/msn.c:1788 +#: ../libpurple/protocols/oscar/oscar.c:3810 msgid "Company" msgstr "Firma" -#: ../libpurple/protocols/msn/msn.c:1679 -#: ../libpurple/protocols/novell/novell.c:1480 +#: ../libpurple/protocols/msn/msn.c:1789 +#: ../libpurple/protocols/novell/novell.c:1482 msgid "Department" msgstr "Avdeling" -#: ../libpurple/protocols/msn/msn.c:1680 -#, fuzzy +#: ../libpurple/protocols/msn/msn.c:1790 msgid "Profession" -msgstr "Framdrift" - -#: ../libpurple/protocols/msn/msn.c:1681 -#, fuzzy +msgstr "Yrke" + +#: ../libpurple/protocols/msn/msn.c:1791 msgid "Work Phone" -msgstr "Telefon" - -#: ../libpurple/protocols/msn/msn.c:1682 -#, fuzzy +msgstr "Arbeids Telefon" + +#: ../libpurple/protocols/msn/msn.c:1792 msgid "Work Phone 2" -msgstr "Sett telefonnummer (arbeid)" - -#: ../libpurple/protocols/msn/msn.c:1683 -#: ../libpurple/protocols/oscar/oscar.c:3806 +msgstr "Arbeids Telefon 2" + +#: ../libpurple/protocols/msn/msn.c:1793 +#: ../libpurple/protocols/oscar/oscar.c:3802 msgid "Work Address" msgstr "Arbeidsadresse" -#: ../libpurple/protocols/msn/msn.c:1684 -#, fuzzy +#: ../libpurple/protocols/msn/msn.c:1794 msgid "Work Mobile" -msgstr "Send til mobil" - -#: ../libpurple/protocols/msn/msn.c:1685 -#, fuzzy +msgstr "Mobil Jobb" + +#: ../libpurple/protocols/msn/msn.c:1795 msgid "Work Pager" -msgstr "Hjemmeside" - -#: ../libpurple/protocols/msn/msn.c:1686 +msgstr "Telefonsøker Jobb" + +#: ../libpurple/protocols/msn/msn.c:1796 msgid "Work Fax" -msgstr "" - -#: ../libpurple/protocols/msn/msn.c:1687 -#, fuzzy +msgstr "Fax Jobb" + +#: ../libpurple/protocols/msn/msn.c:1797 msgid "Work E-Mail" -msgstr "E-post" - -#: ../libpurple/protocols/msn/msn.c:1688 +msgstr "E-post Arbeid" + +#: ../libpurple/protocols/msn/msn.c:1798 msgid "Work IM" -msgstr "" - -#: ../libpurple/protocols/msn/msn.c:1689 -#, fuzzy +msgstr "Lynmelding Arbeid" + +#: ../libpurple/protocols/msn/msn.c:1799 msgid "Start Date" -msgstr "Fylke/stat" - -#: ../libpurple/protocols/msn/msn.c:1759 ../libpurple/protocols/msn/msn.c:1765 -#: ../libpurple/protocols/msn/msn.c:1772 ../libpurple/protocols/msn/msn.c:1779 +msgstr "Start Dato" + +#: ../libpurple/protocols/msn/msn.c:1869 +#: ../libpurple/protocols/msn/msn.c:1875 +#: ../libpurple/protocols/msn/msn.c:1882 +#: ../libpurple/protocols/msn/msn.c:1889 msgid "Favorite Things" msgstr "Favoritt-ting" -#: ../libpurple/protocols/msn/msn.c:1824 +#: ../libpurple/protocols/msn/msn.c:1934 msgid "Last Updated" msgstr "Sist oppdatert" -#: ../libpurple/protocols/msn/msn.c:1835 +#: ../libpurple/protocols/msn/msn.c:1945 #: ../libpurple/protocols/qq/buddy_info.c:60 #: ../libpurple/protocols/silc/ops.c:1026 #: ../libpurple/protocols/silc10/ops.c:1060 msgid "Homepage" msgstr "Hjemmeside" -#: ../libpurple/protocols/msn/msn.c:1859 +#: ../libpurple/protocols/msn/msn.c:1969 msgid "The user has not created a public profile." -msgstr "Brukeren har ikke opprettet en offentlig profil" - -#: ../libpurple/protocols/msn/msn.c:1860 -msgid "" -"MSN reported not being able to find the user's profile. This either means " -"that the user does not exist, or that the user exists but has not created a " -"public profile." -msgstr "" -"MSN klarte ikke å finne brukerens profil. Dette betyr enten at brukeren ikke " -"eksisterer, eller at brukeren ikke har opprettet en offentlig profil" - -#: ../libpurple/protocols/msn/msn.c:1864 -#, fuzzy -msgid "" -"Could not find any information in the user's profile. The user most likely " -"does not exist." -msgstr "" -"Gaim klarte ikke finne noen informasjon i brukerens profil. Antakelig " -"eksisterer brukeren ikke." - -#: ../libpurple/protocols/msn/msn.c:1872 +msgstr "Brukeren har ikke opprettet en offentlig profil." + +#: ../libpurple/protocols/msn/msn.c:1970 +msgid "MSN reported not being able to find the user's profile. This either means that the user does not exist, or that the user exists but has not created a public profile." +msgstr "MSN klarte ikke å finne brukerens profil. Dette betyr enten at brukeren ikke eksisterer, eller at brukeren ikke har opprettet en offentlig profil." + +#: ../libpurple/protocols/msn/msn.c:1974 +msgid "Could not find any information in the user's profile. The user most likely does not exist." +msgstr "Pidgin klarte ikke finne noen informasjon i brukerens profil. Antakelig eksisterer brukeren ikke." + +#: ../libpurple/protocols/msn/msn.c:1982 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1240 msgid "Profile URL" msgstr "Profil URL" @@ -7297,31 +7172,127 @@ #. *< version #. * summary #. * description -#: ../libpurple/protocols/msn/msn.c:2158 ../libpurple/protocols/msn/msn.c:2160 -#, fuzzy -msgid "MSN Protocol Plugin" -msgstr "AIM/ICQ-protokolltillegg" - -#: ../libpurple/protocols/msn/msn.c:2194 +#: ../libpurple/protocols/msn/msn.c:2269 +#: ../libpurple/protocols/msn/msn.c:2271 +msgid "Windows Live Messenger Protocol Plugin" +msgstr "Windows Live Messenger protolltillegg" + +#: ../libpurple/protocols/msn/msn.c:2306 msgid "Use HTTP Method" msgstr "Bruk HTTP-metode" # -#: ../libpurple/protocols/msn/msn.c:2199 -#, fuzzy +#: ../libpurple/protocols/msn/msn.c:2311 msgid "HTTP Method Server" -msgstr "IPC testtjener" - -#: ../libpurple/protocols/msn/msn.c:2204 +msgstr "HTTP Method Server" + +#: ../libpurple/protocols/msn/msn.c:2316 msgid "Show custom smileys" -msgstr "" - -#: ../libpurple/protocols/msn/msn.c:2212 -#, fuzzy +msgstr "Vis custom smileys" + +#: ../libpurple/protocols/msn/msn.c:2324 msgid "nudge: nudge a user to get their attention" msgstr "nudge: nudge en kontakt for å få deres oppmerksomhet" -#: ../libpurple/protocols/msn/nexus.c:146 +#: ../libpurple/protocols/msn/nexus.c:137 +msgid "Windows Live ID authentication:Unable to connect" +msgstr "Windows Live ID autentisering: Kunne ikke tilkoble" + +#: ../libpurple/protocols/msn/nexus.c:275 +msgid "Windows Live ID authentication Failed" +msgstr "Windows Live ID autentisering Feilet" + +#: ../libpurple/protocols/msn/notification.c:191 +#, c-format +msgid "%s is not a valid group." +msgstr "%s er ikke et gyldig navn på en gruppe." + +#: ../libpurple/protocols/msn/notification.c:197 +#: ../libpurple/protocols/msn/notification.c:938 +#: ../libpurple/protocols/msn/session.c:369 +msgid "Unknown error." +msgstr "Ukjent feil." + +#: ../libpurple/protocols/msn/notification.c:200 +#, c-format +msgid "%s on %s (%s)" +msgstr "%s på %s (%s)" + +#: ../libpurple/protocols/msn/notification.c:518 +#, c-format +msgid "%s just sent you a Nudge!" +msgstr "%s har sendt deg en Nudge!" + +#: ../libpurple/protocols/msn/notification.c:843 +#, c-format +msgid "Unknown error (%d)" +msgstr "Ukjent feil (%d)" + +#: ../libpurple/protocols/msn/notification.c:844 +#: ../libpurple/protocols/sametime/sametime.c:4425 +msgid "Unable to add user" +msgstr "Klarte ikke å legge til bruker" + +#: ../libpurple/protocols/msn/notification.c:904 +#, c-format +msgid "Unable to add user on %s (%s)" +msgstr "Klarte ikke legge til bruker på %s (%s)" + +#: ../libpurple/protocols/msn/notification.c:908 +#, c-format +msgid "Unable to block user on %s (%s)" +msgstr "Klarte ikke blokkere brukeren på %s (%s)" + +#: ../libpurple/protocols/msn/notification.c:912 +#, c-format +msgid "Unable to permit user on %s (%s)" +msgstr "Klarte ikke tillate bruker på %s (%s)" + +#: ../libpurple/protocols/msn/notification.c:920 +#, c-format +msgid "%s could not be added because your buddy list is full." +msgstr "%s kunne ikke bli lagt til kontaktlista, fordi din kontaktliste er full." + +#: ../libpurple/protocols/msn/notification.c:929 +#, c-format +msgid "%s is not a valid passport account." +msgstr "%s er ikke en gyldig passport-konto." + +#: ../libpurple/protocols/msn/notification.c:934 +msgid "Service Temporarily Unavailable." +msgstr "Tjenesten Midlertidig Utilgjengelig." + +#: ../libpurple/protocols/msn/notification.c:1272 +msgid "Unable to rename group" +msgstr "Kunne ikke endre navn på gruppe" + +#: ../libpurple/protocols/msn/notification.c:1327 +msgid "Unable to delete group" +msgstr "Kunne ikke slette gruppe" + +#: ../libpurple/protocols/msn/notification.c:1943 +#, c-format +msgid "" +"The MSN server will shut down for maintenance in %d minute. You will automatically be signed out at that time. Please finish any conversations in progress.\n" +"\n" +"After the maintenance has been completed, you will be able to successfully sign in." +msgid_plural "" +"The MSN server will shut down for maintenance in %d minutes. You will automatically be signed out at that time. Please finish any conversations in progress.\n" +"\n" +"After the maintenance has been completed, you will be able to successfully sign in." +msgstr[0] "" +"MSN-tjeneren vil stenge ned pga. vedlikeholdsarbeid i løpet av %d minutt. Du vil da bli frakoblet, så vennligst avslutt eventuelle samtaler før det.\n" +"\n" +"Etter at vedlikeholdsarbeidet er ferdig, kan du logge på igjen." +msgstr[1] "" +"MSN-tjeneren vil stenge ned pga. vedlikeholdsarbeid i løpet av %d minutter. Du vil da bli frakoblet, så vennligst avslutt eventuelle samtaler før det.\n" +"\n" +"Etter at vedlikeholdsarbeidet er ferdig, kan du logge på igjen." + +#: ../libpurple/protocols/msn/oim.c:141 +msgid "Unable to connect to OIM server" +msgstr "Kan ikke koble til OIM server" + #: ../libpurple/protocols/msn/servconn.c:135 #: ../libpurple/protocols/qq/qq_proxy.c:242 #: ../libpurple/protocols/qq/qq_proxy.c:321 @@ -7341,88 +7312,6 @@ msgid "Unable to connect" msgstr "Kunne ikke koble til" -#: ../libpurple/protocols/msn/notification.c:178 -#, c-format -msgid "%s is not a valid group." -msgstr "%s er ikke et gyldig navn på en gruppe." - -#: ../libpurple/protocols/msn/notification.c:184 -#: ../libpurple/protocols/msn/notification.c:532 -#: ../libpurple/protocols/msn/session.c:330 -msgid "Unknown error." -msgstr "Ukjent feil." - -#: ../libpurple/protocols/msn/notification.c:187 -#, c-format -msgid "%s on %s (%s)" -msgstr "%s på %s (%s)" - -#: ../libpurple/protocols/msn/notification.c:498 -#, c-format -msgid "Unable to add user on %s (%s)" -msgstr "Klarte ikke legge til bruker på %s (%s)" - -#: ../libpurple/protocols/msn/notification.c:502 -#, c-format -msgid "Unable to block user on %s (%s)" -msgstr "Klarte ikke blokkere brukeren på %s (%s)" - -#: ../libpurple/protocols/msn/notification.c:506 -#, c-format -msgid "Unable to permit user on %s (%s)" -msgstr "Klarte ikke tillate bruker på %s (%s)" - -#: ../libpurple/protocols/msn/notification.c:514 -#, c-format -msgid "%s could not be added because your buddy list is full." -msgstr "" -"%s kunne ikke bli lagt til kontaktlista, fordi din kontaktliste er full." - -#: ../libpurple/protocols/msn/notification.c:523 -#, c-format -msgid "%s is not a valid passport account." -msgstr "%s er ikke et gyldig passport-konto" - -#: ../libpurple/protocols/msn/notification.c:528 -#, fuzzy -msgid "Service Temporarily Unavailable." -msgstr "Tjenesten midlertidig uttilgjengelig" - -#: ../libpurple/protocols/msn/notification.c:851 -msgid "Unable to rename group" -msgstr "Kunne ikke endre navn på gruppe" - -#: ../libpurple/protocols/msn/notification.c:906 -msgid "Unable to delete group" -msgstr "Kunne ikke slette gruppe" - -#: ../libpurple/protocols/msn/notification.c:1325 -#, c-format -msgid "" -"The MSN server will shut down for maintenance in %d minute. You will " -"automatically be signed out at that time. Please finish any conversations " -"in progress.\n" -"\n" -"After the maintenance has been completed, you will be able to successfully " -"sign in." -msgid_plural "" -"The MSN server will shut down for maintenance in %d minutes. You will " -"automatically be signed out at that time. Please finish any conversations " -"in progress.\n" -"\n" -"After the maintenance has been completed, you will be able to successfully " -"sign in." -msgstr[0] "" -"MSN-tjeneren vil stenge ned pga. vedlikeholdsarbeid i løpet av %d minutt. Du " -"vil da bli frakoblet, så vennligst avslutt eventuelle samtaler før det.\n" -"\n" -"Etter at vedlikeholdsarbeidet er ferdig, kan du logge på igjen." -msgstr[1] "" -"MSN-tjeneren vil stenge ned pga. vedlikeholdsarbeid i løpet av %d minutter. " -"Du vil da bli frakoblet, så vennligst avslutt eventuelle samtaler før det.\n" -"\n" -"Etter at vedlikeholdsarbeidet er ferdig, kan du logge på igjen." - #: ../libpurple/protocols/msn/servconn.c:137 msgid "Writing error" msgstr "Feil ved skriving" @@ -7432,67 +7321,63 @@ msgstr "Feil ved lesing" #: ../libpurple/protocols/msn/servconn.c:146 -#, fuzzy, c-format +#, c-format msgid "" "Connection error from %s server:\n" "%s" msgstr "" -"Tilkoplingsfeil fra %s tjener (%s):\n" +"Tilkoplingsfeil fra %s tjener:\n" "%s" -#: ../libpurple/protocols/msn/session.c:299 +#: ../libpurple/protocols/msn/session.c:336 msgid "Our protocol is not supported by the server." -msgstr "Vår protokoll er ikke støttet av tjeneren" - -#: ../libpurple/protocols/msn/session.c:303 +msgstr "Vår protokoll er ikke støttet av tjeneren." + +#: ../libpurple/protocols/msn/session.c:340 msgid "Error parsing HTTP." msgstr "Feil under tolkning av HTTP." -#: ../libpurple/protocols/msn/session.c:307 +#: ../libpurple/protocols/msn/session.c:344 #: ../libpurple/protocols/oscar/flap_connection.c:384 -#: ../libpurple/protocols/yahoo/yahoo.c:205 +#: ../libpurple/protocols/yahoo/yahoo.c:207 msgid "You have signed on from another location." msgstr "Du ble logget av fordi du har logget på et annet sted." -#: ../libpurple/protocols/msn/session.c:310 +#: ../libpurple/protocols/msn/session.c:349 msgid "The MSN servers are temporarily unavailable. Please wait and try again." -msgstr "" -"MSN-tjenerene er midlertidig utilgjengelig.Vennligst prøv igjen senere." - -#: ../libpurple/protocols/msn/session.c:315 +msgstr "MSN-tjenerene er midlertidig utilgjengelig.Vennligst prøv igjen senere." + +#: ../libpurple/protocols/msn/session.c:354 msgid "The MSN servers are going down temporarily." msgstr "MSN-tjenerne vil bli utilgjengelig en liten stund." -#: ../libpurple/protocols/msn/session.c:320 +#: ../libpurple/protocols/msn/session.c:359 #, c-format msgid "Unable to authenticate: %s" msgstr "Klarte ikke autentisere: %s" -#: ../libpurple/protocols/msn/session.c:325 -msgid "" -"Your MSN buddy list is temporarily unavailable. Please wait and try again." -msgstr "" -"Din MSN-kontaktliste er midlertidig utilgjengelig. Vennligst prøv igjen " -"senere." - -#: ../libpurple/protocols/msn/session.c:346 -#: ../libpurple/protocols/msn/session.c:348 +#: ../libpurple/protocols/msn/session.c:364 +msgid "Your MSN buddy list is temporarily unavailable. Please wait and try again." +msgstr "Din MSN-kontaktliste er midlertidig utilgjengelig. Vennligst prøv igjen senere." + +#: ../libpurple/protocols/msn/session.c:385 +#: ../libpurple/protocols/msn/session.c:387 msgid "Handshaking" msgstr "Håndtrykk" -#: ../libpurple/protocols/msn/session.c:349 +#: ../libpurple/protocols/msn/session.c:388 msgid "Starting authentication" msgstr "Starter godkjenning" -#: ../libpurple/protocols/msn/session.c:350 +#: ../libpurple/protocols/msn/session.c:389 msgid "Getting cookie" msgstr "Henter informasjonskapsel" -#: ../libpurple/protocols/msn/session.c:352 +#: ../libpurple/protocols/msn/session.c:391 msgid "Sending cookie" msgstr "Sender informasjonskapsel" -#: ../libpurple/protocols/msn/session.c:353 +#: ../libpurple/protocols/msn/session.c:392 msgid "Retrieving buddy list" msgstr "Henter kontaktliste" @@ -7514,8 +7399,7 @@ #: ../libpurple/protocols/msn/switchboard.c:408 msgid "Message could not be sent, not allowed while invisible:" -msgstr "" -"Meldingen ble ikke sendt, du ikke kan sende meldinger når du er usynlig:" +msgstr "Meldingen ble ikke sendt, du ikke kan sende meldinger når du er usynlig:" #: ../libpurple/protocols/msn/switchboard.c:412 msgid "Message could not be sent because the user is offline:" @@ -7526,278 +7410,253 @@ msgstr "Meldingen kunne ikke bli sendt på grunn av en tilkoblingfeil:" #: ../libpurple/protocols/msn/switchboard.c:420 -#, fuzzy msgid "Message could not be sent because we are sending too quickly:" -msgstr "Meldingen kunne ikke bli sendt, brukeren er frakoblet:" +msgstr "Meldingen kunne ikke bli sendt fordi du sender for fort:" #: ../libpurple/protocols/msn/switchboard.c:424 -msgid "" -"Message could not be sent because we were unable to establish a session with " -"the server. This is likely a server problem, try again in a few minutes:" -msgstr "" +msgid "Message could not be sent because we were unable to establish a session with the server. This is likely a server problem, try again in a few minutes:" +msgstr "Beskjeden kunne ikke bli sendt fordi vi kunne ikke opprette en økt med serveren. Dette er sannsynligvis et server problem, prøv igjen om noen minutter:" #: ../libpurple/protocols/msn/switchboard.c:431 -msgid "" -"Message could not be sent because an error with the switchboard occurred:" -msgstr "" -"Meldingen kunne ikke bli sendt, da det skjedde en feil med sentralbordet:" +msgid "Message could not be sent because an error with the switchboard occurred:" +msgstr "Meldingen kunne ikke bli sendt, da det skjedde en feil med sentralbordet:" #: ../libpurple/protocols/msn/switchboard.c:439 msgid "Message may have not been sent because an unknown error occurred:" msgstr "Meldingen kunne ikke bli sendt på grunn av en ukjent feil:" -#: ../libpurple/protocols/msn/userlist.c:252 -#, fuzzy, c-format +#: ../libpurple/protocols/msn/userlist.c:243 +#, c-format msgid "%s has added you to his or her buddy list." -msgstr "Brukeren %s ønsker å legge til %s i kontaktlisten sin." - -#: ../libpurple/protocols/msn/userlist.c:321 -#, fuzzy, c-format +msgstr "%s har lagt deg til i kontaktlisten sin." + +#: ../libpurple/protocols/msn/userlist.c:312 +#, c-format msgid "%s has removed you from his or her buddy list." msgstr "%s har fjernet deg fra sin kontaktliste." -#: ../libpurple/protocols/msn/userlist.c:643 -#, fuzzy, c-format +#. only notify the user about problems adding to the friends list +#. * maybe we should do something else for other lists, but it probably +#. * won't cause too many problems if we just ignore it +#: ../libpurple/protocols/msn/userlist.c:693 +#, c-format msgid "Unable to add \"%s\"." -msgstr "Kunne ikke lese fil %s." - -#: ../libpurple/protocols/msn/userlist.c:645 -#, fuzzy +msgstr "Kunne ikke legge til \"%s\"." + +#: ../libpurple/protocols/msn/userlist.c:696 msgid "The screen name specified is invalid." -msgstr "Den inntastede SecurID-nøkkelen er ugyldig." +msgstr "Skjermnavnet du spsifiserte er ikke gyldig" #: ../libpurple/protocols/myspace/myspace.c:111 msgid "Missing Cipher" -msgstr "" +msgstr "Manglende Summering" #: ../libpurple/protocols/myspace/myspace.c:112 msgid "The RC4 cipher could not be found" -msgstr "" +msgstr "RC4 summeringen kunne ikke bli funnet" #: ../libpurple/protocols/myspace/myspace.c:113 -msgid "" -"Upgrade to a libpurple with RC4 support (>= 2.0.1). MySpaceIM plugin will " -"not be loaded." -msgstr "" +msgid "Upgrade to a libpurple with RC4 support (>= 2.0.1). MySpaceIM plugin will not be loaded." +msgstr "Oppgrader til en libpurple med RC4 støtte (>= 2.0.1). MySpaceIM tillegg vil ikke bli lastet." #: ../libpurple/protocols/myspace/myspace.c:286 #, c-format -msgid "" -"Sorry, passwords over %d characters in length (yours is %d) are not " -"supported by MySpace." -msgstr "" +msgid "Sorry, passwords over %d characters in length (yours is %d) are not supported by MySpace." +msgstr "Sorry, passord over %d tegn (du har %d) er ikke støttet av MySpace." #. Notify an error message also, because this is important! #: ../libpurple/protocols/myspace/myspace.c:292 -#: ../libpurple/protocols/myspace/myspace.c:1801 +#: ../libpurple/protocols/myspace/myspace.c:1798 msgid "MySpaceIM Error" -msgstr "" +msgstr "MySpaceIM Feil" #: ../libpurple/protocols/myspace/myspace.c:349 -#, fuzzy msgid "Reading challenge" msgstr "Leser data" #: ../libpurple/protocols/myspace/myspace.c:355 -#, fuzzy msgid "Unexpected challenge length from server" -msgstr "Ugyldig utfordring fra tjener." +msgstr "Ugyldig utfordring fra tjener" #: ../libpurple/protocols/myspace/myspace.c:359 -#, fuzzy msgid "Logging in" -msgstr "Logging" - -#: ../libpurple/protocols/myspace/myspace.c:1286 +msgstr "Logger inn" + +#: ../libpurple/protocols/myspace/myspace.c:1278 #, c-format msgid "Connection to server lost (no data received within %d seconds)" -msgstr "" +msgstr "Tilkobling til server mistet (ingen data mottatt iløpet av %d sekunder)" #. Can't write _()'d strings in array initializers. Workaround. -#: ../libpurple/protocols/myspace/myspace.c:1328 -#, fuzzy +#: ../libpurple/protocols/myspace/myspace.c:1321 msgid "New mail messages" -msgstr "Ny fraværsbeskjed" - -#: ../libpurple/protocols/myspace/myspace.c:1329 +msgstr "Nye e-post beskjeder" + +#: ../libpurple/protocols/myspace/myspace.c:1322 msgid "New blog comments" -msgstr "" - -#: ../libpurple/protocols/myspace/myspace.c:1330 +msgstr "Nye blog kommentarer" + +#: ../libpurple/protocols/myspace/myspace.c:1323 msgid "New profile comments" -msgstr "" - -#: ../libpurple/protocols/myspace/myspace.c:1331 +msgstr "Nye profil kommentarer" + +#: ../libpurple/protocols/myspace/myspace.c:1324 msgid "New friend requests!" -msgstr "" - -#: ../libpurple/protocols/myspace/myspace.c:1332 +msgstr "Nye venne-forespørsler!" + +#: ../libpurple/protocols/myspace/myspace.c:1325 msgid "New picture comments" -msgstr "" - -#: ../libpurple/protocols/myspace/myspace.c:1360 +msgstr "Nye bilde kommentarer" + +#: ../libpurple/protocols/myspace/myspace.c:1355 msgid "MySpace" -msgstr "" +msgstr "Myspace" #. The session is now set up, ready to be connected. This emits the #. * signedOn signal, so clients can now do anything with msimprpl, and #. * we're ready for it (session key, userid, username all setup). -#: ../libpurple/protocols/myspace/myspace.c:1543 +#: ../libpurple/protocols/myspace/myspace.c:1538 #: ../libpurple/protocols/sametime/sametime.c:1544 -#, fuzzy msgid "Connected" -msgstr "Koble til" - -#: ../libpurple/protocols/myspace/myspace.c:1554 -#: ../libpurple/protocols/myspace/myspace.c:1556 -#, fuzzy +msgstr "Tilkoblet" + +#: ../libpurple/protocols/myspace/myspace.c:1549 +#: ../libpurple/protocols/myspace/myspace.c:1551 msgid "No username set" -msgstr "Skjermnavn ikke oppgitt." - -#: ../libpurple/protocols/myspace/myspace.c:1555 -msgid "" -"Please go to http://editprofile.myspace.com/index.cfm?fuseaction=profile." -"username and choose a username and try to login again." -msgstr "" - -#: ../libpurple/protocols/myspace/myspace.c:1782 +msgstr "Skjermnavn ikke oppgitt" + +#: ../libpurple/protocols/myspace/myspace.c:1550 +msgid "Please go to http://editprofile.myspace.com/index.cfm?fuseaction=profile.username and choose a username and try to login again." +msgstr "Vennligst gå til http://editprofile.myspace.com/index.cfm?fuseaction=profile.username og velg et brukernavn og prøv å logge inn igjen." + +#: ../libpurple/protocols/myspace/myspace.c:1777 #, c-format msgid "Protocol error, code %d: %s" -msgstr "" - -#: ../libpurple/protocols/myspace/myspace.c:1972 -#: ../libpurple/protocols/myspace/myspace.c:2006 -#, fuzzy +msgstr "Protokoll feil, kode %d: %s" + +#: ../libpurple/protocols/myspace/myspace.c:1970 +#: ../libpurple/protocols/myspace/myspace.c:2004 msgid "Failed to add buddy" -msgstr "Kunne ikke bli med kontakt i samtale" - -#: ../libpurple/protocols/myspace/myspace.c:1972 -#, fuzzy +msgstr "Kunne ikke legge til kontakt" + +#: ../libpurple/protocols/myspace/myspace.c:1970 msgid "'addbuddy' command failed." -msgstr "Importer kontaktliste fra tjener" - -#: ../libpurple/protocols/myspace/myspace.c:2006 -#: ../libpurple/protocols/myspace/myspace.c:2247 +msgstr "'addbuddy' kommando feilet." + +#: ../libpurple/protocols/myspace/myspace.c:2004 +#: ../libpurple/protocols/myspace/myspace.c:2245 #, fuzzy msgid "persist command failed" msgstr "Feil med switchboard-tjenesten" -#: ../libpurple/protocols/myspace/myspace.c:2115 +#: ../libpurple/protocols/myspace/myspace.c:2113 #, c-format msgid "No such user: %s" -msgstr "" - -#: ../libpurple/protocols/myspace/myspace.c:2116 -#, fuzzy +msgstr "Ingen slik bruker: %s" + +#: ../libpurple/protocols/myspace/myspace.c:2114 msgid "User lookup" -msgstr "Brukerrom" - -#: ../libpurple/protocols/myspace/myspace.c:2228 -#: ../libpurple/protocols/myspace/myspace.c:2247 -#: ../libpurple/protocols/myspace/myspace.c:2269 -#, fuzzy +msgstr "Lete opp bruker" + +#: ../libpurple/protocols/myspace/myspace.c:2226 +#: ../libpurple/protocols/myspace/myspace.c:2245 +#: ../libpurple/protocols/myspace/myspace.c:2267 msgid "Failed to remove buddy" -msgstr "Kunne ikke bli med kontakt i samtale" - -#: ../libpurple/protocols/myspace/myspace.c:2228 +msgstr "Kunne ikke fjerne kontakt" + +#: ../libpurple/protocols/myspace/myspace.c:2226 msgid "'delbuddy' command failed" -msgstr "" - -#: ../libpurple/protocols/myspace/myspace.c:2269 -#, fuzzy +msgstr "'delbuddy' kommando feilet" + +#: ../libpurple/protocols/myspace/myspace.c:2267 msgid "blocklist command failed" -msgstr "Feil med switchboard-tjenesten" - -#: ../libpurple/protocols/myspace/myspace.c:2315 +msgstr "blocklist kommando feilet" + +#: ../libpurple/protocols/myspace/myspace.c:2313 #, fuzzy msgid "Invalid input condition" msgstr "Fullfører tilkobling" #. TODO: g_realloc like msn, yahoo, irc, jabber? -#: ../libpurple/protocols/myspace/myspace.c:2333 -#: ../libpurple/protocols/myspace/myspace.c:2364 +#: ../libpurple/protocols/myspace/myspace.c:2331 +#: ../libpurple/protocols/myspace/myspace.c:2362 #, fuzzy msgid "Read buffer full" msgstr "Køen er full" -#: ../libpurple/protocols/myspace/myspace.c:2402 -#, fuzzy +#: ../libpurple/protocols/myspace/myspace.c:2400 msgid "Unparseable message" -msgstr "Kunne ikke tolke beskjed." - -#: ../libpurple/protocols/myspace/myspace.c:2471 -#, fuzzy, c-format +msgstr "Kunne ikke tolke beskjed" + +#: ../libpurple/protocols/myspace/myspace.c:2469 +#, c-format msgid "Couldn't connect to host: %s (%d)" -msgstr "Kunne ikke koble til" - -#: ../libpurple/protocols/myspace/myspace.c:2642 +msgstr "Kunne ikke koble til vert: %s (%d)" + +#: ../libpurple/protocols/myspace/myspace.c:2640 #, fuzzy msgid "IM Friends" msgstr "Vinduer for direktemeldinger" -#: ../libpurple/protocols/myspace/myspace.c:2741 -#, c-format -msgid "" -"%d buddies were added or updated from the server (including buddies already " -"on the server-side list)" -msgstr "" - -#: ../libpurple/protocols/myspace/myspace.c:2742 -#, fuzzy +#: ../libpurple/protocols/myspace/myspace.c:2739 +#, c-format +msgid "%d buddies were added or updated from the server (including buddies already on the server-side list)" +msgstr "%d kompiser ble lagt til eller oppdatert fra serveren (inkludert kompiser allerede på server-side listen)" + +#: ../libpurple/protocols/myspace/myspace.c:2740 msgid "Add contacts from server" -msgstr "Ugyldig svar fra tjener." - -#: ../libpurple/protocols/myspace/myspace.c:2794 -#: ../libpurple/protocols/myspace/myspace.c:2859 +msgstr "Ugyldig svar fra tjener" + +#: ../libpurple/protocols/myspace/myspace.c:2792 +#: ../libpurple/protocols/myspace/myspace.c:2857 msgid "Add friends from MySpace.com" -msgstr "" - -#: ../libpurple/protocols/myspace/myspace.c:2795 +msgstr "Legg til venner fra MySpace.com" + +#: ../libpurple/protocols/myspace/myspace.c:2793 #, fuzzy msgid "Importing friends failed" msgstr "Ugyldig 'friend'-fil" #. TODO: find out how -#: ../libpurple/protocols/myspace/myspace.c:2851 +#: ../libpurple/protocols/myspace/myspace.c:2849 msgid "Find people..." -msgstr "" - -#: ../libpurple/protocols/myspace/myspace.c:2854 -#, fuzzy +msgstr "Finn folk..." + +#: ../libpurple/protocols/myspace/myspace.c:2852 msgid "Change IM name..." -msgstr "Bytt passord..." +msgstr "Bytt lynmeldingsnavn..." + +#: ../libpurple/protocols/myspace/myspace.c:3154 +msgid "myim URL handler" +msgstr "myim URL behandler" + +#: ../libpurple/protocols/myspace/myspace.c:3155 +msgid "No suitable MySpaceIM account could be found to open this myim URL." +msgstr "Ingen passende MySpaceIM konto ble funnet for å åpne myim URL." #: ../libpurple/protocols/myspace/myspace.c:3156 -msgid "myim URL handler" -msgstr "" - -#: ../libpurple/protocols/myspace/myspace.c:3157 -msgid "No suitable MySpaceIM account could be found to open this myim URL." -msgstr "" - -#: ../libpurple/protocols/myspace/myspace.c:3158 msgid "Enable the proper MySpaceIM account and try again." -msgstr "" - -#: ../libpurple/protocols/myspace/myspace.c:3281 +msgstr "Slå på den rette MySpaceIM kontoen og prøv igjen." + +#: ../libpurple/protocols/myspace/myspace.c:3279 +#, fuzzy msgid "Show display name in status text" -msgstr "" - -#: ../libpurple/protocols/myspace/myspace.c:3284 +msgstr "Vis navn i status tekst" + +#: ../libpurple/protocols/myspace/myspace.c:3282 #, fuzzy msgid "Show headline in status text" msgstr "Vis aliasnavn i titteltekster" -#: ../libpurple/protocols/myspace/myspace.c:3289 -#, fuzzy +#: ../libpurple/protocols/myspace/myspace.c:3287 msgid "Send emoticons" -msgstr "Lydinnstillinger" - -#: ../libpurple/protocols/myspace/myspace.c:3294 +msgstr "Send animasjons ikoner" + +#: ../libpurple/protocols/myspace/myspace.c:3292 msgid "Screen resolution (dots per inch)" -msgstr "" - -#: ../libpurple/protocols/myspace/myspace.c:3297 +msgstr "Skjerm oppløsning (dots per inch)" + +#: ../libpurple/protocols/myspace/myspace.c:3295 #, fuzzy msgid "Base font size (points)" msgstr "Større skrift" @@ -7805,182 +7664,174 @@ #: ../libpurple/protocols/myspace/user.c:95 #: ../libpurple/protocols/zephyr/zephyr.c:786 #: ../libpurple/protocols/zephyr/zephyr.c:1204 -#, fuzzy msgid "User" -msgstr "Brukere" +msgstr "Bruker" #. TODO: link to username, if available #: ../libpurple/protocols/myspace/user.c:102 -#: ../libpurple/protocols/oscar/oscar.c:2964 +#: ../libpurple/protocols/oscar/oscar.c:2960 msgid "Profile" msgstr "Profil" #: ../libpurple/protocols/myspace/user.c:124 -#, fuzzy msgid "Headline" -msgstr "Avslå" +msgstr "Overskrift" #: ../libpurple/protocols/myspace/user.c:129 -#, fuzzy msgid "Song" -msgstr "_Sortering:" +msgstr "Sang" #: ../libpurple/protocols/myspace/user.c:134 msgid "Total Friends" -msgstr "" +msgstr "Antall venner" #: ../libpurple/protocols/myspace/user.c:145 #: ../libpurple/protocols/myspace/user.c:148 #: ../libpurple/protocols/myspace/user.c:151 -#, fuzzy msgid "Client Version" -msgstr "Lukk samtalen" +msgstr "Klient Versjon" #. TODO: icons for each zap #: ../libpurple/protocols/myspace/zap.c:44 #: ../libpurple/protocols/myspace/zap.c:177 msgid "Zap" -msgstr "" +msgstr "Zap" #: ../libpurple/protocols/myspace/zap.c:44 #, c-format msgid "%s has zapped you!" -msgstr "" +msgstr "%s har zappet deg!" #: ../libpurple/protocols/myspace/zap.c:44 #, c-format msgid "Zapping %s..." -msgstr "" +msgstr "Zapper %s..." #: ../libpurple/protocols/myspace/zap.c:45 -#, fuzzy msgid "Whack" -msgstr "Tilbake" +msgstr "Klaske" #: ../libpurple/protocols/myspace/zap.c:45 -#, fuzzy, c-format +#, c-format msgid "%s has whacked you!" -msgstr "Brukeren har blokkert deg" +msgstr "%s har klasket deg!" #: ../libpurple/protocols/myspace/zap.c:45 #, c-format msgid "Whacking %s..." -msgstr "" +msgstr "Klasker %s..." #: ../libpurple/protocols/myspace/zap.c:46 -#, fuzzy msgid "Torch" -msgstr "Tema:" +msgstr "Fakkel" #: ../libpurple/protocols/myspace/zap.c:46 -#, fuzzy, c-format +#, c-format msgid "%s has torched you!" -msgstr "Brukeren har blokkert deg" +msgstr "%s har sendt deg en fakkel!" #: ../libpurple/protocols/myspace/zap.c:46 #, c-format msgid "Torching %s..." -msgstr "" +msgstr "Slår %s med stokk..." #: ../libpurple/protocols/myspace/zap.c:47 msgid "Smooch" -msgstr "" +msgstr "Smooch" #: ../libpurple/protocols/myspace/zap.c:47 -#, fuzzy, c-format +#, c-format msgid "%s has smooched you!" -msgstr "Brukeren har blokkert deg" +msgstr "%s har smoochet deg!" #: ../libpurple/protocols/myspace/zap.c:47 #, c-format msgid "Smooching %s..." -msgstr "" +msgstr "Smooching %s..." #: ../libpurple/protocols/myspace/zap.c:48 msgid "Hug" -msgstr "" +msgstr "Klem" #: ../libpurple/protocols/myspace/zap.c:48 -#, fuzzy, c-format +#, c-format msgid "%s has hugged you!" -msgstr "%s er borte." +msgstr "%s har klemmet deg!" #: ../libpurple/protocols/myspace/zap.c:48 #, c-format msgid "Hugging %s..." -msgstr "" +msgstr "Klemmer %s..." #: ../libpurple/protocols/myspace/zap.c:49 -#, fuzzy msgid "Slap" -msgstr "Slovakisk" +msgstr "Klapse" #: ../libpurple/protocols/myspace/zap.c:49 -#, fuzzy, c-format +#, c-format msgid "%s has slapped you!" -msgstr "%s har sluttet å skrive til deg (%s)" +msgstr "%s har klapset til deg!" #: ../libpurple/protocols/myspace/zap.c:49 #, c-format msgid "Slapping %s..." -msgstr "" +msgstr "Klapser %s..." #: ../libpurple/protocols/myspace/zap.c:50 -#, fuzzy msgid "Goose" -msgstr "Borte" +msgstr "Gås" #: ../libpurple/protocols/myspace/zap.c:50 -#, fuzzy, c-format +#, c-format msgid "%s has goosed you!" -msgstr "%s er borte." +msgstr "%s har sendt deg en gås!" #: ../libpurple/protocols/myspace/zap.c:50 -#, fuzzy, c-format +#, c-format msgid "Goosing %s..." -msgstr "Slår opp %s" +msgstr "Sender gås til %s..." #: ../libpurple/protocols/myspace/zap.c:51 msgid "High-five" -msgstr "" +msgstr "High-five" #: ../libpurple/protocols/myspace/zap.c:51 -#, fuzzy, c-format +#, c-format msgid "%s has high-fived you!" -msgstr "%s har logget på (%s)" +msgstr "%s har high-five'et deg!" #: ../libpurple/protocols/myspace/zap.c:51 #, c-format msgid "High-fiving %s..." -msgstr "" +msgstr "High-fiving %s..." #: ../libpurple/protocols/myspace/zap.c:52 msgid "Punk" -msgstr "" +msgstr "Punk" #: ../libpurple/protocols/myspace/zap.c:52 #, c-format msgid "%s has punk'd you!" -msgstr "" +msgstr "%s har punk'et deg!" #: ../libpurple/protocols/myspace/zap.c:52 #, c-format msgid "Punking %s..." -msgstr "" +msgstr "Punking %s..." #: ../libpurple/protocols/myspace/zap.c:53 msgid "Raspberry" -msgstr "" +msgstr "Bringebær" #: ../libpurple/protocols/myspace/zap.c:53 #, c-format msgid "%s has raspberried you!" -msgstr "" +msgstr "%s har gitt deg bringebær!" #: ../libpurple/protocols/myspace/zap.c:53 #, c-format msgid "Raspberrying %s..." -msgstr "" +msgstr "Gir bringebær til %s..." #: ../libpurple/protocols/novell/nmuser.c:1864 #, fuzzy @@ -8020,9 +7871,8 @@ msgstr "Passordet har løpt ut" #: ../libpurple/protocols/novell/nmuser.c:1894 -#, fuzzy msgid "Incorrect password" -msgstr "Feil passord." +msgstr "Feil passord" #: ../libpurple/protocols/novell/nmuser.c:1897 msgid "User not found" @@ -8057,9 +7907,8 @@ msgstr "Hovedarkiv er feil satt opp" #: ../libpurple/protocols/novell/nmuser.c:1922 -#, fuzzy msgid "Incorrect screen name or password" -msgstr "Feil kallenavn eller passord." +msgstr "Feil kallenavn eller passord" #: ../libpurple/protocols/novell/nmuser.c:1925 #, fuzzy @@ -8068,12 +7917,8 @@ #: ../libpurple/protocols/novell/nmuser.c:1928 #, fuzzy -msgid "" -"Your account has been disabled because too many incorrect passwords were " -"entered" -msgstr "" -"Kontoen din har blitt deaktivert på grunn av for mange ugyldige inntastede " -"passord" +msgid "Your account has been disabled because too many incorrect passwords were entered" +msgstr "Kontoen din har blitt deaktivert på grunn av for mange ugyldige inntastede passord" #: ../libpurple/protocols/novell/nmuser.c:1931 msgid "You cannot add the same person twice to a conversation" @@ -8084,7 +7929,6 @@ msgstr "Du har nådd grensen for antall tillatte kontakter" #: ../libpurple/protocols/novell/nmuser.c:1938 -#, fuzzy msgid "You have entered an incorrect screen name" msgstr "Du har tastet inn et ugyldig brukernavn" @@ -8101,11 +7945,8 @@ msgstr "Brukeren har blokkert deg" #: ../libpurple/protocols/novell/nmuser.c:1950 -msgid "" -"This evaluation version does not allow more than ten users to log in at one " -"time" -msgstr "" -"Denne testversjonen tillater ikke mer enn ti samtidige innloggede brukere" +msgid "This evaluation version does not allow more than ten users to log in at one time" +msgstr "Denne testversjonen tillater ikke mer enn ti samtidige innloggede brukere" #: ../libpurple/protocols/novell/nmuser.c:1953 msgid "The user is either offline or you are blocked" @@ -8119,115 +7960,107 @@ #: ../libpurple/protocols/novell/novell.c:124 #, c-format msgid "Login failed (%s)." -msgstr "Pålogging feilet (%s)" - -#: ../libpurple/protocols/novell/novell.c:247 +msgstr "Pålogging feilet (%s)." + +#: ../libpurple/protocols/novell/novell.c:249 #, c-format msgid "Unable to send message. Could not get details for user (%s)." msgstr "Kunne ikke sende beskjed. Klarte ikke hente brukerdetaljer (%s)." -#: ../libpurple/protocols/novell/novell.c:396 +#: ../libpurple/protocols/novell/novell.c:398 #, c-format msgid "Unable to add %s to your buddy list (%s)." msgstr "Kunne ikke legge til %s til kontaktlisten din (%s)." #. TODO: Improve this! message to who or for what conference? -#: ../libpurple/protocols/novell/novell.c:422 +#: ../libpurple/protocols/novell/novell.c:424 #, c-format msgid "Unable to send message (%s)." msgstr "Kunne ikke sende beskjed (%s)." -#: ../libpurple/protocols/novell/novell.c:493 -#: ../libpurple/protocols/novell/novell.c:985 +#: ../libpurple/protocols/novell/novell.c:495 +#: ../libpurple/protocols/novell/novell.c:987 #, c-format msgid "Unable to invite user (%s)." msgstr "Kunne ikke invitere bruker (%s)." -#: ../libpurple/protocols/novell/novell.c:532 +#: ../libpurple/protocols/novell/novell.c:534 #, c-format msgid "Unable to send message to %s. Could not create the conference (%s)." -msgstr "" -"Klarte ikke sende beskjed til %s. Kunne ikke sette opp konferansen (%s)." - -#: ../libpurple/protocols/novell/novell.c:537 +msgstr "Klarte ikke sende beskjed til %s. Kunne ikke sette opp konferansen (%s)." + +#: ../libpurple/protocols/novell/novell.c:539 #, c-format msgid "Unable to send message. Could not create the conference (%s)." msgstr "Klarte ikke sende beskjed. Kunne ikke sette opp konferansen (%s)." -#: ../libpurple/protocols/novell/novell.c:584 -#, c-format -msgid "" -"Unable to move user %s to folder %s in the server side list. Error while " -"creating folder (%s)." -msgstr "" -"Klarte ikke flytte brukeren %s til mappe %s i lista på tjenersiden. En feil " -"oppsto under opprettelse av mappe (%s)." - -#: ../libpurple/protocols/novell/novell.c:632 -#, c-format -msgid "" -"Unable to add %s to your buddy list. Error creating folder in server side " -"list (%s)." -msgstr "" -"Klarte ikke legge til %s i kontaktlista. En feil oppsto under opprettelse i " -"lista på tjenersiden (%s)." - -#: ../libpurple/protocols/novell/novell.c:705 +#: ../libpurple/protocols/novell/novell.c:586 +#, c-format +msgid "Unable to move user %s to folder %s in the server side list. Error while creating folder (%s)." +msgstr "Klarte ikke flytte brukeren %s til mappe %s i lista på tjenersiden. En feil oppsto under opprettelse av mappe (%s)." + +#: ../libpurple/protocols/novell/novell.c:634 +#, c-format +msgid "Unable to add %s to your buddy list. Error creating folder in server side list (%s)." +msgstr "Klarte ikke legge til %s i kontaktlista. En feil oppsto under opprettelse i lista på tjenersiden (%s)." + +#: ../libpurple/protocols/novell/novell.c:707 #, c-format msgid "Could not get details for user %s (%s)." msgstr "Kunne ikke hente detaljer for brukeren %s (%s)." -#: ../libpurple/protocols/novell/novell.c:751 -#: ../libpurple/protocols/novell/novell.c:897 +#: ../libpurple/protocols/novell/novell.c:753 +#: ../libpurple/protocols/novell/novell.c:899 #, c-format msgid "Unable to add user to privacy list (%s)." msgstr "Kunne ikke legge til bruker til privatliste (%s)." -#: ../libpurple/protocols/novell/novell.c:798 +#: ../libpurple/protocols/novell/novell.c:800 #, c-format msgid "Unable to add %s to deny list (%s)." msgstr "Kunne ikke legge til %s til nektingsliste (%s)." -#: ../libpurple/protocols/novell/novell.c:851 +#: ../libpurple/protocols/novell/novell.c:853 #, c-format msgid "Unable to add %s to permit list (%s)." msgstr "Kunne ikke legge til %s til tillatelsesliste (%s)." -#: ../libpurple/protocols/novell/novell.c:919 +#: ../libpurple/protocols/novell/novell.c:921 #, c-format msgid "Unable to remove %s from privacy list (%s)." msgstr "Kunne ikke fjerne %s fra privatliste (%s)." -#: ../libpurple/protocols/novell/novell.c:942 -#: ../libpurple/protocols/novell/novell.c:1647 +#: ../libpurple/protocols/novell/novell.c:944 +#: ../libpurple/protocols/novell/novell.c:1649 #, c-format msgid "Unable to change server side privacy settings (%s)." msgstr "Klarte ikke endre personsvernsinstillinger på tjenersiden (%s)." -#: ../libpurple/protocols/novell/novell.c:1012 +#: ../libpurple/protocols/novell/novell.c:1014 #, c-format msgid "Unable to create conference (%s)." msgstr "Klarte ikke opprette konferanse (%s)." -#: ../libpurple/protocols/novell/novell.c:1121 -#: ../libpurple/protocols/novell/novell.c:1692 +#: ../libpurple/protocols/novell/novell.c:1123 +#: ../libpurple/protocols/novell/novell.c:1694 msgid "Error communicating with server. Closing connection." msgstr "Feil i kommunikasjon med tjener, stenger forbindelse." -#: ../libpurple/protocols/novell/novell.c:1476 +#: ../libpurple/protocols/novell/novell.c:1478 msgid "Telephone Number" msgstr "Telefonnummer" -#: ../libpurple/protocols/novell/novell.c:1482 +#: ../libpurple/protocols/novell/novell.c:1484 msgid "Personal Title" msgstr "Tittel" # VAR: E-post -#: ../libpurple/protocols/novell/novell.c:1486 +#: ../libpurple/protocols/novell/novell.c:1488 +#, fuzzy msgid "Mailstop" -msgstr "" - -#: ../libpurple/protocols/novell/novell.c:1502 +msgstr "E-poststopp" + +#: ../libpurple/protocols/novell/novell.c:1504 #: ../libpurple/protocols/sametime/sametime.c:4122 msgid "User ID" msgstr "Brukerid" @@ -8238,41 +8071,41 @@ #. purple_notify_user_info_add_pair(user_info, tag, value); #. } #. -#: ../libpurple/protocols/novell/novell.c:1515 +#: ../libpurple/protocols/novell/novell.c:1517 msgid "Full name" msgstr "Fullt navn" -#: ../libpurple/protocols/novell/novell.c:1637 +#: ../libpurple/protocols/novell/novell.c:1639 #, c-format msgid "GroupWise Conference %d" msgstr "GroupWise-konferanse %d" -#: ../libpurple/protocols/novell/novell.c:1668 +#: ../libpurple/protocols/novell/novell.c:1670 msgid "Unable to make SSL connection to server." msgstr "Klarte ikke opprette SSL-forbindelse med tjeneren." -#: ../libpurple/protocols/novell/novell.c:1720 +#: ../libpurple/protocols/novell/novell.c:1722 msgid "Authenticating..." msgstr "Autentiserer..." -#: ../libpurple/protocols/novell/novell.c:1732 +#: ../libpurple/protocols/novell/novell.c:1734 msgid "Unable to connect to server." msgstr "Kan ikke koble til tjener." -#: ../libpurple/protocols/novell/novell.c:1735 +#: ../libpurple/protocols/novell/novell.c:1737 msgid "Waiting for response..." msgstr "Venter på svar..." -#: ../libpurple/protocols/novell/novell.c:1870 +#: ../libpurple/protocols/novell/novell.c:1872 #, c-format msgid "%s has been invited to this conversation." msgstr "%s har blitt invitert til denne samtalen." -#: ../libpurple/protocols/novell/novell.c:1898 +#: ../libpurple/protocols/novell/novell.c:1900 msgid "Invitation to Conversation" msgstr "Invitasjon til samtale" -#: ../libpurple/protocols/novell/novell.c:1899 +#: ../libpurple/protocols/novell/novell.c:1901 #, c-format msgid "" "Invitation from: %s\n" @@ -8283,43 +8116,34 @@ "\n" "Sent: %s" -#: ../libpurple/protocols/novell/novell.c:1901 +#: ../libpurple/protocols/novell/novell.c:1903 msgid "Would you like to join the conversation?" msgstr "Ønsker du å bli med i samtalen?" -#. we don't want to reconnect in this case -#: ../libpurple/protocols/novell/novell.c:2012 +#: ../libpurple/protocols/novell/novell.c:2017 msgid "You have been logged out because you logged in at another workstation." -msgstr "" -"Du ble logget av fordi du har logget på med dette skjermnavnet et annet sted." - -#: ../libpurple/protocols/novell/novell.c:2069 -#, c-format -msgid "" -"%s appears to be offline and did not receive the message that you just sent." +msgstr "Du ble logget av fordi du har logget på med dette skjermnavnet et annet sted." + +#: ../libpurple/protocols/novell/novell.c:2074 +#, c-format +msgid "%s appears to be offline and did not receive the message that you just sent." msgstr "%s ser ut til å være frakoplet, og mottok ikke meldingen du sendte." #. TODO: Would be nice to prompt if not set! #. * purple_request_fields(gc, _("Server Address"),...); #. #. ...but for now just error out with a nice message. -#: ../libpurple/protocols/novell/novell.c:2167 -msgid "" -"Unable to connect to server. Please enter the address of the server you wish " -"to connect to." -msgstr "" -"Klarte ikke kople til tjener, skriv inn adressen til tjeneren du ønsker å " -"kople til." - -#: ../libpurple/protocols/novell/novell.c:2195 +#: ../libpurple/protocols/novell/novell.c:2172 +msgid "Unable to connect to server. Please enter the address of the server you wish to connect to." +msgstr "Klarte ikke kople til tjener, skriv inn adressen til tjeneren du ønsker å kople til." + +#: ../libpurple/protocols/novell/novell.c:2200 msgid "Error. SSL support is not installed." msgstr "Feil: SSL-støtte er ikke installert." -#: ../libpurple/protocols/novell/novell.c:2504 -#, c-format +#: ../libpurple/protocols/novell/novell.c:2509 msgid "This conference has been closed. No more messages can be sent." -msgstr "" -"Denne konferansen har blitt stengt, ingen flere meldinger kan bli sendt." +msgstr "Denne konferansen har blitt stengt, ingen flere meldinger kan bli sendt." #. *< type #. *< ui_requirement @@ -8331,47 +8155,55 @@ #. *< version #. * summary #. * description -#: ../libpurple/protocols/novell/novell.c:3518 -#: ../libpurple/protocols/novell/novell.c:3520 +#: ../libpurple/protocols/novell/novell.c:3523 +#: ../libpurple/protocols/novell/novell.c:3525 msgid "Novell GroupWise Messenger Protocol Plugin" msgstr "Novel GroupWise Messenger protolltillegg" -#: ../libpurple/protocols/novell/novell.c:3545 +#: ../libpurple/protocols/novell/novell.c:3550 msgid "Server address" msgstr "Tjeneradresse" -#: ../libpurple/protocols/novell/novell.c:3549 +#: ../libpurple/protocols/novell/novell.c:3554 msgid "Server port" msgstr "Tjenerport" -#: ../libpurple/protocols/oscar/flap_connection.c:387 -#: ../libpurple/protocols/yahoo/yahoo.c:2469 -#: ../libpurple/protocols/yahoo/yahoo.c:2636 -#: ../libpurple/protocols/yahoo/ycht.c:481 ../libpurple/proxy.c:581 -#: ../libpurple/proxy.c:1116 ../libpurple/proxy.c:1225 -#: ../libpurple/proxy.c:1325 ../libpurple/proxy.c:1453 -#, fuzzy +#: ../libpurple/protocols/oscar/flap_connection.c:389 +#: ../libpurple/protocols/yahoo/yahoo.c:2468 +#: ../libpurple/protocols/yahoo/yahoo.c:2635 +#: ../libpurple/protocols/yahoo/ycht.c:481 +#: ../libpurple/proxy.c:581 +#: ../libpurple/proxy.c:1116 +#: ../libpurple/proxy.c:1225 +#: ../libpurple/proxy.c:1325 +#: ../libpurple/proxy.c:1453 msgid "Server closed the connection." -msgstr "Feil: kunne ikke koble til" - -#: ../libpurple/protocols/oscar/flap_connection.c:389 -#: ../libpurple/protocols/yahoo/yahoo.c:2463 -#: ../libpurple/protocols/yahoo/yahoo.c:2630 ../libpurple/proxy.c:593 -#: ../libpurple/proxy.c:1128 ../libpurple/proxy.c:1237 -#: ../libpurple/proxy.c:1337 ../libpurple/proxy.c:1465 -#, fuzzy, c-format +msgstr "Tjeneren lukket forbindelsen." + +#: ../libpurple/protocols/oscar/flap_connection.c:391 +#: ../libpurple/protocols/yahoo/yahoo.c:2462 +#: ../libpurple/protocols/yahoo/yahoo.c:2629 +#: ../libpurple/proxy.c:593 +#: ../libpurple/proxy.c:1128 +#: ../libpurple/proxy.c:1237 +#: ../libpurple/proxy.c:1337 +#: ../libpurple/proxy.c:1465 +#, c-format msgid "" "Lost connection with server:\n" "%s" -msgstr "Du har blitt koblet fra tjeneren." - -#: ../libpurple/protocols/oscar/flap_connection.c:392 -#: ../libpurple/proxy.c:1145 ../libpurple/proxy.c:1250 -#: ../libpurple/proxy.c:1349 ../libpurple/proxy.c:1421 +msgstr "" +"Mistet forbindelse med server:\n" +"%s" + +#: ../libpurple/protocols/oscar/flap_connection.c:394 +#: ../libpurple/proxy.c:1145 +#: ../libpurple/proxy.c:1250 +#: ../libpurple/proxy.c:1349 +#: ../libpurple/proxy.c:1421 #: ../libpurple/proxy.c:1478 -#, fuzzy msgid "Received invalid data on connection with server." -msgstr "Klarte ikke opprette SSL-forbindelse med tjeneren." +msgstr "Mottok ugyldig data i kontakt med tjeneren." #. *< type #. *< ui_requirement @@ -8385,7 +8217,6 @@ #. * description #: ../libpurple/protocols/oscar/libaim.c:118 #: ../libpurple/protocols/oscar/libaim.c:120 -#, fuzzy msgid "AIM Protocol Plugin" msgstr "AIM/ICQ-protokolltillegg" @@ -8401,38 +8232,35 @@ #. * description #: ../libpurple/protocols/oscar/libicq.c:118 #: ../libpurple/protocols/oscar/libicq.c:120 -#, fuzzy msgid "ICQ Protocol Plugin" -msgstr "IRC-protokolltillegg" +msgstr "ICQ-protokolltillegg" #: ../libpurple/protocols/oscar/libicq.c:147 -#: ../libpurple/protocols/yahoo/yahoo.c:4410 +#: ../libpurple/protocols/yahoo/yahoo.c:4409 #: ../libpurple/protocols/zephyr/zephyr.c:2997 msgid "Encoding" -msgstr "Tegnkoding:" +msgstr "Tegnkoding" #: ../libpurple/protocols/oscar/odc.c:40 -#, fuzzy msgid "The remote user has closed the connection." -msgstr "Fjerntliggende bruker kan ikke nås over nettverket lenger" +msgstr "Fjerntliggende bruker har lukket forbindelsen." #: ../libpurple/protocols/oscar/odc.c:42 -#, fuzzy msgid "The remote user has declined your request." -msgstr "Brukeren har blokkert deg" +msgstr "Brukeren har nektet din forespørsel." #: ../libpurple/protocols/oscar/odc.c:44 #, c-format msgid "Lost connection with the remote user:
%s" -msgstr "" +msgstr "Mistet forbindelse til bruker:
%s" #: ../libpurple/protocols/oscar/odc.c:47 msgid "Received invalid data on connection with remote user." -msgstr "" +msgstr "Mottok ugyldig data på forbindelse med annen bruker." #: ../libpurple/protocols/oscar/odc.c:49 msgid "Could not establish a connection with the remote user." -msgstr "" +msgstr "Kunne ikke etablere en forbindelse med bruker." #: ../libpurple/protocols/oscar/odc.c:560 #, fuzzy @@ -8442,7 +8270,7 @@ #: ../libpurple/protocols/oscar/oft.c:656 #, c-format msgid "File %s is %s, which is larger than the maximum size of %s." -msgstr "" +msgstr "Filen %s er %s, som er større enn det som er max. størrelse av %s." #: ../libpurple/protocols/oscar/oscar.c:116 msgid "Invalid error" @@ -8541,25 +8369,18 @@ msgstr "Ikke mens du er på AOL" #: ../libpurple/protocols/oscar/oscar.c:348 -msgid "" -"(There was an error receiving this message. The buddy you are speaking with " -"is probably using a different encoding than expected. If you know what " -"encoding he is using, you can specify it in the advanced account options for " -"your AIM/ICQ account.)" -msgstr "" +msgid "(There was an error receiving this message. The buddy you are speaking with is probably using a different encoding than expected. If you know what encoding he is using, you can specify it in the advanced account options for your AIM/ICQ account.)" +msgstr "(Det oppsto en feil i mottak av denne beskjeden. Kompisen du snakker med bruker sannsynligvis en annen koding enn forventet. Om du vet hvilken koding han bruker, kan du spesifisere dette i avanserte konto instillinger for din AIM/ICQ konto.)" # Lusete klient :P #: ../libpurple/protocols/oscar/oscar.c:457 #, fuzzy, c-format -msgid "" -"(There was an error receiving this message. Either you and %s have " -"different encodings selected, or %s has a buggy client.)" -msgstr "" -"(Det oppsto en feil under mottak av denne meldingen. Kontakten du snakker " -"til har sannsynligvis en lusete klient.)" +msgid "(There was an error receiving this message. Either you and %s have different encodings selected, or %s has a buggy client.)" +msgstr "(Det oppsto en feil under mottak av denne meldingen. Kontakten du snakker til har sannsynligvis en lusete klient.)" #. Label -#: ../libpurple/protocols/oscar/oscar.c:639 ../pidgin/gtkutils.c:2387 +#: ../libpurple/protocols/oscar/oscar.c:639 +#: ../pidgin/gtkutils.c:2387 #: ../pidgin/gtkutils.c:2417 #: ../pidgin/plugins/gevolution/new_person_dialog.c:332 msgid "Buddy Icon" @@ -8582,7 +8403,7 @@ msgstr "Samtale" #: ../libpurple/protocols/oscar/oscar.c:651 -#: ../libpurple/protocols/oscar/oscar.c:6010 +#: ../libpurple/protocols/oscar/oscar.c:6008 msgid "Get File" msgstr "Laste ned fil" @@ -8596,7 +8417,7 @@ #: ../libpurple/protocols/oscar/oscar.c:664 msgid "Send Buddy List" -msgstr "Sende kontaktliste" +msgstr "Send kontaktliste" #: ../libpurple/protocols/oscar/oscar.c:667 msgid "ICQ Direct Connect" @@ -8655,70 +8476,72 @@ msgstr "Kamera" #: ../libpurple/protocols/oscar/oscar.c:725 -#: ../libpurple/protocols/oscar/oscar.c:5780 -#, c-format +#: ../libpurple/protocols/oscar/oscar.c:5778 msgid "Free For Chat" msgstr "Tilgjengelig for samtale" #: ../libpurple/protocols/oscar/oscar.c:729 -#: ../libpurple/protocols/oscar/oscar.c:5815 -#, c-format +#: ../libpurple/protocols/oscar/oscar.c:5813 msgid "Not Available" msgstr "Ikke tilgjengelig" #: ../libpurple/protocols/oscar/oscar.c:731 -#: ../libpurple/protocols/oscar/oscar.c:5801 -#, c-format +#: ../libpurple/protocols/oscar/oscar.c:5799 msgid "Occupied" msgstr "Opptatt" #: ../libpurple/protocols/oscar/oscar.c:735 -#, fuzzy, c-format +#, fuzzy msgid "Web Aware" msgstr "Web-oppmerksom" -#: ../libpurple/protocols/oscar/oscar.c:737 ../libpurple/protocols/qq/qq.c:183 +#: ../libpurple/protocols/oscar/oscar.c:737 +#: ../libpurple/protocols/qq/qq.c:183 #: ../libpurple/protocols/qq/qq.c:288 -#: ../libpurple/protocols/yahoo/yahoo.c:3095 ../libpurple/status.c:157 -#: ../pidgin/gtkdocklet.c:446 ../pidgin/gtkstatusbox.c:1060 -#, c-format +#: ../libpurple/protocols/yahoo/yahoo.c:3094 +#: ../libpurple/status.c:157 +#: ../pidgin/gtkdocklet.c:446 +#: ../pidgin/gtkstatusbox.c:1060 msgid "Invisible" msgstr "Usynlig" #: ../libpurple/protocols/oscar/oscar.c:739 -#, c-format msgid "Online" msgstr "Pålogget" #: ../libpurple/protocols/oscar/oscar.c:838 -#: ../libpurple/protocols/oscar/oscar.c:3707 -#: ../libpurple/protocols/yahoo/yahoo_profile.c:721 ../pidgin/gtkprefs.c:1126 +#: ../libpurple/protocols/oscar/oscar.c:3703 +#: ../libpurple/protocols/yahoo/yahoo_profile.c:721 +#: ../pidgin/gtkprefs.c:1128 msgid "IP Address" msgstr "IP-adresse" #: ../libpurple/protocols/oscar/oscar.c:845 -#: ../libpurple/protocols/oscar/oscar.c:2891 +#: ../libpurple/protocols/oscar/oscar.c:2887 msgid "Warning Level" msgstr "Advarselsnivåer" #: ../libpurple/protocols/oscar/oscar.c:855 -#, fuzzy msgid "Buddy Comment" -msgstr "Kommentar om kontakt:" +msgstr "Kontakt Kommentar" #: ../libpurple/protocols/oscar/oscar.c:995 -#, fuzzy, c-format +#, c-format msgid "" "Could not connect to authentication server:\n" "%s" -msgstr "Kunne ikke koble til for dataoverføring." +msgstr "" +"Kunne ikke koble til autentiserings server:\n" +"%s" #: ../libpurple/protocols/oscar/oscar.c:1003 -#, fuzzy, c-format +#, c-format msgid "" "Could not connect to BOS server:\n" "%s" -msgstr "Klarte ikke koble til tjener." +msgstr "" +"Klarte ikke koble til BOS server:\n" +"%s" #: ../libpurple/protocols/oscar/oscar.c:1043 msgid "Screen name sent" @@ -8735,25 +8558,18 @@ #: ../libpurple/protocols/oscar/oscar.c:1260 #, fuzzy, c-format -msgid "" -"Unable to login: Could not sign on as %s because the screen name is " -"invalid. Screen names must be a valid email address, or start with a letter " -"and contain only letters, numbers and spaces, or contain only numbers." -msgstr "" -"Klarte ikke logge på: Kunne ikke logge på som %s fordi skjermnavnet er " -"ugyldig. Skjermnavn må enten starte med en bokstav og kun inneholde tall, " -"bokstaver, og mellomrom, eller bare inneholde tall." +msgid "Unable to login: Could not sign on as %s because the screen name is invalid. Screen names must be a valid email address, or start with a letter and contain only letters, numbers and spaces, or contain only numbers." +msgstr "Klarte ikke logge på: Kunne ikke logge på som %s fordi skjermnavnet er ugyldig. Skjermnavn må enten starte med en bokstav og kun inneholde tall, bokstaver, og mellomrom, eller bare inneholde tall." #: ../libpurple/protocols/oscar/oscar.c:1345 -#: ../libpurple/protocols/yahoo/yahoo.c:2105 -#, fuzzy +#: ../libpurple/protocols/yahoo/yahoo.c:2104 msgid "Invalid screen name." -msgstr "Ugyldig brukernavn," +msgstr "Ugyldig brukernavn." #: ../libpurple/protocols/oscar/oscar.c:1352 -#: ../libpurple/protocols/qq/login_logout.c:483 -#: ../libpurple/protocols/simple/simple.c:1045 -#: ../libpurple/protocols/yahoo/yahoo.c:2126 +#: ../libpurple/protocols/qq/login_logout.c:485 +#: ../libpurple/protocols/simple/simple.c:1047 +#: ../libpurple/protocols/yahoo/yahoo.c:2125 msgid "Incorrect password." msgstr "Feil passord." @@ -8768,18 +8584,13 @@ #: ../libpurple/protocols/oscar/oscar.c:1366 #: ../libpurple/protocols/oscar/oscar.c:1377 -msgid "" -"You have been connecting and disconnecting too frequently. Wait ten minutes " -"and try again. If you continue to try, you will need to wait even longer." -msgstr "" -"Du har koblet til og koblet fra for hurtig. Vent ti minutter og prøv igjen. " -"Hvis du fortsetter å prøve nå, vil du måtte vente enda lenger." +msgid "You have been connecting and disconnecting too frequently. Wait ten minutes and try again. If you continue to try, you will need to wait even longer." +msgstr "Du har koblet til og koblet fra for hurtig. Vent ti minutter og prøv igjen. Hvis du fortsetter å prøve nå, vil du måtte vente enda lenger." #: ../libpurple/protocols/oscar/oscar.c:1371 #, c-format msgid "The client version you are using is too old. Please upgrade at %s" -msgstr "" -"Klientversjonen av programmet er for gammel. Vennligst oppgrader her: %s" +msgstr "Klientversjonen av programmet er for gammel. Vennligst oppgrader på %s" #: ../libpurple/protocols/oscar/oscar.c:1410 msgid "Could Not Connect" @@ -8805,100 +8616,86 @@ #. * A wrapper for purple_request_action() that uses @c OK and @c Cancel buttons. #. #: ../libpurple/protocols/oscar/oscar.c:1452 -#: ../libpurple/protocols/oscar/oscar.c:2232 -#: ../libpurple/protocols/oscar/oscar.c:2281 -#: ../libpurple/protocols/oscar/oscar.c:5885 -#: ../libpurple/protocols/oscar/oscar.c:6166 ../libpurple/request.h:1388 -#, fuzzy +#: ../libpurple/protocols/oscar/oscar.c:2228 +#: ../libpurple/protocols/oscar/oscar.c:2277 +#: ../libpurple/protocols/oscar/oscar.c:5883 +#: ../libpurple/protocols/oscar/oscar.c:6164 +#: ../libpurple/request.h:1388 msgid "_OK" msgstr "_OK" #: ../libpurple/protocols/oscar/oscar.c:1491 #: ../libpurple/protocols/oscar/oscar.c:1534 #, c-format -msgid "" -"You may be disconnected shortly. You may want to use TOC until this is " -"fixed. Check %s for updates." -msgstr "" -"Du kan bli frakoblet ganske snart. Du vil kanskje bruke TOC inntil dette er " -"ordnet. Sjekk %s for oppdateringer." +msgid "You may be disconnected shortly. You may want to use TOC until this is fixed. Check %s for updates." +msgstr "Du kan bli frakoblet ganske snart. Du vil kanskje bruke TOC inntil dette er ordnet. Sjekk %s for oppdateringer." #: ../libpurple/protocols/oscar/oscar.c:1494 #: ../libpurple/protocols/oscar/oscar.c:1537 -#, fuzzy msgid "Unable to get a valid AIM login hash." -msgstr "Gaim klarte ikke å motta gyldig AIM-påloggingshash." +msgstr "Klarte ikke å motta gyldig AIM-påloggingshash." #: ../libpurple/protocols/oscar/oscar.c:1622 #, fuzzy, c-format msgid "You may be disconnected shortly. Check %s for updates." -msgstr "" -"Du kan bli frakoblet ganske snart. Du vil kanskje bruke TOC inntil dette er " -"ordnet. Sjekk %s for oppdateringer." +msgstr "Du kan bli frakoblet ganske snart. Du vil kanskje bruke TOC inntil dette er ordnet. Sjekk %s for oppdateringer." #: ../libpurple/protocols/oscar/oscar.c:1625 -#, fuzzy msgid "Unable to get a valid login hash." -msgstr "Gaim klarte ikke å motta en gyldig påloggingshash." +msgstr "Klarte ikke å motta en gyldig påloggingshash." #: ../libpurple/protocols/oscar/oscar.c:1655 msgid "Password sent" msgstr "Passord sendt" #: ../libpurple/protocols/oscar/oscar.c:1711 -#, fuzzy msgid "Unable to initialize connection" -msgstr "Kunne ikke lage ny tilkobling." - -#: ../libpurple/protocols/oscar/oscar.c:2202 +msgstr "Kunne ikke lage ny tilkobling" + +#: ../libpurple/protocols/oscar/oscar.c:2198 msgid "Please authorize me so I can add you to my buddy list." -msgstr "" -"Vennligst godkjenn meg slik at jeg kan legge deg til i kontaktlisten min." - -#: ../libpurple/protocols/oscar/oscar.c:2230 +msgstr "Vennligst godkjenn meg slik at jeg kan legge deg til i kontaktlisten min." + +#: ../libpurple/protocols/oscar/oscar.c:2226 msgid "Authorization Request Message:" msgstr "Beskjed i godkjenningsforespørsel:" -#: ../libpurple/protocols/oscar/oscar.c:2231 +#: ../libpurple/protocols/oscar/oscar.c:2227 msgid "Please authorize me!" msgstr "Vennligst godkjenn meg!" -#: ../libpurple/protocols/oscar/oscar.c:2272 -#: ../libpurple/protocols/oscar/oscar.c:2280 -#: ../libpurple/protocols/oscar/oscar.c:2407 -#: ../libpurple/protocols/oscar/oscar.c:5263 -#: ../libpurple/protocols/yahoo/yahoo.c:1030 +#: ../libpurple/protocols/oscar/oscar.c:2268 +#: ../libpurple/protocols/oscar/oscar.c:2276 +#: ../libpurple/protocols/oscar/oscar.c:2403 +#: ../libpurple/protocols/oscar/oscar.c:5259 +#: ../libpurple/protocols/yahoo/yahoo.c:1029 msgid "No reason given." msgstr "Ingen grunn spesifisert." -#: ../libpurple/protocols/oscar/oscar.c:2279 +#: ../libpurple/protocols/oscar/oscar.c:2275 msgid "Authorization Denied Message:" msgstr "Godkjenning nektet, grunn:" -#: ../libpurple/protocols/oscar/oscar.c:2407 -#, c-format -msgid "" -"The user %u has denied your request to add them to your buddy list for the " -"following reason:\n" +#: ../libpurple/protocols/oscar/oscar.c:2403 +#, c-format +msgid "" +"The user %u has denied your request to add them to your buddy list for the following reason:\n" "%s" msgstr "" -"Brukeren %u har avslått din forespørsel om å bli lagt til i din kontaktliste " -"med følgende grunn:\n" +"Brukeren %u har avslått din forespørsel om å bli lagt til i din kontaktliste med følgende grunn:\n" "%s" -#: ../libpurple/protocols/oscar/oscar.c:2408 +#: ../libpurple/protocols/oscar/oscar.c:2404 msgid "ICQ authorization denied." msgstr "ICQ-godkjenning avslått." #. Someone has granted you authorization -#: ../libpurple/protocols/oscar/oscar.c:2415 +#: ../libpurple/protocols/oscar/oscar.c:2411 #, c-format msgid "The user %u has granted your request to add them to your buddy list." -msgstr "" -"Brukeren %u har godtatt din forespørsel om å bli lagt til i kontaktlisten " -"din." - -#: ../libpurple/protocols/oscar/oscar.c:2423 +msgstr "Brukeren %u har godtatt din forespørsel om å bli lagt til i kontaktlisten din." + +#: ../libpurple/protocols/oscar/oscar.c:2419 #, c-format msgid "" "You have received a special message\n" @@ -8911,7 +8708,7 @@ "Fra: %s [%s]\n" "%s" -#: ../libpurple/protocols/oscar/oscar.c:2431 +#: ../libpurple/protocols/oscar/oscar.c:2427 #, c-format msgid "" "You have received an ICQ page\n" @@ -8924,7 +8721,7 @@ "Fra: %s [%s]\n" "%s" -#: ../libpurple/protocols/oscar/oscar.c:2439 +#: ../libpurple/protocols/oscar/oscar.c:2435 #, c-format msgid "" "You have received an ICQ e-mail from %s [%s]\n" @@ -8937,69 +8734,60 @@ "Beskjed:\n" "%s" -#: ../libpurple/protocols/oscar/oscar.c:2460 +#: ../libpurple/protocols/oscar/oscar.c:2456 #, c-format msgid "ICQ user %u has sent you a buddy: %s (%s)" msgstr "ICQ-brukeren %u har sent deg en kontakt: %s (%s)" -#: ../libpurple/protocols/oscar/oscar.c:2466 +#: ../libpurple/protocols/oscar/oscar.c:2462 msgid "Do you want to add this buddy to your buddy list?" msgstr "Ønsker du å legge denne kontakten til i kontaktlisten din?" -#: ../libpurple/protocols/oscar/oscar.c:2471 ../pidgin/gtkroomlist.c:309 -#, fuzzy +#: ../libpurple/protocols/oscar/oscar.c:2467 +#: ../pidgin/gtkroomlist.c:309 msgid "_Add" -msgstr "Legg til" - -#: ../libpurple/protocols/oscar/oscar.c:2472 -#, fuzzy +msgstr "_Legg til" + +#: ../libpurple/protocols/oscar/oscar.c:2468 msgid "_Decline" -msgstr "Avslå" - -#: ../libpurple/protocols/oscar/oscar.c:2596 +msgstr "_Avslå" + +#: ../libpurple/protocols/oscar/oscar.c:2592 #, c-format msgid "You missed %hu message from %s because it was invalid." msgid_plural "You missed %hu messages from %s because they were invalid." msgstr[0] "Du har gått glipp av %hu beskjed fra %s fordi den var ugyldig." msgstr[1] "Du har gått glipp av %hu beskjeder fra %s fordi de var ugyldige." -#: ../libpurple/protocols/oscar/oscar.c:2605 +#: ../libpurple/protocols/oscar/oscar.c:2601 #, c-format msgid "You missed %hu message from %s because it was too large." msgid_plural "You missed %hu messages from %s because they were too large." msgstr[0] "Du har gått glipp av %hu beskjed fra %s fordi den var for stor." msgstr[1] "Du har gått glipp av %hu beskjeder fra %s fordi de var for store." -#: ../libpurple/protocols/oscar/oscar.c:2614 -#, c-format -msgid "" -"You missed %hu message from %s because the rate limit has been exceeded." -msgid_plural "" -"You missed %hu messages from %s because the rate limit has been exceeded." -msgstr[0] "" -"Du har gått glipp av %hu beskjed fra %s fordi hastighetsgrensen har blitt " -"overskredet." -msgstr[1] "" -"Du har gått glipp av %hu beskjeder fra %s fordi hastighetsgrensen har blitt " -"overskredet." - -#: ../libpurple/protocols/oscar/oscar.c:2623 +#: ../libpurple/protocols/oscar/oscar.c:2610 +#, c-format +msgid "You missed %hu message from %s because the rate limit has been exceeded." +msgid_plural "You missed %hu messages from %s because the rate limit has been exceeded." +msgstr[0] "Du har gått glipp av %hu beskjed fra %s fordi hastighetsgrensen har blitt overskredet." +msgstr[1] "Du har gått glipp av %hu beskjeder fra %s fordi hastighetsgrensen har blitt overskredet." + +#: ../libpurple/protocols/oscar/oscar.c:2619 #, c-format msgid "You missed %hu message from %s because he/she was too evil." msgid_plural "You missed %hu messages from %s because he/she was too evil." -msgstr[0] "" -"Du har gått glipp av %hu beskjed fra %s fordi vedkommende var for ond." -msgstr[1] "" -"Du har gått glipp av %hu beskjeder fra %s fordi vedkommende var for ond." - -#: ../libpurple/protocols/oscar/oscar.c:2632 +msgstr[0] "Du har gått glipp av %hu beskjed fra %s fordi vedkommende var for ond." +msgstr[1] "Du har gått glipp av %hu beskjeder fra %s fordi vedkommende var for ond." + +#: ../libpurple/protocols/oscar/oscar.c:2628 #, c-format msgid "You missed %hu message from %s because you are too evil." msgid_plural "You missed %hu messages from %s because you are too evil." msgstr[0] "Du har gått glipp av %hu beskjed fra %s fordi du er for ond." msgstr[1] "Du har gått glipp av %hu beskjeder fra %s fordi du er for ond." -#: ../libpurple/protocols/oscar/oscar.c:2641 +#: ../libpurple/protocols/oscar/oscar.c:2637 #, c-format msgid "You missed %hu message from %s for an unknown reason." msgid_plural "You missed %hu messages from %s for an unknown reason." @@ -9007,563 +8795,465 @@ msgstr[1] "Du har gått glipp av %hu beskjeder fra %s, ingen grunn oppgitt." #. Data is assumed to be the destination sn -#: ../libpurple/protocols/oscar/oscar.c:2796 +#: ../libpurple/protocols/oscar/oscar.c:2792 #, c-format msgid "Unable to send message: %s" msgstr "Kunne ikke sende beskjed: %s" -#: ../libpurple/protocols/oscar/oscar.c:2796 -#: ../libpurple/protocols/oscar/oscar.c:2801 -#: ../libpurple/protocols/oscar/oscar.c:2865 +#: ../libpurple/protocols/oscar/oscar.c:2792 +#: ../libpurple/protocols/oscar/oscar.c:2797 +#: ../libpurple/protocols/oscar/oscar.c:2861 msgid "Unknown reason." msgstr "Ukjent grunn." -#: ../libpurple/protocols/oscar/oscar.c:2799 +#: ../libpurple/protocols/oscar/oscar.c:2795 #: ../libpurple/protocols/sametime/sametime.c:2409 #, c-format msgid "Unable to send message to %s:" -msgstr "Kunne ikke sende beskjed til %s." - -#: ../libpurple/protocols/oscar/oscar.c:2865 +msgstr "Kunne ikke sende beskjed til %s:" + +#: ../libpurple/protocols/oscar/oscar.c:2861 #, c-format msgid "User information not available: %s" msgstr "Brukerinformasjon er ikke tilgjengelig: %s" -#: ../libpurple/protocols/oscar/oscar.c:2896 +#: ../libpurple/protocols/oscar/oscar.c:2892 msgid "Online Since" msgstr "Pålogget siden" -#: ../libpurple/protocols/oscar/oscar.c:2901 +#: ../libpurple/protocols/oscar/oscar.c:2897 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1185 msgid "Member Since" msgstr "Medlem siden" -#: ../libpurple/protocols/oscar/oscar.c:2936 -#, fuzzy +#: ../libpurple/protocols/oscar/oscar.c:2932 msgid "Available Message" -msgstr "Tilstedebeskjed:" - -#: ../libpurple/protocols/oscar/oscar.c:3044 +msgstr "Tilstedebeskjed" + +#: ../libpurple/protocols/oscar/oscar.c:3040 msgid "Your AIM connection may be lost." msgstr "AIM-tilkoblingen kan være brutt." #. The conversion failed! -#: ../libpurple/protocols/oscar/oscar.c:3232 -msgid "" -"[Unable to display a message from this user because it contained invalid " -"characters.]" -msgstr "" -"[Klarte ikke vise en melding fra denne brukeren da den inneholdt ugyldige " -"tegn.]" - -#: ../libpurple/protocols/oscar/oscar.c:3396 -msgid "" -"The last action you attempted could not be performed because you are over " -"the rate limit. Please wait 10 seconds and try again." -msgstr "" -"Den siste kommandoen ble ikke utført fordi du har overskredet " -"hastighetsgrensen. Vennligst vent 10 sekunder og prøv igjen." - -#: ../libpurple/protocols/oscar/oscar.c:3479 +#: ../libpurple/protocols/oscar/oscar.c:3228 +msgid "[Unable to display a message from this user because it contained invalid characters.]" +msgstr "[Klarte ikke vise en melding fra denne brukeren da den inneholdt ugyldige tegn.]" + +#: ../libpurple/protocols/oscar/oscar.c:3392 +msgid "The last action you attempted could not be performed because you are over the rate limit. Please wait 10 seconds and try again." +msgstr "Den siste kommandoen ble ikke utført fordi du har overskredet hastighetsgrensen. Vennligst vent 10 sekunder og prøv igjen." + +#: ../libpurple/protocols/oscar/oscar.c:3475 #: ../libpurple/protocols/toc/toc.c:977 #, c-format msgid "You have been disconnected from chat room %s." msgstr "Du har blitt koblet fra samtalegruppen %s." -#: ../libpurple/protocols/oscar/oscar.c:3729 +#: ../libpurple/protocols/oscar/oscar.c:3725 #: ../libpurple/protocols/silc/util.c:585 #: ../libpurple/protocols/silc10/util.c:581 msgid "Mobile Phone" msgstr "Mobiltelefon" -#: ../libpurple/protocols/oscar/oscar.c:3759 +#: ../libpurple/protocols/oscar/oscar.c:3755 msgid "Personal Web Page" msgstr "Personlig hjemmeside" -#: ../libpurple/protocols/oscar/oscar.c:3783 +#: ../libpurple/protocols/oscar/oscar.c:3779 #: ../libpurple/protocols/qq/buddy_info.c:40 msgid "Additional Information" msgstr "Tilleggsinformasjon" -#: ../libpurple/protocols/oscar/oscar.c:3791 -#: ../libpurple/protocols/oscar/oscar.c:3804 +#: ../libpurple/protocols/oscar/oscar.c:3787 +#: ../libpurple/protocols/oscar/oscar.c:3800 msgid "Zip Code" msgstr "Postnummer" -#: ../libpurple/protocols/oscar/oscar.c:3815 +#: ../libpurple/protocols/oscar/oscar.c:3811 msgid "Division" msgstr "Avdeling" -#: ../libpurple/protocols/oscar/oscar.c:3816 +#: ../libpurple/protocols/oscar/oscar.c:3812 msgid "Position" msgstr "Stilling" -#: ../libpurple/protocols/oscar/oscar.c:3818 +#: ../libpurple/protocols/oscar/oscar.c:3814 msgid "Web Page" msgstr "Hjemmeside" -#: ../libpurple/protocols/oscar/oscar.c:3821 +#: ../libpurple/protocols/oscar/oscar.c:3817 msgid "Work Information" msgstr "Arbeid ekstra info" -#: ../libpurple/protocols/oscar/oscar.c:3877 +#: ../libpurple/protocols/oscar/oscar.c:3873 msgid "Pop-Up Message" msgstr "Varslingsbeskjed" -#: ../libpurple/protocols/oscar/oscar.c:3917 -#, fuzzy, c-format +#: ../libpurple/protocols/oscar/oscar.c:3913 +#, c-format msgid "The following screen name is associated with %s" msgid_plural "The following screen names are associated with %s" -msgstr[0] "De følgende skjermnavnene er assosierte med %s" +msgstr[0] "Det følgende skjermnavnet er assosierte med %s" msgstr[1] "De følgende skjermnavnene er assosierte med %s" -#: ../libpurple/protocols/oscar/oscar.c:3922 -#, fuzzy +#: ../libpurple/protocols/oscar/oscar.c:3918 msgid "Screen name" -msgstr "_Skjermnavn" - -#: ../libpurple/protocols/oscar/oscar.c:3948 +msgstr "Skjermnavn" + +#: ../libpurple/protocols/oscar/oscar.c:3944 #, c-format msgid "No results found for e-mail address %s" msgstr "Ingen resultater funnet for e-postadresse %s" -#: ../libpurple/protocols/oscar/oscar.c:3969 +#: ../libpurple/protocols/oscar/oscar.c:3965 #, c-format msgid "You should receive an e-mail asking to confirm %s." msgstr "Du vil motta en e-post hvor du blir bedt om å bekrefte %s." -#: ../libpurple/protocols/oscar/oscar.c:3971 +#: ../libpurple/protocols/oscar/oscar.c:3967 msgid "Account Confirmation Requested" msgstr "Kontobekreftelse forespurt" -#: ../libpurple/protocols/oscar/oscar.c:4002 -#, c-format +#: ../libpurple/protocols/oscar/oscar.c:3998 msgid "Error Changing Account Info" msgstr "Feil ved endring av kontoinformasjon" -#: ../libpurple/protocols/oscar/oscar.c:4005 -#, c-format -msgid "" -"Error 0x%04x: Unable to format screen name because the requested screen name " -"differs from the original." -msgstr "" -"Feil 0x%04x: Kunne ikke formatere skjermnavnet fordi det forespurte " -"skjermnavnet er forskjellig fra det opprinnelige." - -#: ../libpurple/protocols/oscar/oscar.c:4008 +#: ../libpurple/protocols/oscar/oscar.c:4001 +#, c-format +msgid "Error 0x%04x: Unable to format screen name because the requested screen name differs from the original." +msgstr "Feil 0x%04x: Kunne ikke formatere skjermnavnet fordi det forespurte skjermnavnet er forskjellig fra det opprinnelige." + +#: ../libpurple/protocols/oscar/oscar.c:4004 #, fuzzy, c-format msgid "Error 0x%04x: Unable to format screen name because it is invalid." -msgstr "" -"Feil 0x%04x: Kunne ikke formatere skjermnavnet fordi det forespurte " -"skjermnavnet er for langt." - -#: ../libpurple/protocols/oscar/oscar.c:4011 -#, c-format -msgid "" -"Error 0x%04x: Unable to format screen name because the requested screen name " -"is too long." -msgstr "" -"Feil 0x%04x: Kunne ikke formatere skjermnavnet fordi det forespurte " -"skjermnavnet er for langt." - -#: ../libpurple/protocols/oscar/oscar.c:4014 -#, c-format -msgid "" -"Error 0x%04x: Unable to change e-mail address because there is already a " -"request pending for this screen name." -msgstr "" -"Feil 0x%04x: Kunne ikke endre e-postadressen fordi det finnes en utestående " -"forespørsel for dette skjermnavnet." - -#: ../libpurple/protocols/oscar/oscar.c:4017 -#, c-format -msgid "" -"Error 0x%04x: Unable to change e-mail address because the given address has " -"too many screen names associated with it." -msgstr "" -"Feil 0x%04x: Kunne ikke endre e-postadressen fordi den gitte adressen har " -"for mange skjermnavn assosiert ved seg." - -#: ../libpurple/protocols/oscar/oscar.c:4020 -#, c-format -msgid "" -"Error 0x%04x: Unable to change e-mail address because the given address is " -"invalid." -msgstr "" -"Feil 0x%04x: Kunne ikke endre e-postadressen fordi den gitte adressen er " -"ugyldig." - -#: ../libpurple/protocols/oscar/oscar.c:4023 +msgstr "Feil 0x%04x: Kunne ikke formatere skjermnavnet fordi det forespurte skjermnavnet er for langt." + +#: ../libpurple/protocols/oscar/oscar.c:4007 +#, c-format +msgid "Error 0x%04x: Unable to format screen name because the requested screen name is too long." +msgstr "Feil 0x%04x: Kunne ikke formatere skjermnavnet fordi det forespurte skjermnavnet er for langt." + +#: ../libpurple/protocols/oscar/oscar.c:4010 +#, c-format +msgid "Error 0x%04x: Unable to change e-mail address because there is already a request pending for this screen name." +msgstr "Feil 0x%04x: Kunne ikke endre e-postadressen fordi det finnes en utestående forespørsel for dette skjermnavnet." + +#: ../libpurple/protocols/oscar/oscar.c:4013 +#, c-format +msgid "Error 0x%04x: Unable to change e-mail address because the given address has too many screen names associated with it." +msgstr "Feil 0x%04x: Kunne ikke endre e-postadressen fordi den gitte adressen har for mange skjermnavn assosiert ved seg." + +#: ../libpurple/protocols/oscar/oscar.c:4016 +#, c-format +msgid "Error 0x%04x: Unable to change e-mail address because the given address is invalid." +msgstr "Feil 0x%04x: Kunne ikke endre e-postadressen fordi den gitte adressen er ugyldig." + +#: ../libpurple/protocols/oscar/oscar.c:4019 #, c-format msgid "Error 0x%04x: Unknown error." msgstr "Feil 0x%04x: Ukjent feil." -#: ../libpurple/protocols/oscar/oscar.c:4033 +#: ../libpurple/protocols/oscar/oscar.c:4029 #, c-format msgid "The e-mail address for %s is %s" msgstr "E-postadressen for %s er %s" -#: ../libpurple/protocols/oscar/oscar.c:4035 +#: ../libpurple/protocols/oscar/oscar.c:4031 msgid "Account Info" msgstr "Kontoinformasjon" -#: ../libpurple/protocols/oscar/oscar.c:4218 -msgid "" -"Your IM Image was not sent. You must be Direct Connected to send IM Images." -msgstr "" -"Ditt direktemeldingsbilde ble ikke sendt. Du må være direkte tilkoplet for å " -"sende direktemeldingsbilder" - -#: ../libpurple/protocols/oscar/oscar.c:4489 +#: ../libpurple/protocols/oscar/oscar.c:4214 +msgid "Your IM Image was not sent. You must be Direct Connected to send IM Images." +msgstr "Ditt direktemeldingsbilde ble ikke sendt. Du må være direkte tilkoplet for og sende direktemeldingsbilder." + +#: ../libpurple/protocols/oscar/oscar.c:4485 msgid "Unable to set AIM profile." msgstr "Kunne ikke sette AIM-profil." -#: ../libpurple/protocols/oscar/oscar.c:4490 -msgid "" -"You have probably requested to set your profile before the login procedure " -"completed. Your profile remains unset; try setting it again when you are " -"fully connected." -msgstr "" -"Du har antakeligvis prøvd å lagre profilinformasjon før " -"innloggingsprosedyren var ferdig. Din profil er ennå ikke blitt lagret. Prøv " -"å lagre den igjen når du er ferdig pålogget." - -#: ../libpurple/protocols/oscar/oscar.c:4504 -#, fuzzy, c-format -msgid "" -"The maximum profile length of %d byte has been exceeded. It has been " -"truncated for you." -msgid_plural "" -"The maximum profile length of %d bytes has been exceeded. It has been " -"truncated for you." -msgstr[0] "" -"Maksimum profillengde på %d bytes har blitt overskredet. Gaim har avkortet " -"den før den ble lagret." -msgstr[1] "" -"Maksimum profillengde på %d bytes har blitt overskredet. Gaim har avkortet " -"den før den ble lagret." - -#: ../libpurple/protocols/oscar/oscar.c:4509 +#: ../libpurple/protocols/oscar/oscar.c:4486 +msgid "You have probably requested to set your profile before the login procedure completed. Your profile remains unset; try setting it again when you are fully connected." +msgstr "Du har antakeligvis prøvd å lagre profilinformasjon før innloggingsprosedyren var ferdig. Din profil er ennå ikke blitt lagret. Prøv å lagre den igjen når du er ferdig pålogget." + +#: ../libpurple/protocols/oscar/oscar.c:4500 +#, c-format +msgid "The maximum profile length of %d byte has been exceeded. It has been truncated for you." +msgid_plural "The maximum profile length of %d bytes has been exceeded. It has been truncated for you." +msgstr[0] "Maksimum profillengde på %d byte har blitt overskredet. Pidgin har avkortet den før den ble lagret." +msgstr[1] "Maksimum profillengde på %d bytes har blitt overskredet. Pidgin har avkortet den før den ble lagret." + +#: ../libpurple/protocols/oscar/oscar.c:4505 msgid "Profile too long." msgstr "Profilen er for stor." -#: ../libpurple/protocols/oscar/oscar.c:4554 -#, fuzzy, c-format -msgid "" -"The maximum away message length of %d byte has been exceeded. It has been " -"truncated for you." -msgid_plural "" -"The maximum away message length of %d bytes has been exceeded. It has been " -"truncated for you." -msgstr[0] "" -"Maksimumslengden på %d bytes for fraværsbeskjeder har blitt overskredet. " -"Gaim har avkortet den." -msgstr[1] "" -"Maksimumslengden på %d bytes for fraværsbeskjeder har blitt overskredet. " -"Gaim har avkortet den." - -#: ../libpurple/protocols/oscar/oscar.c:4559 +#: ../libpurple/protocols/oscar/oscar.c:4550 +#, c-format +msgid "The maximum away message length of %d byte has been exceeded. It has been truncated for you." +msgid_plural "The maximum away message length of %d bytes has been exceeded. It has been truncated for you." +msgstr[0] "Maksimumslengden på %d bytes for fraværsbeskjeder har blitt overskredet. Pidgin har avkortet den." +msgstr[1] "Maksimumslengden på %d bytes for fraværsbeskjeder har blitt overskredet. Pidgin har avkortet den." + +#: ../libpurple/protocols/oscar/oscar.c:4555 msgid "Away message too long." msgstr "Fraværsbeskjeden er for lang." -#: ../libpurple/protocols/oscar/oscar.c:4628 +#: ../libpurple/protocols/oscar/oscar.c:4624 #, fuzzy, c-format -msgid "" -"Could not add the buddy %s because the screen name is invalid. Screen names " -"must be a valid email address, or start with a letter and contain only " -"letters, numbers and spaces, or contain only numbers." -msgstr "" -"Klarte ikke legge til kontakten %s fordi skjermnavnet er ugyldig. Skjernavn " -"må enten starte med en bokstav og inneholde kun bokstaver, tall, og " -"mellomrom, eller bare inneholde nummer." - -#: ../libpurple/protocols/oscar/oscar.c:4630 -#: ../libpurple/protocols/oscar/oscar.c:5060 -#: ../libpurple/protocols/oscar/oscar.c:5075 +msgid "Could not add the buddy %s because the screen name is invalid. Screen names must be a valid email address, or start with a letter and contain only letters, numbers and spaces, or contain only numbers." +msgstr "Klarte ikke legge til kontakten %s fordi skjermnavnet er ugyldig. Skjernavn må enten starte med en bokstav og inneholde kun bokstaver, tall, og mellomrom, eller bare inneholde nummer." + +#: ../libpurple/protocols/oscar/oscar.c:4626 +#: ../libpurple/protocols/oscar/oscar.c:5056 +#: ../libpurple/protocols/oscar/oscar.c:5071 msgid "Unable To Add" msgstr "Kunne ikke legge til" -#: ../libpurple/protocols/oscar/oscar.c:4739 +#: ../libpurple/protocols/oscar/oscar.c:4735 msgid "Unable To Retrieve Buddy List" msgstr "Kunne ikke hente kontaktliste" -#: ../libpurple/protocols/oscar/oscar.c:4740 -#, fuzzy -msgid "" -"The AIM servers were temporarily unable to send your buddy list. Your buddy " -"list is not lost, and will probably become available in a few hours." -msgstr "" -"Gaim klarte ikke å hente kontaktlisten din fra AIM-tjenerne. Kontaktlisten " -"er ikke tapt, og vil sannsynligvis bli tilgjengelig i løpet av få timer." - -#: ../libpurple/protocols/oscar/oscar.c:4922 -#: ../libpurple/protocols/oscar/oscar.c:4924 -#: ../libpurple/protocols/oscar/oscar.c:5140 -#: ../libpurple/protocols/oscar/oscar.c:5141 -#: ../libpurple/protocols/oscar/oscar.c:5146 +#: ../libpurple/protocols/oscar/oscar.c:4736 +msgid "The AIM servers were temporarily unable to send your buddy list. Your buddy list is not lost, and will probably become available in a few hours." +msgstr "Pidgin klarte ikke å hente kontaktlisten din fra AIM-tjenerne. Kontaktlisten er ikke tapt, og vil sannsynligvis bli tilgjengelig i løpet av få timer." + +#: ../libpurple/protocols/oscar/oscar.c:4918 +#: ../libpurple/protocols/oscar/oscar.c:4920 +#: ../libpurple/protocols/oscar/oscar.c:5136 +#: ../libpurple/protocols/oscar/oscar.c:5137 +#: ../libpurple/protocols/oscar/oscar.c:5142 msgid "Orphans" msgstr "Ugrupperte" -#: ../libpurple/protocols/oscar/oscar.c:5058 -#, c-format -msgid "" -"Could not add the buddy %s because you have too many buddies in your buddy " -"list. Please remove one and try again." -msgstr "" -"Kunne ikke legge til kontakten %s fordi du har for mange kontakter i listen. " -"Vennligst fjern en og prøv igjen." - -#: ../libpurple/protocols/oscar/oscar.c:5058 -#: ../libpurple/protocols/oscar/oscar.c:5073 +#: ../libpurple/protocols/oscar/oscar.c:5054 +#, c-format +msgid "Could not add the buddy %s because you have too many buddies in your buddy list. Please remove one and try again." +msgstr "Kunne ikke legge til kontakten %s fordi du har for mange kontakter i listen. Vennligst fjern en og prøv igjen." + +#: ../libpurple/protocols/oscar/oscar.c:5054 +#: ../libpurple/protocols/oscar/oscar.c:5069 msgid "(no name)" msgstr "(uten navn)" -#: ../libpurple/protocols/oscar/oscar.c:5072 -#, fuzzy, c-format +#: ../libpurple/protocols/oscar/oscar.c:5068 +#, c-format msgid "Could not add the buddy %s for an unknown reason." -msgstr "Din kommando feilet av ukjent årsak." - -#: ../libpurple/protocols/oscar/oscar.c:5178 -#, c-format -msgid "" -"The user %s has given you permission to add you to their buddy list. Do you " -"want to add them?" -msgstr "" -"Brukeren %s har gitt deg tillatelse til å legge deg til i kontaktlisten sin. " -"Ønsker du å legge til vedkommende?" - -#: ../libpurple/protocols/oscar/oscar.c:5186 +msgstr "Kunne ikke legge til kontakten %s pga ukjent årsak." + +#: ../libpurple/protocols/oscar/oscar.c:5174 +#, c-format +msgid "The user %s has given you permission to add you to their buddy list. Do you want to add them?" +msgstr "Brukeren %s har gitt deg tillatelse til å legge deg til i kontaktlisten sin. Ønsker du å legge til vedkommende?" + +#: ../libpurple/protocols/oscar/oscar.c:5182 msgid "Authorization Given" msgstr "Godkjent" #. Granted -#: ../libpurple/protocols/oscar/oscar.c:5259 +#: ../libpurple/protocols/oscar/oscar.c:5255 #, c-format msgid "The user %s has granted your request to add them to your buddy list." -msgstr "" -"Brukeren %s har akseptert din forespørsel om å bli lagt til i kontaktlisten " -"din." - -#: ../libpurple/protocols/oscar/oscar.c:5260 +msgstr "Brukeren %s har akseptert din forespørsel om å bli lagt til i kontaktlisten din." + +#: ../libpurple/protocols/oscar/oscar.c:5256 msgid "Authorization Granted" msgstr "Godkjent" #. Denied -#: ../libpurple/protocols/oscar/oscar.c:5263 -#, c-format -msgid "" -"The user %s has denied your request to add them to your buddy list for the " -"following reason:\n" +#: ../libpurple/protocols/oscar/oscar.c:5259 +#, c-format +msgid "" +"The user %s has denied your request to add them to your buddy list for the following reason:\n" "%s" msgstr "" -"Brukeren %s har avslått din forespørsel om å bli lagt til i din kontaktliste " -"med følgende grun:\n" +"Brukeren %s har avslått din forespørsel om å bli lagt til i din kontaktliste med følgende grun:\n" "%s" -#: ../libpurple/protocols/oscar/oscar.c:5264 +#: ../libpurple/protocols/oscar/oscar.c:5260 msgid "Authorization Denied" msgstr "Ikke godkjent" -#: ../libpurple/protocols/oscar/oscar.c:5300 +#: ../libpurple/protocols/oscar/oscar.c:5296 #: ../libpurple/protocols/toc/toc.c:1371 msgid "_Exchange:" msgstr "_Utveksling:" -#: ../libpurple/protocols/oscar/oscar.c:5340 +#: ../libpurple/protocols/oscar/oscar.c:5336 msgid "Invalid chat name specified." msgstr "Ugyldig gruppesamtalenavn oppgitt." -#: ../libpurple/protocols/oscar/oscar.c:5409 +#: ../libpurple/protocols/oscar/oscar.c:5405 msgid "Your IM Image was not sent. You cannot send IM Images in AIM chats." -msgstr "" -"Ditt direktemeldingsbilde ble ikke sendt. Du kan ikke sende " -"direktemeldingsbilder i AIM-samtalegrupper." - -#: ../libpurple/protocols/oscar/oscar.c:5569 -#: ../libpurple/protocols/oscar/oscar.c:5574 +msgstr "Ditt direktemeldingsbilde ble ikke sendt. Du kan ikke sende direktemeldingsbilder i AIM-samtalegrupper." + +#: ../libpurple/protocols/oscar/oscar.c:5567 +#: ../libpurple/protocols/oscar/oscar.c:5572 msgid "Away Message" msgstr "Fraværsbeskjed" -#: ../libpurple/protocols/oscar/oscar.c:5574 -#, fuzzy +#: ../libpurple/protocols/oscar/oscar.c:5572 msgid "(retrieving)" -msgstr " (registrert)" - -#: ../libpurple/protocols/oscar/oscar.c:5774 +msgstr "(mottar)" + +#: ../libpurple/protocols/oscar/oscar.c:5772 msgid "iTunes Music Store Link" -msgstr "" - -#: ../libpurple/protocols/oscar/oscar.c:5882 +msgstr "iTunes Music Store Link" + +#: ../libpurple/protocols/oscar/oscar.c:5880 #, c-format msgid "Buddy Comment for %s" -msgstr "Kontaktkommentar for %s" - -#: ../libpurple/protocols/oscar/oscar.c:5883 +msgstr "Kontakt Kommentar for %s" + +#: ../libpurple/protocols/oscar/oscar.c:5881 msgid "Buddy Comment:" -msgstr "Kontaktkommentar:" - -#: ../libpurple/protocols/oscar/oscar.c:5930 +msgstr "Kontakt Kommentar:" + +#: ../libpurple/protocols/oscar/oscar.c:5928 #, c-format msgid "You have selected to open a Direct IM connection with %s." msgstr "Du har valgt å åpne en direktemelding til %s." -#: ../libpurple/protocols/oscar/oscar.c:5934 -#, fuzzy -msgid "" -"Because this reveals your IP address, it may be considered a security risk. " -"Do you wish to continue?" -msgstr "" -"Dette vil avsløre din IP-adresse til mottakeren, og medføre en (minimal) " -"sikkerhetsrisiko. Ønsker du å fortsette?" - -#: ../libpurple/protocols/oscar/oscar.c:5940 +#: ../libpurple/protocols/oscar/oscar.c:5932 +#, fuzzy +msgid "Because this reveals your IP address, it may be considered a security risk. Do you wish to continue?" +msgstr "Dette vil avsløre din IP-adresse til mottakeren, og medføre en (minimal) sikkerhetsrisiko. Ønsker du å fortsette?" + +#: ../libpurple/protocols/oscar/oscar.c:5938 #: ../libpurple/protocols/oscar/peer.c:1045 -#, fuzzy msgid "C_onnect" -msgstr "Koble til" - -#: ../libpurple/protocols/oscar/oscar.c:5975 -#, fuzzy +msgstr "K_oble til" + +#: ../libpurple/protocols/oscar/oscar.c:5973 msgid "Get AIM Info" -msgstr "Hent informasjon" - -#: ../libpurple/protocols/oscar/oscar.c:5981 +msgstr "Hent AIM Informasjon" + +#: ../libpurple/protocols/oscar/oscar.c:5979 msgid "Edit Buddy Comment" -msgstr "Rediger kontaktkommentar" - -#: ../libpurple/protocols/oscar/oscar.c:5989 +msgstr "Endre Kontakt Kommentar" + +#: ../libpurple/protocols/oscar/oscar.c:5987 msgid "Get Status Msg" msgstr "Hent statusbeskjed" -#: ../libpurple/protocols/oscar/oscar.c:6002 +#: ../libpurple/protocols/oscar/oscar.c:6000 msgid "Direct IM" msgstr "Direkte samtale" -#: ../libpurple/protocols/oscar/oscar.c:6024 +#: ../libpurple/protocols/oscar/oscar.c:6022 msgid "Re-request Authorization" msgstr "Spør på nytt om godkjenning" -#: ../libpurple/protocols/oscar/oscar.c:6083 +#: ../libpurple/protocols/oscar/oscar.c:6081 #, fuzzy msgid "Require authorization" msgstr "Spør om godkjenning" -#: ../libpurple/protocols/oscar/oscar.c:6086 +#: ../libpurple/protocols/oscar/oscar.c:6084 msgid "Web aware (enabling this will cause you to receive SPAM!)" -msgstr "" - -#: ../libpurple/protocols/oscar/oscar.c:6091 +msgstr "Web aware (slår du på denne vil du motta SPAM!)" + +#: ../libpurple/protocols/oscar/oscar.c:6089 #, fuzzy msgid "ICQ Privacy Options" msgstr "Proxyinnstillinger" -#: ../libpurple/protocols/oscar/oscar.c:6110 +#: ../libpurple/protocols/oscar/oscar.c:6108 msgid "The new formatting is invalid." msgstr "Den nye formateringen er ugyldig." -#: ../libpurple/protocols/oscar/oscar.c:6111 +#: ../libpurple/protocols/oscar/oscar.c:6109 msgid "Screen name formatting can change only capitalization and whitespace." -msgstr "" -"Skjermnavn-formatering kan bare endre på store/små bokstaver og mellomrom." - -#: ../libpurple/protocols/oscar/oscar.c:6164 +msgstr "Skjermnavn-formatering kan bare endre på store/små bokstaver og mellomrom." + +#: ../libpurple/protocols/oscar/oscar.c:6162 msgid "Change Address To:" msgstr "Endre adresse til:" -#: ../libpurple/protocols/oscar/oscar.c:6210 +#: ../libpurple/protocols/oscar/oscar.c:6208 msgid "you are not waiting for authorization" msgstr "du venter ikke på godkjenning" -#: ../libpurple/protocols/oscar/oscar.c:6213 +#: ../libpurple/protocols/oscar/oscar.c:6211 msgid "You are awaiting authorization from the following buddies" msgstr "Du venter på godkjenning fra disse kontaktene" -#: ../libpurple/protocols/oscar/oscar.c:6214 -msgid "" -"You can re-request authorization from these buddies by right-clicking on " -"them and selecting \"Re-request Authorization.\"" -msgstr "" -"Du kan spørre om godkjenning på nytt hos disse kontaktene ved å høyreklikke " -"på dem og velge \"Spør på nytt om godkjenning\"." +#: ../libpurple/protocols/oscar/oscar.c:6212 +msgid "You can re-request authorization from these buddies by right-clicking on them and selecting \"Re-request Authorization.\"" +msgstr "Du kan spørre om godkjenning på nytt hos disse kontaktene ved å høyreklikke på dem og velge \"Spør på nytt om Godkjenning.\"" + +#: ../libpurple/protocols/oscar/oscar.c:6229 +msgid "Find Buddy by E-Mail" +msgstr "Finn Kontakt etter e-post" + +#: ../libpurple/protocols/oscar/oscar.c:6230 +msgid "Search for a buddy by e-mail address" +msgstr "Søk etter en kontakt ved hjelp av e-postadresse" #: ../libpurple/protocols/oscar/oscar.c:6231 -msgid "Find Buddy by E-Mail" -msgstr "Finn kontakt etter e-post" - -#: ../libpurple/protocols/oscar/oscar.c:6232 -msgid "Search for a buddy by e-mail address" -msgstr "Kontaktsøk etter e-postadresse" - -#: ../libpurple/protocols/oscar/oscar.c:6233 msgid "Type the e-mail address of the buddy you are searching for." msgstr "Skriv inn e-postadressen til den du søker etter." -#: ../libpurple/protocols/oscar/oscar.c:6236 -#, fuzzy +#: ../libpurple/protocols/oscar/oscar.c:6234 msgid "_Search" -msgstr "Søk" - -#: ../libpurple/protocols/oscar/oscar.c:6394 +msgstr "_Søk" + +#: ../libpurple/protocols/oscar/oscar.c:6392 msgid "Set User Info (URL)..." msgstr "Sett brukerinfo (URL)..." -#: ../libpurple/protocols/oscar/oscar.c:6405 +#: ../libpurple/protocols/oscar/oscar.c:6403 msgid "Change Password (URL)" msgstr "Endre passord (URL)" -#: ../libpurple/protocols/oscar/oscar.c:6409 +#: ../libpurple/protocols/oscar/oscar.c:6407 msgid "Configure IM Forwarding (URL)" msgstr "Konfigurer beskjedvideresending (URL)" #. ICQ actions -#: ../libpurple/protocols/oscar/oscar.c:6419 -#, fuzzy +#: ../libpurple/protocols/oscar/oscar.c:6417 msgid "Set Privacy Options..." -msgstr "Vis flere valg" +msgstr "Sett Privatliv Instillinger..." #. AIM actions -#: ../libpurple/protocols/oscar/oscar.c:6426 +#: ../libpurple/protocols/oscar/oscar.c:6424 msgid "Confirm Account" msgstr "Bekrefte konto" -#: ../libpurple/protocols/oscar/oscar.c:6430 +#: ../libpurple/protocols/oscar/oscar.c:6428 #, fuzzy msgid "Display Currently Registered E-Mail Address" msgstr "Vis nåværende registrert adresse" -#: ../libpurple/protocols/oscar/oscar.c:6434 -#, fuzzy +#: ../libpurple/protocols/oscar/oscar.c:6432 msgid "Change Currently Registered E-Mail Address..." -msgstr "Endre nåværende registrert adresse" - -#: ../libpurple/protocols/oscar/oscar.c:6441 +msgstr "Endre Nåværende Registrert e-post Adresse..." + +#: ../libpurple/protocols/oscar/oscar.c:6439 msgid "Show Buddies Awaiting Authorization" msgstr "Vis kontakter som venter på godkjenning" -#: ../libpurple/protocols/oscar/oscar.c:6447 -#, fuzzy +#: ../libpurple/protocols/oscar/oscar.c:6445 msgid "Search for Buddy by E-Mail Address..." -msgstr "Vennesøk etter e-postadresse" - -#: ../libpurple/protocols/oscar/oscar.c:6452 +msgstr "Søk etter kontakter ved hjelp av e-postadresser..." + +#: ../libpurple/protocols/oscar/oscar.c:6450 msgid "Search for Buddy by Information" msgstr "Vennesøk etter informasjon" -#: ../libpurple/protocols/oscar/oscar.c:6520 +#: ../libpurple/protocols/oscar/oscar.c:6518 #, fuzzy msgid "Use recent buddies group" msgstr "Brukeren er ikke i gruppen" -#: ../libpurple/protocols/oscar/oscar.c:6523 -#, fuzzy +#: ../libpurple/protocols/oscar/oscar.c:6521 msgid "Show how long you have been idle" -msgstr "Lar deg manuelt sette hvor lenge du har vært borte." - -#: ../libpurple/protocols/oscar/oscar.c:6678 +msgstr "Vis hvor lenge du har vært inaktiv" + +#: ../libpurple/protocols/oscar/oscar.c:6676 msgid "" "Always use ICQ proxy server for file transfers\n" "(slower, but does not reveal your IP address)" msgstr "" +"Alltid bruk ICQ proxy server for filoverføring\n" +"(saktere, men avslører ikke din IP adresse)" #: ../libpurple/protocols/oscar/peer.c:697 #, c-format @@ -9571,12 +9261,12 @@ msgstr "Spør %s om å kople til oss på %s:%hu for direktesamtale." #: ../libpurple/protocols/oscar/peer.c:782 -#, fuzzy, c-format +#, c-format msgid "Attempting to connect to %s:%hu." -msgstr "Forsøker å kople til %s på %s:%hu for direktesamtale." +msgstr "Forsøker å kople til %s:%hu." #: ../libpurple/protocols/oscar/peer.c:856 -#, fuzzy, c-format +#, fuzzy msgid "Attempting to connect via proxy server." msgstr "Forsøker å kople til %s på %s:%hu for direktesamtale." @@ -9586,14 +9276,8 @@ msgstr "%s har akkurat spurt om direkte tilkobling til %s" #: ../libpurple/protocols/oscar/peer.c:1037 -msgid "" -"This requires a direct connection between the two computers and is necessary " -"for IM Images. Because your IP address will be revealed, this may be " -"considered a privacy risk." -msgstr "" -"Dette krever at det opprettes en direkte tilkobling mellom de to " -"datamaskinene, men er nødvendig for å sende bilder. Dette kan være en " -"(minimal) sikkerhetsrisiko fordi mottakeren da ser IP-adressen din." +msgid "This requires a direct connection between the two computers and is necessary for IM Images. Because your IP address will be revealed, this may be considered a privacy risk." +msgstr "Dette krever at det opprettes en direkte tilkobling mellom de to datamaskinene, men er nødvendig for å sende bilder. Dette kan være en (minimal) sikkerhetsrisiko fordi mottakeren da ser IP-adressen din." #: ../libpurple/protocols/qq/buddy_info.c:39 #, fuzzy @@ -9607,190 +9291,166 @@ #: ../libpurple/protocols/qq/buddy_info.c:42 msgid "QQ Number" -msgstr "" +msgstr "QQ Nummer" #: ../libpurple/protocols/qq/buddy_info.c:47 -#, fuzzy msgid "Country/Region" msgstr "Land" #: ../libpurple/protocols/qq/buddy_info.c:48 msgid "Province/State" -msgstr "" +msgstr "Fylke/stat" #: ../libpurple/protocols/qq/buddy_info.c:50 msgid "Horoscope Symbol" -msgstr "" +msgstr "Horoskoptegn" #: ../libpurple/protocols/qq/buddy_info.c:52 msgid "Zodiac Sign" -msgstr "" +msgstr "Stjernetegn" #: ../libpurple/protocols/qq/buddy_info.c:53 msgid "Blood Type" -msgstr "" +msgstr "Blodtype" #: ../libpurple/protocols/qq/buddy_info.c:54 -#, fuzzy msgid "College" -msgstr "_Lukk" +msgstr "Universitet" #: ../libpurple/protocols/qq/buddy_info.c:55 msgid "Email" msgstr "E-post" #: ../libpurple/protocols/qq/buddy_info.c:57 -#, fuzzy msgid "Zipcode" msgstr "Postnummer" #: ../libpurple/protocols/qq/buddy_info.c:58 -#, fuzzy msgid "Cellphone Number" -msgstr "Telefonnummer" +msgstr "Mobilnummer" #: ../libpurple/protocols/qq/buddy_info.c:59 -#, fuzzy msgid "Phone Number" msgstr "Telefonnummer" #: ../libpurple/protocols/qq/buddy_info.c:64 msgid "Aquarius" -msgstr "" +msgstr "Vannmannen" #: ../libpurple/protocols/qq/buddy_info.c:64 -#, fuzzy msgid "Pisces" -msgstr "Bilder" +msgstr "Fiskene" #: ../libpurple/protocols/qq/buddy_info.c:64 -#, fuzzy msgid "Aries" -msgstr "Adresse" +msgstr "Væren" #: ../libpurple/protocols/qq/buddy_info.c:64 -#, fuzzy msgid "Taurus" -msgstr "Tyrkisk" +msgstr "Tyren" #: ../libpurple/protocols/qq/buddy_info.c:65 -#, fuzzy msgid "Gemini" -msgstr "Tysk" +msgstr "Tvillingen" #: ../libpurple/protocols/qq/buddy_info.c:65 -#, fuzzy msgid "Cancer" -msgstr "_Avbryt" +msgstr "Krepsen" #: ../libpurple/protocols/qq/buddy_info.c:65 msgid "Leo" -msgstr "" +msgstr "Løven" #: ../libpurple/protocols/qq/buddy_info.c:65 msgid "Virgo" -msgstr "" +msgstr "Jomfruen" #: ../libpurple/protocols/qq/buddy_info.c:65 msgid "Libra" -msgstr "" +msgstr "Vekten" #: ../libpurple/protocols/qq/buddy_info.c:66 -#, fuzzy msgid "Scorpio" -msgstr "Abonnement" +msgstr "Skorpionen" #: ../libpurple/protocols/qq/buddy_info.c:66 msgid "Sagittarius" -msgstr "" +msgstr "Skytten" #: ../libpurple/protocols/qq/buddy_info.c:66 msgid "Capricorn" -msgstr "" +msgstr "Steinbukken" #: ../libpurple/protocols/qq/buddy_info.c:71 -#, fuzzy msgid "Rat" -msgstr "Direkte" +msgstr "Rotte" #: ../libpurple/protocols/qq/buddy_info.c:71 msgid "Ox" -msgstr "" +msgstr "Okse" # #: ../libpurple/protocols/qq/buddy_info.c:71 -#, fuzzy msgid "Tiger" -msgstr "Tid" +msgstr "Tiger" #: ../libpurple/protocols/qq/buddy_info.c:71 msgid "Rabbit" -msgstr "" +msgstr "Hare" #: ../libpurple/protocols/qq/buddy_info.c:72 msgid "Dragon" -msgstr "" +msgstr "Drage" #: ../libpurple/protocols/qq/buddy_info.c:72 -#, fuzzy msgid "Snake" -msgstr "Lagre" +msgstr "Slange" #: ../libpurple/protocols/qq/buddy_info.c:72 -#, fuzzy msgid "Horse" -msgstr "Porter" +msgstr "Hest" #: ../libpurple/protocols/qq/buddy_info.c:72 msgid "Goat" -msgstr "" +msgstr "Geit" #: ../libpurple/protocols/qq/buddy_info.c:72 -#, fuzzy msgid "Monkey" -msgstr "Ingen" +msgstr "Ape" #: ../libpurple/protocols/qq/buddy_info.c:73 -#, fuzzy msgid "Rooster" -msgstr "Registrer" +msgstr "Hane" #: ../libpurple/protocols/qq/buddy_info.c:73 msgid "Dog" -msgstr "" +msgstr "Hund" #: ../libpurple/protocols/qq/buddy_info.c:73 -#, fuzzy msgid "Pig" -msgstr "Ping" +msgstr "Gris" #: ../libpurple/protocols/qq/buddy_info.c:78 -#, fuzzy msgid "Other" -msgstr "Opera" +msgstr "Andre" #: ../libpurple/protocols/qq/buddy_info.c:481 #: ../libpurple/protocols/qq/buddy_info.c:482 -#, fuzzy msgid "Modify my information" -msgstr "Kontaktinformasjon" +msgstr "Endre min informasjon" #: ../libpurple/protocols/qq/buddy_info.c:483 -#, fuzzy msgid "Update my information" -msgstr "Brukerinformasjon" +msgstr "Oppdater min informasjon" #: ../libpurple/protocols/qq/buddy_info.c:507 -#, fuzzy msgid "Your information has been updated" -msgstr "Passordet ditt har blitt endret." +msgstr "Din informasjon har blitt oppdatert" #: ../libpurple/protocols/qq/buddy_info.c:560 #, c-format -msgid "" -"Setting custom faces is not currently supported. Please choose an image from " -"%s." -msgstr "" +msgid "Setting custom faces is not currently supported. Please choose an image from %s." +msgstr "Å sette custum fjes er for tiden ikke støttet. Vennligst velg et bilde fra %s." #: ../libpurple/protocols/qq/buddy_info.c:577 #: ../libpurple/protocols/qq/buddy_info.c:590 @@ -9806,18 +9466,17 @@ #: ../libpurple/protocols/qq/buddy_opt.c:209 msgid "Input your reason:" -msgstr "" +msgstr "Sett inn din grunn:" #: ../libpurple/protocols/qq/buddy_opt.c:212 -#, fuzzy msgid "Reject request" -msgstr "Uventet forespørsel" +msgstr "Avslå forespørsel" #. title #: ../libpurple/protocols/qq/buddy_opt.c:213 #: ../libpurple/protocols/qq/group_opt.c:141 msgid "Sorry, you are not my type..." -msgstr "" +msgstr "Dessverre, du er ikke min type..." #: ../libpurple/protocols/qq/buddy_opt.c:277 #, fuzzy @@ -9827,12 +9486,12 @@ #. TODO: We don't really need to notify the user about this, do we? #: ../libpurple/protocols/qq/buddy_opt.c:309 msgid "You have successfully removed a buddy" -msgstr "" +msgstr "Fjerning av kompis var vellykket" #. TODO: Does the user really need to be notified about this? #: ../libpurple/protocols/qq/buddy_opt.c:338 msgid "You have successfully removed yourself from your friend's buddy list" -msgstr "" +msgstr "Fjerning av deg selv fra kompisen dins venneliste var vellykket" #: ../libpurple/protocols/qq/buddy_opt.c:404 #, fuzzy, c-format @@ -9842,7 +9501,7 @@ #: ../libpurple/protocols/qq/buddy_opt.c:406 #: ../libpurple/protocols/qq/group_join.c:136 msgid "Input request here" -msgstr "" +msgstr "Sett inn forspørsel her" #. TODO: Awkward string to fix post string freeze - standardize auth dialogues? -evands #: ../libpurple/protocols/qq/buddy_opt.c:407 @@ -9861,9 +9520,9 @@ msgstr "Send" #: ../libpurple/protocols/qq/buddy_opt.c:418 -#, fuzzy, c-format +#, c-format msgid "You have added %d to buddy list" -msgstr "Legg til brukeren i kontaktlisten din" +msgstr "Legg til brukeren %d i kontaktlisten din" #: ../libpurple/protocols/qq/buddy_opt.c:515 #, fuzzy @@ -9877,12 +9536,11 @@ #: ../libpurple/protocols/qq/group.c:65 msgid "ID: " -msgstr "" +msgstr "ID: " #: ../libpurple/protocols/qq/group.c:98 -#, fuzzy msgid "Group ID" -msgstr "Gruppe:" +msgstr "Gruppe ID" #: ../libpurple/protocols/qq/group.c:100 #, fuzzy @@ -9901,28 +9559,27 @@ #: ../libpurple/protocols/qq/group.c:119 msgid "QQ Qun" -msgstr "" +msgstr "QQ Qun" #: ../libpurple/protocols/qq/group.c:120 -#, fuzzy msgid "Please enter external group ID" -msgstr "Vennligst skriv inn navnet på gruppen som skal legges til." +msgstr "Vennligst skriv ekstern gruppe ID" #: ../libpurple/protocols/qq/group.c:121 msgid "You can only search for permanent QQ groups\n" -msgstr "" +msgstr "Du kan kun søke etter permanente QQ grupper\n" #: ../libpurple/protocols/qq/group_im.c:126 #, c-format msgid "User %d requested to join group %d" -msgstr "" +msgstr "Bruker %d spør om du vil være med i gruppen %d" #: ../libpurple/protocols/qq/group_im.c:127 #: ../libpurple/protocols/qq/group_im.c:181 #: ../libpurple/protocols/qq/sys_msg.c:193 -#, fuzzy, c-format +#, c-format msgid "Reason: %s" -msgstr "Brukere på %s: %s" +msgstr "Grunn: %s" #: ../libpurple/protocols/qq/group_im.c:136 #: ../libpurple/protocols/qq/group_im.c:183 @@ -9943,48 +9600,47 @@ #: ../libpurple/protocols/qq/sys_msg.c:91 #: ../libpurple/protocols/qq/sys_msg.c:248 msgid "Approve" -msgstr "" +msgstr "Godkjenn" #: ../libpurple/protocols/qq/group_im.c:180 #, c-format msgid "Your request to join group %d has been rejected by admin %d" -msgstr "" +msgstr "Din forespørsel til å bli med i gruppen %d har blitt avslått av admin %d" #: ../libpurple/protocols/qq/group_im.c:221 #, c-format msgid "Your request to join group %d has been approved by admin %d" -msgstr "" +msgstr "Din forespørsel til å bli med i gruppen %d har blitt godkjent av admin %d" #: ../libpurple/protocols/qq/group_im.c:257 #, c-format msgid "You [%d] have left group \"%d\"" -msgstr "" +msgstr "Du [%d] har forlatt gruppen \"%d\"" #: ../libpurple/protocols/qq/group_im.c:291 #, c-format msgid "You [%d] have been added to group \"%d\"" -msgstr "" +msgstr "Du [%d] har blitt lagt til i gruppen \"%d\"" #: ../libpurple/protocols/qq/group_im.c:292 -#, fuzzy msgid "This group has been added to your buddy list" -msgstr "Ønsker du å legge denne kontakten til i kontaktlisten din?" +msgstr "Denne gruppen har blitt lagt til kontaktlisten din" #: ../libpurple/protocols/qq/group_internal.c:41 msgid "I am not a member" -msgstr "" +msgstr "Jeg ikke en medlem" #: ../libpurple/protocols/qq/group_internal.c:44 msgid "I am a member" -msgstr "" +msgstr "Jeg er en medlem" #: ../libpurple/protocols/qq/group_internal.c:47 msgid "I am applying to join" -msgstr "" +msgstr "Jeg søker om å bli med" #: ../libpurple/protocols/qq/group_internal.c:50 msgid "I am the admin" -msgstr "" +msgstr "Jeg er admin" #: ../libpurple/protocols/qq/group_internal.c:53 #, fuzzy @@ -9994,24 +9650,23 @@ #: ../libpurple/protocols/qq/group_join.c:82 #, fuzzy msgid "This group does not allow others to join" -msgstr "" -"Denne testversjonen tillater ikke mer enn ti samtidige innloggede brukere" +msgstr "Denne testversjonen tillater ikke mer enn ti samtidige innloggede brukere" #: ../libpurple/protocols/qq/group_join.c:233 msgid "You have successfully left the group" -msgstr "" +msgstr "Du har forlatt gruppen" #: ../libpurple/protocols/qq/group_join.c:257 msgid "QQ Group Auth" -msgstr "" +msgstr "QQ Group Auth" #: ../libpurple/protocols/qq/group_join.c:258 msgid "Your authorization request has been accepted by the QQ server" -msgstr "" +msgstr "Din autoriserings forespørsel har blitt godtatt av QQ serveren" #: ../libpurple/protocols/qq/group_join.c:329 msgid "You entered a group ID outside the acceptable range" -msgstr "" +msgstr "Du tastet inn en gruppe ID utenfor den aksepterte rekkevidden" #: ../libpurple/protocols/qq/group_join.c:360 #, fuzzy @@ -10023,11 +9678,13 @@ "Note, if you are the creator, \n" "this operation will eventually remove this Qun." msgstr "" +"NB, om du er lageren, \n" +"denne operasjonen vil til slutt fjerne denne Qun." #: ../libpurple/protocols/qq/group_network.c:92 #, c-format msgid "Code [0x%02X]: %s" -msgstr "" +msgstr "Kode [0x%02X]: %s" #: ../libpurple/protocols/qq/group_network.c:93 #, fuzzy @@ -10042,21 +9699,20 @@ msgstr "Er du sikker på at du vil slette \"%s\"?" #: ../libpurple/protocols/qq/group_opt.c:137 -#, fuzzy msgid "Enter your reason:" -msgstr "%s er ikke pålogget." +msgstr "Skriv din grunn:" #: ../libpurple/protocols/qq/group_opt.c:235 msgid "You have successfully modified Qun member" -msgstr "" +msgstr "Modifisering av Qun medlem vellykket" #: ../libpurple/protocols/qq/group_opt.c:305 msgid "You have successfully modified Qun information" -msgstr "" +msgstr "Modifisering av Qun informasjon vellykket" #: ../libpurple/protocols/qq/group_opt.c:392 msgid "You have successfully created a Qun" -msgstr "" +msgstr "Laging av Qun vellykket" #: ../libpurple/protocols/qq/group_opt.c:394 #, fuzzy @@ -10074,27 +9730,25 @@ msgstr "Send beskjed" #: ../libpurple/protocols/qq/im.c:576 -#, fuzzy msgid "Failed to send IM." -msgstr "Kunne ikke bli med i samtalegruppen" +msgstr "Feilet i å sende direktemelding." #: ../libpurple/protocols/qq/keep_alive.c:87 -#, fuzzy msgid "Keep alive error" -msgstr "Feil ved lesing" +msgstr "Hold i livet feil" #: ../libpurple/protocols/qq/login_logout.c:408 #, fuzzy msgid "Error requesting login token" msgstr "Feil: kunne ikke koble til" -#: ../libpurple/protocols/qq/login_logout.c:486 -#, fuzzy +#: ../libpurple/protocols/qq/login_logout.c:488 msgid "Unable to login, check debug log" -msgstr "Kunne ikke logge på AIM" +msgstr "Kunne ikke logge inn, sjekk debug logg" #. we didn't successfully connect. tdt->toc_fd is valid here -#: ../libpurple/protocols/qq/qq.c:139 ../libpurple/protocols/toc/toc.c:173 +#: ../libpurple/protocols/qq/qq.c:139 +#: ../libpurple/protocols/toc/toc.c:173 #: ../libpurple/protocols/yahoo/yahoo_filexfer.c:109 #: ../libpurple/protocols/yahoo/yahoo_filexfer.c:189 #: ../libpurple/protocols/yahoo/ycht.c:549 @@ -10178,7 +9832,8 @@ msgid "Set My Information" msgstr "Tjenerinformasjon" -#: ../libpurple/protocols/qq/qq.c:536 ../libpurple/protocols/toc/toc.c:1680 +#: ../libpurple/protocols/qq/qq.c:536 +#: ../libpurple/protocols/toc/toc.c:1680 msgid "Change Password" msgstr "Bytt passord" @@ -10189,12 +9844,11 @@ #: ../libpurple/protocols/qq/qq.c:560 msgid "Leave this QQ Qun" -msgstr "" +msgstr "Forlat denne QQ Qun" #: ../libpurple/protocols/qq/qq.c:584 -#, fuzzy msgid "Block this buddy" -msgstr "Blokker brukeren" +msgstr "Blokker denne kontakten" #. *< type #. *< ui_requirement @@ -10206,10 +9860,10 @@ #. *< version #. * summary #. * description -#: ../libpurple/protocols/qq/qq.c:725 ../libpurple/protocols/qq/qq.c:727 -#, fuzzy +#: ../libpurple/protocols/qq/qq.c:725 +#: ../libpurple/protocols/qq/qq.c:727 msgid "QQ Protocol\tPlugin" -msgstr "IRC-protokolltillegg" +msgstr "QQ Protokoll\tTillegg" #: ../libpurple/protocols/qq/qq.c:752 #, fuzzy @@ -10238,9 +9892,9 @@ msgstr "Filsending feilet" #: ../libpurple/protocols/qq/send_file.c:736 -#, fuzzy, c-format +#, c-format msgid "%d canceled the transfer of %s" -msgstr "%s avbrøt overføringen av %s" +msgstr "%d avbrøt overføringen av %s" #: ../libpurple/protocols/qq/sendqueue.c:123 #, fuzzy @@ -10254,9 +9908,8 @@ msgstr "Pålogging feilet (%s)" #: ../libpurple/protocols/qq/sys_msg.c:110 -#, fuzzy msgid "Do you want to add this buddy?" -msgstr "Ønsker du å legge denne kontakten til i kontaktlisten din?" +msgstr "Ønsker du å legge denne kontakten?" #. only need to get value #: ../libpurple/protocols/qq/sys_msg.c:166 @@ -10271,35 +9924,35 @@ msgstr "Ønsker du å overskrive den?" #: ../libpurple/protocols/qq/sys_msg.c:176 -#, fuzzy, c-format +#, c-format msgid "%s has added you [%s] to his or her buddy list" -msgstr "Brukeren %s ønsker å legge til %s i kontaktlisten sin." +msgstr "%s har lagt til deg [%s] til sin kontaktliste" #: ../libpurple/protocols/qq/sys_msg.c:192 #, c-format msgid "User %s rejected your request" -msgstr "" +msgstr "Buker %s har avslått din forespørsel" #: ../libpurple/protocols/qq/sys_msg.c:212 #, c-format msgid "User %s approved your request" -msgstr "" +msgstr "Buker %s har godkjent din forespørsel" #. TODO: this should go through purple_account_request_authorization() #: ../libpurple/protocols/qq/sys_msg.c:238 -#, fuzzy, c-format +#, c-format msgid "%s wants to add you [%s] as a friend" -msgstr "%s ønsker å sende deg en fil." +msgstr "%s ønsker å legge deg [%s] som en venn" #: ../libpurple/protocols/qq/sys_msg.c:239 -#, fuzzy, c-format +#, c-format msgid "Message: %s" -msgstr "Beskjed:" +msgstr "Beskjed: %s" #: ../libpurple/protocols/qq/sys_msg.c:261 -#, fuzzy, c-format +#, c-format msgid "%s is not in your buddy list" -msgstr "Legg til brukeren i kontaktlisten din" +msgstr "%s er ikke i kontaktlisten" #: ../libpurple/protocols/sametime/sametime.c:417 #, fuzzy @@ -10317,9 +9970,9 @@ msgstr "Bruker: %s
" #: ../libpurple/protocols/sametime/sametime.c:1293 -#, fuzzy, c-format +#, c-format msgid "Info for Group %s" -msgstr "Info for %s" +msgstr "Info for gruppe %s" #: ../libpurple/protocols/sametime/sametime.c:1295 #, fuzzy @@ -10327,9 +9980,8 @@ msgstr "Arbeid ekstra info" #: ../libpurple/protocols/sametime/sametime.c:1327 -#, fuzzy msgid "Invite Group to Conference..." -msgstr "Start konferanse" +msgstr "Innviter Gruppe til Konferanse..." #: ../libpurple/protocols/sametime/sametime.c:1337 #, fuzzy @@ -10347,12 +9999,14 @@ msgstr "Venter på at overføringen skal starte" #: ../libpurple/protocols/sametime/sametime.c:1514 +#, fuzzy msgid "Handshake Acknowledged, Sending Login" -msgstr "" +msgstr "Håndtrykk Mottatt, Sender Innlogging" #: ../libpurple/protocols/sametime/sametime.c:1519 +#, fuzzy msgid "Waiting for Login Acknowledgement" -msgstr "" +msgstr "Venter på innloggins mottak" #: ../libpurple/protocols/sametime/sametime.c:1524 #, fuzzy @@ -10365,8 +10019,9 @@ msgstr "Logger på" #: ../libpurple/protocols/sametime/sametime.c:1534 +#, fuzzy msgid "Login Acknowledged" -msgstr "" +msgstr "Innlogging Mottatt" #: ../libpurple/protocols/sametime/sametime.c:1539 #, fuzzy @@ -10375,13 +10030,12 @@ #: ../libpurple/protocols/sametime/sametime.c:1645 #, c-format -msgid "" -"A Sametime administrator has issued the following announcement on server %s" -msgstr "" +msgid "A Sametime administrator has issued the following announcement on server %s" +msgstr "En Sametime admin har satt følgende kunngjøring på serveren %s" #: ../libpurple/protocols/sametime/sametime.c:1650 msgid "Sametime Administrator Announcement" -msgstr "" +msgstr "Sametime Administrator Kunngjøring" #: ../libpurple/protocols/sametime/sametime.c:1702 #, fuzzy @@ -10389,21 +10043,20 @@ msgstr "Tilkoblingen lukket" #: ../libpurple/protocols/sametime/sametime.c:1709 -#, fuzzy, c-format +#, c-format msgid "Error reading from socket: %s" -msgstr "Feil under lesing fra socket." +msgstr "Feil ved lesing fra socket: %s" #. this is a regular connect, error out #: ../libpurple/protocols/sametime/sametime.c:1732 #: ../libpurple/protocols/sametime/sametime.c:3726 -#, fuzzy msgid "Unable to connect to host" -msgstr "Kan ikke koble til tjener." +msgstr "Kan ikke koble til tjener" #: ../libpurple/protocols/sametime/sametime.c:1770 #, c-format msgid "Announcement from %s" -msgstr "" +msgstr "Kunngjøring fra %s" #: ../libpurple/protocols/sametime/sametime.c:1944 #, fuzzy @@ -10422,23 +10075,21 @@ #: ../libpurple/protocols/sametime/sametime.c:3229 msgid "Microphone" -msgstr "" +msgstr "Mikrofon" #: ../libpurple/protocols/sametime/sametime.c:3230 msgid "Speakers" -msgstr "" +msgstr "Høytalere" #: ../libpurple/protocols/sametime/sametime.c:3231 -#, fuzzy msgid "Video Camera" -msgstr "Videosamtale" +msgstr "Videokamera" # #: ../libpurple/protocols/sametime/sametime.c:3269 #: ../libpurple/protocols/sametime/sametime.c:4145 -#, fuzzy msgid "Supports" -msgstr "støtte" +msgstr "Støtter" #: ../libpurple/protocols/sametime/sametime.c:3274 #: ../libpurple/protocols/sametime/sametime.c:4119 @@ -10453,10 +10104,8 @@ #: ../libpurple/protocols/sametime/sametime.c:3381 #, c-format -msgid "" -"Please enter a topic for the new conference, and an invitation message to be " -"sent to %s" -msgstr "" +msgid "Please enter a topic for the new conference, and an invitation message to be sent to %s" +msgstr "Vennligst sett topic for en ny konferanse, og en invitasjons beskjed vil bli sendt til %s" #: ../libpurple/protocols/sametime/sametime.c:3385 #, fuzzy @@ -10474,9 +10123,8 @@ msgstr "Start konferanse" #: ../libpurple/protocols/sametime/sametime.c:3458 -#, fuzzy msgid "Create New Conference..." -msgstr "Start konferanse" +msgstr "Start Ny Konferanse..." #: ../libpurple/protocols/sametime/sametime.c:3465 #, fuzzy @@ -10485,27 +10133,23 @@ #: ../libpurple/protocols/sametime/sametime.c:3466 #, c-format -msgid "" -"Select a conference from the list below to send an invite to user %s. Select " -"\"Create New Conference\" if you'd like to create a new conference to invite " -"this user to." -msgstr "" +msgid "Select a conference from the list below to send an invite to user %s. Select \"Create New Conference\" if you'd like to create a new conference to invite this user to." +msgstr "Velg en konferanse fra listen under for å sende en invitasjon til bruker %s. Velg \"Start Ny Konferanse\" om du vil starte en ny konferanse og invitere denne brukeren til." #: ../libpurple/protocols/sametime/sametime.c:3471 -#, fuzzy msgid "Invite to Conference" -msgstr "Start konferanse" +msgstr "Innviter til Konferanse" #: ../libpurple/protocols/sametime/sametime.c:3562 -#, fuzzy msgid "Invite to Conference..." -msgstr "Start konferanse" +msgstr "Innviter til Konferanse..." #: ../libpurple/protocols/sametime/sametime.c:3567 msgid "Send TEST Announcement" -msgstr "" - -#: ../libpurple/protocols/sametime/sametime.c:3586 ../pidgin/gtkconv.c:4354 +msgstr "Send TEST Kunngjøring" + +#: ../libpurple/protocols/sametime/sametime.c:3586 +#: ../pidgin/gtkconv.c:4417 msgid "Topic:" msgstr "Tema:" @@ -10516,10 +10160,10 @@ #: ../libpurple/protocols/sametime/sametime.c:3636 #, c-format -msgid "" -"No host or IP address has been configured for the Meanwhile account %s. " -"Please enter one below to continue logging in." -msgstr "" +msgid "No host or IP address has been configured for the Meanwhile account %s. Please enter one below to continue logging in." +msgstr "" +"Ingen vert eller IP adresse har blitt konfigurert for Meanwhile kontoen %s. " +"Vennligst skriv inn en under for å fortsette innloggingen." #: ../libpurple/protocols/sametime/sametime.c:3641 #, fuzzy @@ -10531,14 +10175,15 @@ msgid "No Sametime Community Server Specified" msgstr "Kobler til SILC-tjener" -#: ../libpurple/protocols/sametime/sametime.c:3644 ../pidgin/gtkblist.c:4041 +#: ../libpurple/protocols/sametime/sametime.c:3644 +#: ../pidgin/gtkblist.c:4323 msgid "Connect" msgstr "Koble til" #: ../libpurple/protocols/sametime/sametime.c:4135 #, c-format msgid "Unknown (0x%04x)
" -msgstr "" +msgstr "Ukjent (0x%04x)
" #: ../libpurple/protocols/sametime/sametime.c:4137 #, fuzzy @@ -10547,27 +10192,22 @@ #: ../libpurple/protocols/sametime/sametime.c:4301 #: ../libpurple/protocols/sametime/sametime.c:5506 -#, fuzzy msgid "User Name" msgstr "Brukernavn" #: ../libpurple/protocols/sametime/sametime.c:4304 #: ../libpurple/protocols/sametime/sametime.c:5509 msgid "Sametime ID" -msgstr "" +msgstr "Sametime ID" #: ../libpurple/protocols/sametime/sametime.c:4328 msgid "An ambiguous user ID was entered" -msgstr "" +msgstr "En ugyldig bruker ID ble skrevet" #: ../libpurple/protocols/sametime/sametime.c:4329 -#, fuzzy, c-format -msgid "" -"The identifier '%s' may possibly refer to any of the following users. Please " -"select the correct user from the list below to add them to your buddy list." -msgstr "" -"Men enn en bruker ble funnet med det samme navnet. Velg den korrekte " -"brukeren fra lista for å legge til kontaktlista." +#, c-format +msgid "The identifier '%s' may possibly refer to any of the following users. Please select the correct user from the list below to add them to your buddy list." +msgstr "Men enn en bruker ble funnet med det samme navnet %s. Velg den korrekte brukeren fra lista for å legge til kontaktlista." #: ../libpurple/protocols/sametime/sametime.c:4334 #, fuzzy @@ -10581,15 +10221,8 @@ #: ../libpurple/protocols/sametime/sametime.c:4420 #, c-format -msgid "" -"The identifier '%s' did not match any users in your Sametime community. This " -"entry has been removed from your buddy list." -msgstr "" - -#: ../libpurple/protocols/sametime/sametime.c:4425 -#, fuzzy -msgid "Unable to add user" -msgstr "Klarte ikke forby brukeren %s" +msgid "The identifier '%s' did not match any users in your Sametime community. This entry has been removed from your buddy list." +msgstr "Brukeren %s matchet ikke noen av brukerne i ditt Sametime nettverk. Denne oppføringen har blitt fjernet fra kontaktlisten din." #: ../libpurple/protocols/sametime/sametime.c:5011 #, fuzzy, c-format @@ -10606,14 +10239,12 @@ msgstr "Sende kontaktliste" #: ../libpurple/protocols/sametime/sametime.c:5151 -#, fuzzy msgid "Buddy List Storage Mode" -msgstr "Kontaktlistesortering" +msgstr "Lagrings metode for Kontaktliste" #: ../libpurple/protocols/sametime/sametime.c:5154 -#, fuzzy msgid "Local Buddy List Only" -msgstr "Dockable kontaktliste" +msgstr "Kun Lokal Kontaktliste" #: ../libpurple/protocols/sametime/sametime.c:5156 #, fuzzy @@ -10627,27 +10258,26 @@ #: ../libpurple/protocols/sametime/sametime.c:5160 msgid "Synchronize List with Server" -msgstr "" +msgstr "Synkroniser Liste med Server" #: ../libpurple/protocols/sametime/sametime.c:5215 #, c-format msgid "Import Sametime List for Account %s" -msgstr "" +msgstr "Importer Samtime Liste for Konto %s" #: ../libpurple/protocols/sametime/sametime.c:5255 #, c-format msgid "Export Sametime List for Account %s" -msgstr "" +msgstr "Eksporter Samtime Liste for Konto %s" #: ../libpurple/protocols/sametime/sametime.c:5309 -#, fuzzy msgid "Unable to add group: group exists" -msgstr "Kunne ikke legge til %s til nektingsliste (%s)." +msgstr "Kunne ikke legge til gruppe: gruppen eksisterer" #: ../libpurple/protocols/sametime/sametime.c:5310 #, c-format msgid "A group named '%s' already exists in your buddy list." -msgstr "" +msgstr "En gruppe ved navn '%s' eksisterer allerede i kontaktlisten din." #: ../libpurple/protocols/sametime/sametime.c:5313 #: ../libpurple/protocols/sametime/sametime.c:5443 @@ -10657,19 +10287,16 @@ #: ../libpurple/protocols/sametime/sametime.c:5372 msgid "Possible Matches" -msgstr "" +msgstr "Mulige Matcher" #: ../libpurple/protocols/sametime/sametime.c:5388 msgid "Notes Address Book group results" -msgstr "" +msgstr "Noterer Adressebok resultater for gruppe" #: ../libpurple/protocols/sametime/sametime.c:5389 #, c-format -msgid "" -"The identifier '%s' may possibly refer to any of the following Notes Address " -"Book groups. Please select the correct group from the list below to add it " -"to your buddy list." -msgstr "" +msgid "The identifier '%s' may possibly refer to any of the following Notes Address Book groups. Please select the correct group from the list below to add it to your buddy list." +msgstr "'%s' kan referere til hvilken som helst av Notat Adressebok gruppene. Vennligst velg den rette gruppen fra listen under for å legge den til i kontaktlisten din." #: ../libpurple/protocols/sametime/sametime.c:5394 #, fuzzy @@ -10683,10 +10310,8 @@ #: ../libpurple/protocols/sametime/sametime.c:5439 #, c-format -msgid "" -"The identifier '%s' did not match any Notes Address Book groups in your " -"Sametime community." -msgstr "" +msgid "The identifier '%s' did not match any Notes Address Book groups in your Sametime community." +msgstr "'%s' matchet inne noen Notat Adressebok gruppe i ditt Sametime nettverk." #: ../libpurple/protocols/sametime/sametime.c:5480 #, fuzzy @@ -10694,10 +10319,8 @@ msgstr "Legg til i adresseboka" #: ../libpurple/protocols/sametime/sametime.c:5481 -msgid "" -"Enter the name of a Notes Address Book group in the field below to add the " -"group and its members to your buddy list." -msgstr "" +msgid "Enter the name of a Notes Address Book group in the field below to add the group and its members to your buddy list." +msgstr "Skriv inn navnet på en Notat Adressebok gruppe i feltet nedenfor, for å legge til gruppen og dens medlemmer til kontaktlisten din." #: ../libpurple/protocols/sametime/sametime.c:5530 #, fuzzy, c-format @@ -10706,74 +10329,64 @@ #: ../libpurple/protocols/sametime/sametime.c:5531 #, c-format -msgid "" -"The identifier '%s' may possibly refer to any of the following users. You " -"may add these users to your buddy list or send them messages with the action " -"buttons below." -msgstr "" - -#: ../libpurple/protocols/sametime/sametime.c:5538 ../pidgin/gtknotify.c:756 +msgid "The identifier '%s' may possibly refer to any of the following users. You may add these users to your buddy list or send them messages with the action buttons below." +msgstr "'%s' kan referere til hvilken som helst av de følgende brukerne. Du kan legge til disse brukerne til kontaktlisten din eller sende dem beskjeder med handlings knappene under." + +#: ../libpurple/protocols/sametime/sametime.c:5538 +#: ../pidgin/gtknotify.c:755 msgid "Search Results" msgstr "Søkeresultater" #: ../libpurple/protocols/sametime/sametime.c:5563 -#, fuzzy msgid "No matches" msgstr "Ingen treff" #: ../libpurple/protocols/sametime/sametime.c:5564 #, c-format msgid "The identifier '%s' did not match any users in your Sametime community." -msgstr "" +msgstr "'%s' matchet ikke noen av brukerne i ditt Sametime nettverk." #: ../libpurple/protocols/sametime/sametime.c:5568 -#, fuzzy msgid "No Matches" msgstr "Ingen treff" # #: ../libpurple/protocols/sametime/sametime.c:5605 -#, fuzzy msgid "Search for a user" -msgstr "_Søk etter:" +msgstr "Søk etter en bruker" #: ../libpurple/protocols/sametime/sametime.c:5606 -msgid "" -"Enter a name or partial ID in the field below to search for matching users " -"in your Sametime community." -msgstr "" +msgid "Enter a name or partial ID in the field below to search for matching users in your Sametime community." +msgstr "Skriv inn et navn eller delvis ID i feltet under for å søke etter matchende brukere i ditt Sametime nettverk." #: ../libpurple/protocols/sametime/sametime.c:5609 -#, fuzzy msgid "User Search" -msgstr "Søk" +msgstr "Bruker Søk" #: ../libpurple/protocols/sametime/sametime.c:5622 msgid "Import Sametime List..." -msgstr "" +msgstr "Importer Sametime Liste..." #: ../libpurple/protocols/sametime/sametime.c:5626 msgid "Export Sametime List..." -msgstr "" +msgstr "Eksporter Sametime Liste..." #: ../libpurple/protocols/sametime/sametime.c:5630 -#, fuzzy msgid "Add Notes Address Book Group..." -msgstr "Legg til i adresseboka" +msgstr "Legg til i adresseboka..." #: ../libpurple/protocols/sametime/sametime.c:5634 -#, fuzzy msgid "User Search..." -msgstr "Søk" +msgstr "Bruker Søk..." #: ../libpurple/protocols/sametime/sametime.c:5740 msgid "Force login (ignore server redirects)" -msgstr "" +msgstr "Tving innlogging (ignorer server redirects)" #. pretend to be Sametime Connect #: ../libpurple/protocols/sametime/sametime.c:5750 msgid "Hide client identity" -msgstr "" +msgstr "Skjul klient identitet" #: ../libpurple/protocols/silc/buddy.c:52 #: ../libpurple/protocols/silc/buddy.c:410 @@ -10787,7 +10400,7 @@ #: ../libpurple/protocols/silc10/ft.c:338 #, c-format msgid "User %s is not present in the network" -msgstr "Brukeren %s er ikke tilgjengelig i nettverket." +msgstr "Brukeren %s er ikke tilgjengelig i nettverket" #: ../libpurple/protocols/silc/buddy.c:53 #: ../libpurple/protocols/silc/buddy.c:110 @@ -10856,11 +10469,8 @@ #: ../libpurple/protocols/silc/buddy.c:298 #: ../libpurple/protocols/silc10/buddy.c:295 #, c-format -msgid "" -"Key agreement request received from %s. Would you like to perform the key " -"agreement?" -msgstr "" -"Nøkkelavtaleforespørsel motatt fra %s. Ønsker du å gjennomføre nøkkelavtalen?" +msgid "Key agreement request received from %s. Would you like to perform the key agreement?" +msgstr "Nøkkelavtaleforespørsel motatt fra %s. Ønsker du å gjennomføre nøkkelavtalen?" #: ../libpurple/protocols/silc/buddy.c:302 #: ../libpurple/protocols/silc10/buddy.c:299 @@ -10967,13 +10577,8 @@ #: ../libpurple/protocols/silc/buddy.c:726 #: ../libpurple/protocols/silc10/buddy.c:738 -msgid "" -"You cannot receive buddy notifications until you import his/her public key. " -"You can use the Get Public Key command to get the public key." -msgstr "" -"Du kan ikke motta kontaktvarslinger før du importerer hans/hennes offentlige " -"nøkkel. Du kan bruke Hent offentlig nøkkel-kommandoen for å få den " -"offentlige nøkkelen." +msgid "You cannot receive buddy notifications until you import his/her public key. You can use the Get Public Key command to get the public key." +msgstr "Du kan ikke motta kontaktvarslinger før du importerer hans/hennes offentlige nøkkel. Du kan bruke Hent offentlig nøkkel-kommandoen for å få den offentlige nøkkelen." #. Open file selector to select the public key. #: ../libpurple/protocols/silc/buddy.c:1059 @@ -10989,18 +10594,13 @@ #: ../libpurple/protocols/silc/buddy.c:1073 #: ../libpurple/protocols/silc10/buddy.c:1081 -msgid "" -"To add the buddy you must import his/her public key. Press Import to import " -"a public key." -msgstr "" -"For å legge til kontakten må du importere hans/hennes offentlige nøkkel. " -"Trykk Import for å importere en offentlig nøkkel." +msgid "To add the buddy you must import his/her public key. Press Import to import a public key." +msgstr "For å legge til kontakten må du importere hans/hennes offentlige nøkkel. Trykk Import for å importere en offentlig nøkkel." #: ../libpurple/protocols/silc/buddy.c:1077 #: ../libpurple/protocols/silc10/buddy.c:1085 -#, fuzzy msgid "_Import..." -msgstr "Importer..." +msgstr "_Importer..." #: ../libpurple/protocols/silc/buddy.c:1183 #: ../libpurple/protocols/silc10/buddy.c:1181 @@ -11009,21 +10609,13 @@ #: ../libpurple/protocols/silc/buddy.c:1185 #: ../libpurple/protocols/silc10/buddy.c:1183 -msgid "" -"More than one user was found with the same public key. Select the correct " -"user from the list to add to the buddy list." -msgstr "" -"Mer enn en bruker ble funnet med den samme offentlige nøkkelen. Velg den " -"korrekte brukeren fra lista for å legge til kontaktlista." +msgid "More than one user was found with the same public key. Select the correct user from the list to add to the buddy list." +msgstr "Mer enn en bruker ble funnet med den samme offentlige nøkkelen. Velg den korrekte brukeren fra lista for å legge til kontaktlista." #: ../libpurple/protocols/silc/buddy.c:1187 #: ../libpurple/protocols/silc10/buddy.c:1185 -msgid "" -"More than one user was found with the same name. Select the correct user " -"from the list to add to the buddy list." -msgstr "" -"Men enn en bruker ble funnet med det samme navnet. Velg den korrekte " -"brukeren fra lista for å legge til kontaktlista." +msgid "More than one user was found with the same name. Select the correct user from the list to add to the buddy list." +msgstr "Men enn en bruker ble funnet med det samme navnet. Velg den korrekte brukeren fra lista for å legge til kontaktlista." #: ../libpurple/protocols/silc/buddy.c:1474 #: ../libpurple/protocols/silc10/buddy.c:1474 @@ -11221,7 +10813,7 @@ #: ../libpurple/protocols/silc/buddy.c:1661 #: ../libpurple/protocols/silc10/buddy.c:1660 msgid "Get Public Key..." -msgstr "Hent offentlig nøkkel" +msgstr "Hent offentlig nøkkel..." # Litt voldelig? #: ../libpurple/protocols/silc/buddy.c:1668 @@ -11237,7 +10829,7 @@ #: ../libpurple/protocols/silc10/buddy.c:1677 #: ../libpurple/protocols/silc10/chat.c:977 msgid "Draw On Whiteboard" -msgstr "" +msgstr "Tegn på Tavle" #: ../libpurple/protocols/silc/chat.c:39 #: ../libpurple/protocols/silc10/chat.c:39 @@ -11303,7 +10895,7 @@ # Urk... moduser? #: ../libpurple/protocols/silc/chat.c:153 #: ../libpurple/protocols/silc10/chat.c:152 -#, fuzzy, c-format +#, fuzzy msgid "
Channel Modes: " msgstr "
Kanalmoduser: " @@ -11345,19 +10937,8 @@ #: ../libpurple/protocols/silc/chat.c:435 #: ../libpurple/protocols/silc10/chat.c:413 -#, c-format -msgid "" -"Channel authentication is used to secure the channel from unauthorized " -"access. The authentication may be based on passphrase and digital " -"signatures. If passphrase is set, it is required to be able to join. If " -"channel public keys are set then only users whose public keys are listed are " -"able to join." -msgstr "" -"Kanalgodkjenning er brukt for å sikre kanalen fra uautorisert tilgang. " -"Autentifikasjonen kan være basert på en nøkkelsetning og digitale " -"signaturer. Dersom nøkkelsetning er valgt, er dette krevd for å bli med. " -"Dersom digitale signaturer er valgt, så kan kun brukere hvis offentlige " -"nøkkler er listet bli med." +msgid "Channel authentication is used to secure the channel from unauthorized access. The authentication may be based on passphrase and digital signatures. If passphrase is set, it is required to be able to join. If channel public keys are set then only users whose public keys are listed are able to join." +msgstr "Kanalgodkjenning er brukt for å sikre kanalen fra uautorisert tilgang. Autentifikasjonen kan være basert på en nøkkelsetning og digitale signaturer. Dersom nøkkelsetning er valgt, er dette krevd for å bli med. Dersom digitale signaturer er valgt, så kan kun brukere hvis offentlige nøkkler er listet bli med." #: ../libpurple/protocols/silc/chat.c:444 #: ../libpurple/protocols/silc/chat.c:445 @@ -11413,8 +10994,7 @@ #: ../libpurple/protocols/silc/chat.c:743 #: ../libpurple/protocols/silc10/chat.c:727 msgid "Set user limit on channel. Set to zero to reset user limit." -msgstr "" -"Velg brukergrense til kanalen. Velg null for å nullstille brukergrense." +msgstr "Velg brukergrense til kanalen. Velg null for å nullstille brukergrense." #: ../libpurple/protocols/silc/chat.c:907 #: ../libpurple/protocols/silc10/chat.c:891 @@ -11479,8 +11059,7 @@ #: ../libpurple/protocols/silc/chat.c:1045 #: ../libpurple/protocols/silc10/chat.c:1102 #, c-format -msgid "" -"You have to join the %s channel before you are able to join the private group" +msgid "You have to join the %s channel before you are able to join the private group" msgstr "Du må bli med i %s-kanalen før du kan bli med i den private gruppa" #: ../libpurple/protocols/silc/chat.c:1047 @@ -11514,15 +11093,22 @@ #: ../libpurple/protocols/silc10/chat.c:1300 #: ../libpurple/protocols/silc10/silc.c:1138 msgid "Unknown command" -msgstr "Ukjent kommando:" - -#: ../libpurple/protocols/silc/ft.c:85 ../libpurple/protocols/silc/ft.c:101 -#: ../libpurple/protocols/silc/ft.c:104 ../libpurple/protocols/silc/ft.c:108 -#: ../libpurple/protocols/silc/ft.c:112 ../libpurple/protocols/silc/ft.c:116 -#: ../libpurple/protocols/silc/ft.c:120 ../libpurple/protocols/silc/ft.c:272 -#: ../libpurple/protocols/silc/ft.c:277 ../libpurple/protocols/silc/ft.c:282 -#: ../libpurple/protocols/silc/ft.c:288 ../libpurple/protocols/silc/ft.c:425 -#: ../libpurple/protocols/silc10/ft.c:89 ../libpurple/protocols/silc10/ft.c:92 +msgstr "Ukjent kommando" + +#: ../libpurple/protocols/silc/ft.c:85 +#: ../libpurple/protocols/silc/ft.c:101 +#: ../libpurple/protocols/silc/ft.c:104 +#: ../libpurple/protocols/silc/ft.c:108 +#: ../libpurple/protocols/silc/ft.c:112 +#: ../libpurple/protocols/silc/ft.c:116 +#: ../libpurple/protocols/silc/ft.c:120 +#: ../libpurple/protocols/silc/ft.c:272 +#: ../libpurple/protocols/silc/ft.c:277 +#: ../libpurple/protocols/silc/ft.c:282 +#: ../libpurple/protocols/silc/ft.c:288 +#: ../libpurple/protocols/silc/ft.c:425 +#: ../libpurple/protocols/silc10/ft.c:89 +#: ../libpurple/protocols/silc10/ft.c:92 #: ../libpurple/protocols/silc10/ft.c:96 #: ../libpurple/protocols/silc10/ft.c:100 #: ../libpurple/protocols/silc10/ft.c:104 @@ -11534,26 +11120,32 @@ msgid "Secure File Transfer" msgstr "Sikret filoverføring" -#: ../libpurple/protocols/silc/ft.c:86 ../libpurple/protocols/silc/ft.c:102 -#: ../libpurple/protocols/silc/ft.c:105 ../libpurple/protocols/silc/ft.c:109 -#: ../libpurple/protocols/silc/ft.c:113 ../libpurple/protocols/silc/ft.c:117 -#: ../libpurple/protocols/silc/ft.c:121 ../libpurple/protocols/silc10/ft.c:90 -#: ../libpurple/protocols/silc10/ft.c:93 ../libpurple/protocols/silc10/ft.c:97 +#: ../libpurple/protocols/silc/ft.c:86 +#: ../libpurple/protocols/silc/ft.c:102 +#: ../libpurple/protocols/silc/ft.c:105 +#: ../libpurple/protocols/silc/ft.c:109 +#: ../libpurple/protocols/silc/ft.c:113 +#: ../libpurple/protocols/silc/ft.c:117 +#: ../libpurple/protocols/silc/ft.c:121 +#: ../libpurple/protocols/silc10/ft.c:90 +#: ../libpurple/protocols/silc10/ft.c:93 +#: ../libpurple/protocols/silc10/ft.c:97 #: ../libpurple/protocols/silc10/ft.c:101 #: ../libpurple/protocols/silc10/ft.c:105 msgid "Error during file transfer" msgstr "Feil under filoverføring" #: ../libpurple/protocols/silc/ft.c:87 -#, fuzzy msgid "Remote disconnected" -msgstr "Frakoblet." - -#: ../libpurple/protocols/silc/ft.c:106 ../libpurple/protocols/silc10/ft.c:94 +msgstr "Frakoblet" + +#: ../libpurple/protocols/silc/ft.c:106 +#: ../libpurple/protocols/silc10/ft.c:94 msgid "Permission denied" msgstr "Tilgang nektet" -#: ../libpurple/protocols/silc/ft.c:110 ../libpurple/protocols/silc10/ft.c:98 +#: ../libpurple/protocols/silc/ft.c:110 +#: ../libpurple/protocols/silc10/ft.c:98 msgid "Key agreement failed" msgstr "Nøkkelavtale feilet" @@ -11567,36 +11159,44 @@ msgid "Creating connection failed" msgstr "Tilkopling feilet" -#: ../libpurple/protocols/silc/ft.c:122 ../libpurple/protocols/silc10/ft.c:102 +#: ../libpurple/protocols/silc/ft.c:122 +#: ../libpurple/protocols/silc10/ft.c:102 #, fuzzy msgid "File transfer session does not exist" msgstr "Filoverføringsøkt eksisterer ikke" -#: ../libpurple/protocols/silc/ft.c:273 ../libpurple/protocols/silc10/ft.c:206 +#: ../libpurple/protocols/silc/ft.c:273 +#: ../libpurple/protocols/silc10/ft.c:206 msgid "No file transfer session active" msgstr "Ingen filoverføringsøkt aktiv" -#: ../libpurple/protocols/silc/ft.c:278 ../libpurple/protocols/silc10/ft.c:211 +#: ../libpurple/protocols/silc/ft.c:278 +#: ../libpurple/protocols/silc10/ft.c:211 msgid "File transfer already started" msgstr "Filoverføring allerede avbrutt" -#: ../libpurple/protocols/silc/ft.c:283 ../libpurple/protocols/silc10/ft.c:216 +#: ../libpurple/protocols/silc/ft.c:283 +#: ../libpurple/protocols/silc10/ft.c:216 msgid "Could not perform key agreement for file transfer" msgstr "Kunne ikke gjennomføre nøkkelavtale for filoverføring" -#: ../libpurple/protocols/silc/ft.c:289 ../libpurple/protocols/silc10/ft.c:222 +#: ../libpurple/protocols/silc/ft.c:289 +#: ../libpurple/protocols/silc10/ft.c:222 msgid "Could not start the file transfer" msgstr "Kunne ikke starte filoverføring" -#: ../libpurple/protocols/silc/ft.c:426 ../libpurple/protocols/silc10/ft.c:341 +#: ../libpurple/protocols/silc/ft.c:426 +#: ../libpurple/protocols/silc10/ft.c:341 msgid "Cannot send file" msgstr "Kan ikke sende fil" #: ../libpurple/protocols/silc/ops.c:57 +#, fuzzy msgid "Error occurred" -msgstr "" - -#: ../libpurple/protocols/silc/ops.c:533 ../libpurple/protocols/silc/ops.c:542 +msgstr "Feil" + +#: ../libpurple/protocols/silc/ops.c:533 +#: ../libpurple/protocols/silc/ops.c:542 #: ../libpurple/protocols/silc/ops.c:551 #: ../libpurple/protocols/silc10/ops.c:554 #: ../libpurple/protocols/silc10/ops.c:563 @@ -11635,7 +11235,8 @@ msgid "You have been kicked off %s by %s (%s)" msgstr "Du har blitt sparket av %s av %s (%s)" -#: ../libpurple/protocols/silc/ops.c:718 ../libpurple/protocols/silc/ops.c:723 +#: ../libpurple/protocols/silc/ops.c:718 +#: ../libpurple/protocols/silc/ops.c:723 #: ../libpurple/protocols/silc/ops.c:728 #: ../libpurple/protocols/silc10/ops.c:742 #: ../libpurple/protocols/silc10/ops.c:747 @@ -11644,7 +11245,8 @@ msgid "You have been killed by %s (%s)" msgstr "Du har blitt drept av %s (%s)" -#: ../libpurple/protocols/silc/ops.c:749 ../libpurple/protocols/silc/ops.c:754 +#: ../libpurple/protocols/silc/ops.c:749 +#: ../libpurple/protocols/silc/ops.c:754 #: ../libpurple/protocols/silc/ops.c:759 #: ../libpurple/protocols/silc10/ops.c:773 #: ../libpurple/protocols/silc10/ops.c:778 @@ -11700,7 +11302,7 @@ #: ../libpurple/protocols/silc10/chat.c:1039 #, c-format msgid "You are channel founder on %s" -msgstr "Du er kanalstifter på %s" +msgstr "Du er kanalstifter på %s" #: ../libpurple/protocols/silc/ops.c:1131 #: ../libpurple/protocols/silc10/chat.c:1043 @@ -11740,9 +11342,8 @@ #: ../libpurple/protocols/silc/ops.c:1292 #: ../libpurple/protocols/silc10/ops.c:1298 -#, fuzzy msgid "_More..." -msgstr "Mer..." +msgstr "_Mer..." #: ../libpurple/protocols/silc/ops.c:1369 #: ../libpurple/protocols/silc/silc.c:1077 @@ -11870,7 +11471,7 @@ #: ../libpurple/protocols/silc/ops.c:1648 msgid "WATCH" -msgstr "" +msgstr "WATCH" #: ../libpurple/protocols/silc/ops.c:1648 #, fuzzy @@ -11901,21 +11502,20 @@ msgid "Passphrase required" msgstr "Nøkkelsetning kreves" -#: ../libpurple/protocols/silc/pk.c:98 ../libpurple/protocols/silc10/pk.c:104 -#, c-format -msgid "" -"Received %s's public key. Your local copy does not match this key. Would you " -"still like to accept this public key?" -msgstr "" -"Mottok %s's offentlige nøkkel, men din lokale kopi stemmer ikke overens med " -"denne nøkkelen. Ønsker du fremdeles å akseptere denne nøkkelen?" - -#: ../libpurple/protocols/silc/pk.c:103 ../libpurple/protocols/silc10/pk.c:109 +#: ../libpurple/protocols/silc/pk.c:98 +#: ../libpurple/protocols/silc10/pk.c:104 +#, c-format +msgid "Received %s's public key. Your local copy does not match this key. Would you still like to accept this public key?" +msgstr "Mottok %s's offentlige nøkkel, men din lokale kopi stemmer ikke overens med denne nøkkelen. Ønsker du fremdeles å akseptere denne nøkkelen?" + +#: ../libpurple/protocols/silc/pk.c:103 +#: ../libpurple/protocols/silc10/pk.c:109 #, c-format msgid "Received %s's public key. Would you like to accept this public key?" msgstr "Mottok %s's offentlige nøkkel. Ønsker du å akseptere denne nøkkelen?" -#: ../libpurple/protocols/silc/pk.c:107 ../libpurple/protocols/silc10/pk.c:113 +#: ../libpurple/protocols/silc/pk.c:107 +#: ../libpurple/protocols/silc10/pk.c:113 #, c-format msgid "" "Fingerprint and babbleprint for the %s key are:\n" @@ -11923,19 +11523,25 @@ "%s\n" "%s\n" msgstr "" - -#: ../libpurple/protocols/silc/pk.c:110 ../libpurple/protocols/silc/pk.c:139 +"Fingeravtrykk og skravleavtrykk for %s nøkkelen er:\n" +"\n" +"%s\n" +"%s\n" + +#: ../libpurple/protocols/silc/pk.c:110 +#: ../libpurple/protocols/silc/pk.c:139 #: ../libpurple/protocols/silc10/pk.c:116 #: ../libpurple/protocols/silc10/pk.c:142 msgid "Verify Public Key" msgstr "Bekreft offentlig nøkkel" -#: ../libpurple/protocols/silc/pk.c:115 ../libpurple/protocols/silc10/pk.c:121 -#, fuzzy +#: ../libpurple/protocols/silc/pk.c:115 +#: ../libpurple/protocols/silc10/pk.c:121 msgid "_View..." -msgstr "Vis..." - -#: ../libpurple/protocols/silc/pk.c:140 ../libpurple/protocols/silc10/pk.c:143 +msgstr "_Vis..." + +#: ../libpurple/protocols/silc/pk.c:140 +#: ../libpurple/protocols/silc10/pk.c:143 msgid "Unsupported public key type" msgstr "Ustøttet offentlig nøkkeltype" @@ -11957,12 +11563,8 @@ # Er det virkelig "kople til på nytt"? #: ../libpurple/protocols/silc/silc.c:238 #: ../libpurple/protocols/silc10/ops.c:1714 -#, fuzzy -msgid "" -"Resuming detached session failed. Press Reconnect to create new connection." -msgstr "" -"Fortsettelse av løsnet økt misslyktes. Trykk Kople til på nytt for å lage en " -"ny forbindelse" +msgid "Resuming detached session failed. Press Reconnect to create new connection." +msgstr "Fortsettelse av løsnet økt misslyktes. Trykk Kople til på nytt for å lage en ny forbindelse." #: ../libpurple/protocols/silc/silc.c:265 #: ../libpurple/protocols/silc/silc.c:311 @@ -11982,15 +11584,14 @@ msgstr "Kobler til SILC-tjener" #: ../libpurple/protocols/silc/silc.c:352 -#, fuzzy, c-format +#, fuzzy msgid "Could not load SILC key pair" msgstr "Kunne ikke laste den offentlige nøkkelen" #: ../libpurple/protocols/silc/silc.c:366 #: ../libpurple/protocols/silc10/silc.c:355 -#, fuzzy msgid "Unable to create connection" -msgstr "Kunne ikke lage ny tilkobling." +msgstr "Kunne ikke lage ny tilkobling" #: ../libpurple/protocols/silc/silc.c:395 #: ../libpurple/protocols/silc10/silc.c:267 @@ -12004,9 +11605,8 @@ msgstr "Kan ikke klargjøre SILC klientforbindelse" #: ../libpurple/protocols/silc/silc.c:445 -#, fuzzy msgid "Error loading SILC key pair" -msgstr "Genererer SILC-nøkkelpar..." +msgstr "Genererer SILC-nøkkelpar" #: ../libpurple/protocols/silc/silc.c:739 #: ../libpurple/protocols/silc10/silc.c:650 @@ -12014,14 +11614,13 @@ msgstr "Dit nåværende humør" #: ../libpurple/protocols/silc/silc.c:741 -#: ../libpurple/protocols/silc10/silc.c:652 ../pidgin/gtkprefs.c:1641 -#, c-format +#: ../libpurple/protocols/silc10/silc.c:652 +#: ../pidgin/gtkprefs.c:1643 msgid "Normal" msgstr "Normal" #: ../libpurple/protocols/silc/silc.c:755 #: ../libpurple/protocols/silc10/silc.c:666 -#, fuzzy msgid "In love" msgstr "Forelsket" @@ -12086,27 +11685,21 @@ # #: ../libpurple/protocols/silc/silc.c:812 -#, fuzzy msgid "Timezone (UTC)" -msgstr "Tidssone" +msgstr "Tidssone (UTC)" #: ../libpurple/protocols/silc/silc.c:816 #: ../libpurple/protocols/silc/silc.c:817 #: ../libpurple/protocols/silc10/silc.c:729 #: ../libpurple/protocols/silc10/silc.c:730 +#, fuzzy msgid "User Online Status Attributes" -msgstr "" +msgstr "Brukers påloggings kjennetegn" #: ../libpurple/protocols/silc/silc.c:818 #: ../libpurple/protocols/silc10/silc.c:731 -msgid "" -"You can let other users see your online status information and your personal " -"information. Please fill the information you would like other users to see " -"about yourself." -msgstr "" -"Du kan la andre brukere se din tilkoblingsstatusinformasjon og din " -"personlige informasjon. Fyll inn informasjonen du ønsker at andre skal se om " -"deg." +msgid "You can let other users see your online status information and your personal information. Please fill the information you would like other users to see about yourself." +msgstr "Du kan la andre brukere se din tilkoblingsstatusinformasjon og din personlige informasjon. Fyll inn informasjonen du ønsker at andre skal se om deg." #: ../libpurple/protocols/silc/silc.c:859 #: ../libpurple/protocols/silc/silc.c:865 @@ -12128,9 +11721,8 @@ #: ../libpurple/protocols/silc/silc.c:1481 #: ../libpurple/protocols/silc10/silc.c:773 #: ../libpurple/protocols/silc10/silc.c:1410 -#, fuzzy msgid "There is no Message of the Day associated with this connection" -msgstr "Det er ingen dagens melding assosiert med denne tilkoblingen." +msgstr "Det er ingen Dagens Melding assosiert med denne tilkoblingen" #: ../libpurple/protocols/silc/silc.c:911 #: ../libpurple/protocols/silc/silc.c:957 @@ -12146,9 +11738,8 @@ #: ../libpurple/protocols/silc/silc.c:911 #: ../libpurple/protocols/silc10/silc.c:824 -#, fuzzy msgid "Passphrases do not match" -msgstr "De nye passordene stemmer ikke overens." +msgstr "De nye passordene stemmer ikke overens" #: ../libpurple/protocols/silc/silc.c:957 #: ../libpurple/protocols/silc10/silc.c:868 @@ -12158,9 +11749,8 @@ #: ../libpurple/protocols/silc/silc.c:996 #: ../libpurple/protocols/silc10/silc.c:907 -#, fuzzy msgid "Key length" -msgstr "Nøkkellengde: \t%d biter\n" +msgstr "Nøkkellengde" #: ../libpurple/protocols/silc/silc.c:998 #: ../libpurple/protocols/silc10/silc.c:909 @@ -12176,9 +11766,8 @@ #: ../libpurple/protocols/silc/silc.c:1023 #: ../libpurple/protocols/silc10/silc.c:934 -#, fuzzy msgid "Passphrase (retype)" -msgstr "Passord sendt" +msgstr "Passord (skriv inn på nytt)" #: ../libpurple/protocols/silc/silc.c:1030 #: ../libpurple/protocols/silc10/silc.c:941 @@ -12207,7 +11796,7 @@ #: ../libpurple/protocols/silc10/silc.c:1095 #, c-format msgid "User %s is not present in the network" -msgstr "Brukeren %s er ikke tilstedeværende på nettverket" +msgstr "Brukeren %s er ikke tilstedeværende på nettverket" #: ../libpurple/protocols/silc/silc.c:1357 #: ../libpurple/protocols/silc10/silc.c:1286 @@ -12245,9 +11834,9 @@ #: ../libpurple/protocols/silc/silc.c:1590 #: ../libpurple/protocols/silc10/silc.c:1519 -#, fuzzy, c-format +#, c-format msgid "Unknown command: %s, (may be a client bug)" -msgstr "Ukjent kommando: %s, er kansje en lus i Gaim." +msgstr "Ukjent kommando: %s, (kan være en klient bug)" #: ../libpurple/protocols/silc/silc.c:1653 #: ../libpurple/protocols/silc10/silc.c:1582 @@ -12267,8 +11856,7 @@ #: ../libpurple/protocols/silc/silc.c:1666 #: ../libpurple/protocols/silc10/silc.c:1595 msgid "join <channel> [<password>]: Join a chat on this network" -msgstr "" -"join <channel> [<password>]: Join en samtale på dette nettverket" +msgstr "join <channel> [<password>]: Join en samtale på dette nettverket" #: ../libpurple/protocols/silc/silc.c:1670 #: ../libpurple/protocols/silc10/silc.c:1599 @@ -12284,14 +11872,12 @@ #: ../libpurple/protocols/silc10/silc.c:1607 #: ../libpurple/protocols/zephyr/zephyr.c:2685 msgid "msg <nick> <message>: Send a private message to a user" -msgstr "" -"msg <nick> <message>: Send en privat beskjed til en bruker" +msgstr "msg <nick> <message>: Send en privat beskjed til en bruker" #: ../libpurple/protocols/silc/silc.c:1682 #: ../libpurple/protocols/silc10/silc.c:1611 msgid "query <nick> [<message>]: Send a private message to a user" -msgstr "" -"query <nick> [<message>]: Send en privat beskjed til en bruker" +msgstr "query <nick> [<message>]: Send en privat beskjed til en bruker" #: ../libpurple/protocols/silc/silc.c:1686 #: ../libpurple/protocols/silc10/silc.c:1615 @@ -12330,21 +11916,13 @@ #: ../libpurple/protocols/silc/silc.c:1716 #: ../libpurple/protocols/silc10/silc.c:1645 -msgid "" -"cmode <channel> [+|-<modes>] [arguments]: Change or display " -"channel modes" -msgstr "" -"cmode <channel> [+|-<modes>] [arguments]: Forandre eller vis " -"kanal modus" +msgid "cmode <channel> [+|-<modes>] [arguments]: Change or display channel modes" +msgstr "cmode <channel> [+|-<modes>] [arguments]: Forandre eller vis kanal modus" #: ../libpurple/protocols/silc/silc.c:1720 #: ../libpurple/protocols/silc10/silc.c:1649 -msgid "" -"cumode <channel> +|-<modes> <nick>: Change nick's modes " -"on channel" -msgstr "" -"cumode <channel> +|-<modes> <nick>: Forandre nick modus " -"på kanal" +msgid "cumode <channel> +|-<modes> <nick>: Change nick's modes on channel" +msgstr "cumode <channel> +|-<modes> <nick>: Forandre nick modus på kanal" #: ../libpurple/protocols/silc/silc.c:1724 #: ../libpurple/protocols/silc10/silc.c:1653 @@ -12358,12 +11936,8 @@ #: ../libpurple/protocols/silc/silc.c:1732 #: ../libpurple/protocols/silc10/silc.c:1661 -msgid "" -"invite <channel> [-|+]<nick>: invite nick or add/remove from " -"channel invite list" -msgstr "" -"invite <channel> [-|+]<nick>: inviter nick eller legg til/fjern " -"fra kanalens invitasjonsliste" +msgid "invite <channel> [-|+]<nick>: invite nick or add/remove from channel invite list" +msgstr "invite <channel> [-|+]<nick>: inviter nick eller legg til/fjern fra kanalens invitasjonsliste" #: ../libpurple/protocols/silc/silc.c:1736 #: ../libpurple/protocols/silc10/silc.c:1665 @@ -12383,8 +11957,7 @@ #: ../libpurple/protocols/silc/silc.c:1748 #: ../libpurple/protocols/silc10/silc.c:1677 msgid "getkey <nick|server>: Retrieve client's or server's public key" -msgstr "" -"getkey <nick|server>: Få klientens eller serverens offentlige nøkkel" +msgstr "getkey <nick|server>: Få klientens eller serverens offentlige nøkkel" #: ../libpurple/protocols/silc/silc.c:1752 #: ../libpurple/protocols/silc10/silc.c:1681 @@ -12403,12 +11976,8 @@ #: ../libpurple/protocols/silc/silc.c:1765 #: ../libpurple/protocols/silc10/silc.c:1694 -msgid "" -"names [-count|-ops|-halfops|-voices|-normal] <channel(s)>: List " -"specific users in channel(s)" -msgstr "" -"names [-count|-ops|-halfops|-voices|-normal] <channel(s)>: Vis " -"spesifiserte brukere i kanalen/kanlaene" +msgid "names [-count|-ops|-halfops|-voices|-normal] <channel(s)>: List specific users in channel(s)" +msgstr "names [-count|-ops|-halfops|-voices|-normal] <channel(s)>: Vis spesifiserte brukere i kanalen/kanlaene" #. *< type #. *< ui_requirement @@ -12431,7 +12000,8 @@ msgstr "Secure Internet Live Conferencing (SILC) Protokoll" #: ../libpurple/protocols/silc/silc.c:1910 -#: ../libpurple/protocols/silc10/silc.c:1853 ../pidgin/gtkprefs.c:2036 +#: ../libpurple/protocols/silc10/silc.c:1853 +#: ../pidgin/gtkprefs.c:2038 msgid "Network" msgstr "Nettverk" @@ -12450,16 +12020,16 @@ #: ../libpurple/protocols/silc/silc.c:1935 #: ../libpurple/protocols/silc10/silc.c:1878 msgid "Cipher" -msgstr "" +msgstr "Siffrer" #: ../libpurple/protocols/silc/silc.c:1945 #: ../libpurple/protocols/silc10/silc.c:1888 msgid "HMAC" -msgstr "" +msgstr "HMAC" #: ../libpurple/protocols/silc/silc.c:1948 msgid "Use Perfect Forward Secrecy" -msgstr "" +msgstr "Bruker Perfekt Hemmeligholdelse Fremover" #: ../libpurple/protocols/silc/silc.c:1952 #: ../libpurple/protocols/silc10/silc.c:1891 @@ -12475,13 +12045,12 @@ #: ../libpurple/protocols/silc/silc.c:1958 #: ../libpurple/protocols/silc10/silc.c:1897 msgid "Block messages to whiteboard" -msgstr "" +msgstr "Blokker beskjeder til tavle" #: ../libpurple/protocols/silc/silc.c:1961 #: ../libpurple/protocols/silc10/silc.c:1900 -#, fuzzy msgid "Automatically open whiteboard" -msgstr "_Automatisk ekspander kontakter" +msgstr "Åpne tavle automatisk" #: ../libpurple/protocols/silc/silc.c:1964 #: ../libpurple/protocols/silc10/silc.c:1903 @@ -12498,9 +12067,8 @@ #: ../libpurple/protocols/silc/util.c:215 #: ../libpurple/protocols/silc/util.c:257 -#, fuzzy msgid "Cannot create SILC key pair\n" -msgstr "Genererer SILC-nøkkelpar..." +msgstr "Genererer SILC-nøkkelpar\n" #. Hint for translators: Please check the tabulator width here and in #. the next strings (short strings: 2 tabs, longer strings 1 tab, @@ -12519,7 +12087,7 @@ #: ../libpurple/protocols/silc/util.c:362 #: ../libpurple/protocols/silc10/util.c:359 -#, fuzzy, c-format +#, c-format msgid "E-Mail: \t\t%s\n" msgstr "E-post: \t\t%s\n" @@ -12554,9 +12122,9 @@ msgstr "Nøkkellengde: \t%d biter\n" #: ../libpurple/protocols/silc/util.c:372 -#, fuzzy, c-format +#, c-format msgid "Version: \t%s\n" -msgstr "Organisasjon: \t%s\n" +msgstr "Versjon: \t%s\n" #: ../libpurple/protocols/silc/util.c:374 #: ../libpurple/protocols/silc10/util.c:369 @@ -12577,6 +12145,8 @@ "Public Key Babbleprint:\n" "%s" msgstr "" +"Offentlig Nøkkel Skravleavtrykk:\n" +"%s" #: ../libpurple/protocols/silc/util.c:379 #: ../libpurple/protocols/silc/util.c:380 @@ -12603,81 +12173,75 @@ #: ../libpurple/protocols/silc/util.c:587 #: ../libpurple/protocols/silc10/util.c:583 msgid "PDA" -msgstr "Personlig digital assistent" +msgstr "PDA" #: ../libpurple/protocols/silc/util.c:589 #: ../libpurple/protocols/silc10/util.c:585 msgid "Terminal" msgstr "Terminal" -#: ../libpurple/protocols/silc/wb.c:284 ../libpurple/protocols/silc10/wb.c:284 +#: ../libpurple/protocols/silc/wb.c:284 +#: ../libpurple/protocols/silc10/wb.c:284 #, c-format msgid "%s sent message to whiteboard. Would you like to open the whiteboard?" -msgstr "" - -#: ../libpurple/protocols/silc/wb.c:288 ../libpurple/protocols/silc10/wb.c:288 -#, c-format -msgid "" -"%s sent message to whiteboard on %s channel. Would you like to open the " -"whiteboard?" -msgstr "" - -#: ../libpurple/protocols/silc/wb.c:302 ../libpurple/protocols/silc10/wb.c:302 +msgstr "%s sendte beskjed til tavle. Vil du åpne tavlen?" + +#: ../libpurple/protocols/silc/wb.c:288 +#: ../libpurple/protocols/silc10/wb.c:288 +#, c-format +msgid "%s sent message to whiteboard on %s channel. Would you like to open the whiteboard?" +msgstr "%s sendte en beskjed til tavle på kanal %s. Vil du åpne tavlen?" + +#: ../libpurple/protocols/silc/wb.c:302 +#: ../libpurple/protocols/silc10/wb.c:302 msgid "Whiteboard" -msgstr "" +msgstr "Tavle" #: ../libpurple/protocols/silc10/ops.c:1559 msgid "No server statistics available" msgstr "Ingen tjenerstatistikk tilgjengelig" #: ../libpurple/protocols/silc10/ops.c:1931 -#, fuzzy, c-format +#, fuzzy msgid "Failure: Version mismatch, upgrade your client" msgstr "Feil versjon, vennligst oppgrader din klient" #: ../libpurple/protocols/silc10/ops.c:1934 -#, c-format msgid "Failure: Remote does not trust/support your public key" -msgstr "" -"Fjernliggende part støtter eller stoler ikke på ikke din offentlige nøkkel" +msgstr "Fjernliggende part støtter eller stoler ikke på ikke din offentlige nøkkel" #: ../libpurple/protocols/silc10/ops.c:1937 -#, fuzzy, c-format +#, fuzzy msgid "Failure: Remote does not support proposed KE group" msgstr "Fjerntliggende part støtter ikke foreslått KE-gruppe" #: ../libpurple/protocols/silc10/ops.c:1940 -#, c-format msgid "Failure: Remote does not support proposed cipher" msgstr "Fjerntliggende part støtter ikke foreslått krypteringsmetode" #: ../libpurple/protocols/silc10/ops.c:1943 -#, fuzzy, c-format +#, fuzzy msgid "Failure: Remote does not support proposed PKCS" msgstr "Fjerntliggende part støtter ikke foreslått PKCS" #: ../libpurple/protocols/silc10/ops.c:1946 -#, fuzzy, c-format +#, fuzzy msgid "Failure: Remote does not support proposed hash function" msgstr "Fjerntliggende part støtter ikke foreslått nøkkelfunksjon" #: ../libpurple/protocols/silc10/ops.c:1949 -#, c-format msgid "Failure: Remote does not support proposed HMAC" msgstr "Fjerntliggende part støtter ikke foreslått HMAC" #: ../libpurple/protocols/silc10/ops.c:1951 -#, c-format msgid "Failure: Incorrect signature" msgstr "Ugyldig signatur" #: ../libpurple/protocols/silc10/ops.c:1953 -#, c-format msgid "Failure: Invalid cookie" msgstr "Ugyldig informasjonskapsel" #: ../libpurple/protocols/silc10/ops.c:1964 -#, c-format msgid "Failure: Authentication failed" msgstr "Autentisering feilet" @@ -12686,14 +12250,12 @@ msgstr "Kan ikke klargjøre SILC klientforbindelse" #: ../libpurple/protocols/silc10/silc.c:290 -#, fuzzy msgid "John Noname" -msgstr "Etternavn:" +msgstr "Ola Normann" #: ../libpurple/protocols/silc10/silc.c:320 -#, fuzzy msgid "Cannot find/access ~/.silc directory" -msgstr "Kan ikke sende en katalog." +msgstr "Kan ikke finne/åpne ~/.silc katalog" #: ../libpurple/protocols/silc10/silc.c:334 #, fuzzy, c-format @@ -12702,39 +12264,37 @@ #. TODO: do we really want to disconnect on a failure to write? #: ../libpurple/protocols/simple/simple.c:416 -#, fuzzy msgid "Could not write" -msgstr "Kunne ikke sende" +msgstr "Kunne ikke skrive" #: ../libpurple/protocols/simple/simple.c:438 -#: ../libpurple/protocols/simple/simple.c:1529 +#: ../libpurple/protocols/simple/simple.c:1531 msgid "Could not connect" msgstr "Kunne ikke koble til" -#: ../libpurple/protocols/simple/simple.c:1059 +#: ../libpurple/protocols/simple/simple.c:1061 #, fuzzy msgid "Unknown server response." msgstr "Ukjent feil." -#: ../libpurple/protocols/simple/simple.c:1563 -#: ../libpurple/protocols/simple/simple.c:1605 -#: ../libpurple/protocols/simple/simple.c:1618 -#: ../libpurple/protocols/simple/simple.c:1669 +#: ../libpurple/protocols/simple/simple.c:1565 +#: ../libpurple/protocols/simple/simple.c:1607 +#: ../libpurple/protocols/simple/simple.c:1620 +#: ../libpurple/protocols/simple/simple.c:1671 #, fuzzy msgid "Could not create listen socket" msgstr "Kunne ikke opprette socket" -#: ../libpurple/protocols/simple/simple.c:1586 +#: ../libpurple/protocols/simple/simple.c:1588 #, fuzzy msgid "Couldn't resolve host" msgstr "Kunne ikke koble til" -#: ../libpurple/protocols/simple/simple.c:1677 -#, fuzzy +#: ../libpurple/protocols/simple/simple.c:1679 msgid "Could not resolve hostname" -msgstr "Kan ikke finne datamaskinnavnet." - -#: ../libpurple/protocols/simple/simple.c:1694 +msgstr "Kan ikke finne datamaskinnavnet" + +#: ../libpurple/protocols/simple/simple.c:1696 #, fuzzy msgid "SIP screen names may not contain whitespaces or @ symbols" msgstr "IRC-kallenavn kan ikke inneholde mellomrom" @@ -12747,43 +12307,41 @@ #. *< id #. *< name #. *< version -#: ../libpurple/protocols/simple/simple.c:1870 -#, fuzzy +#: ../libpurple/protocols/simple/simple.c:1872 msgid "SIP/SIMPLE Protocol Plugin" -msgstr "SILC-protokolltillegg" +msgstr "SILC/SIMPLE-Protokolltillegg" #. * summary -#: ../libpurple/protocols/simple/simple.c:1871 -#, fuzzy +#: ../libpurple/protocols/simple/simple.c:1873 msgid "The SIP/SIMPLE Protocol Plugin" -msgstr "SILC-protokolltillegg" - -#: ../libpurple/protocols/simple/simple.c:1899 +msgstr "SIP/SIMPLE-Protokolltillegget" + +#: ../libpurple/protocols/simple/simple.c:1901 #, fuzzy msgid "Publish status (note: everyone may watch you)" msgstr "Publiser status (NB: alle kan se deg)" -#: ../libpurple/protocols/simple/simple.c:1905 +#: ../libpurple/protocols/simple/simple.c:1907 #, fuzzy msgid "Use UDP" msgstr "Brukerid" -#: ../libpurple/protocols/simple/simple.c:1907 +#: ../libpurple/protocols/simple/simple.c:1909 #, fuzzy msgid "Use proxy" msgstr "Ingen proxy" -#: ../libpurple/protocols/simple/simple.c:1909 +#: ../libpurple/protocols/simple/simple.c:1911 #, fuzzy msgid "Proxy" msgstr "Ingen proxy" -#: ../libpurple/protocols/simple/simple.c:1911 +#: ../libpurple/protocols/simple/simple.c:1913 #, fuzzy msgid "Auth User" msgstr "AP-bruker" -#: ../libpurple/protocols/simple/simple.c:1913 +#: ../libpurple/protocols/simple/simple.c:1915 #, fuzzy msgid "Auth Domain" msgstr "Automatisk" @@ -12829,7 +12387,6 @@ msgstr "Advarsel %s er ikke tillatt." #: ../libpurple/protocols/toc/toc.c:503 -#, c-format msgid "A message has been dropped, you are exceeding the server speed limit." msgstr "En beskjed ble forkastet. Du overskrider tjenerens fartsgrense." @@ -12854,47 +12411,38 @@ msgstr "Du gikk glipp av en beskjed fra %s fordi den ble sendt for raskt." #: ../libpurple/protocols/toc/toc.c:518 -#, c-format msgid "Failure." msgstr "Feil." #: ../libpurple/protocols/toc/toc.c:521 -#, c-format msgid "Too many matches." msgstr "For mange treff." #: ../libpurple/protocols/toc/toc.c:524 -#, c-format msgid "Need more qualifiers." msgstr "Trenger flere parametre." #: ../libpurple/protocols/toc/toc.c:527 -#, c-format msgid "Dir service temporarily unavailable." msgstr "Katalogtjenesten er midlertidig utilgjengelig." #: ../libpurple/protocols/toc/toc.c:530 -#, c-format msgid "E-mail lookup restricted." msgstr "E-postoppslag er begrenset." #: ../libpurple/protocols/toc/toc.c:533 -#, c-format msgid "Keyword ignored." msgstr "Nøkkelord ignorert." #: ../libpurple/protocols/toc/toc.c:536 -#, c-format msgid "No keywords." msgstr "Ingen nøkkelord." #: ../libpurple/protocols/toc/toc.c:539 -#, c-format msgid "User has no directory information." msgstr "Brukeren har ingen kataloginformasjon." #: ../libpurple/protocols/toc/toc.c:543 -#, c-format msgid "Country not supported." msgstr "Land ikke støttet." @@ -12904,28 +12452,21 @@ msgstr "Ukjent feil: %s." #: ../libpurple/protocols/toc/toc.c:549 -#, fuzzy, c-format +#, fuzzy msgid "Incorrect screen name or password." msgstr "Feil kallenavn eller passord." #: ../libpurple/protocols/toc/toc.c:552 -#, c-format msgid "The service is temporarily unavailable." msgstr "Tjenesten er midlertidig utilgjengelig." #: ../libpurple/protocols/toc/toc.c:555 -#, c-format msgid "Your warning level is currently too high to log in." msgstr "Advarselsnivået ditt er satt for høyt for å logge inn." #: ../libpurple/protocols/toc/toc.c:558 -#, c-format -msgid "" -"You have been connecting and disconnecting too frequently. Wait ten minutes " -"and try again. If you continue to try, you will need to wait even longer." -msgstr "" -"Du har koblet til og koblet fra for hurtig. Vent ti minutter og prøv igjen. " -"Hvis du fortsetter å prøve nå, vil du måtte vente enda lenger." +msgid "You have been connecting and disconnecting too frequently. Wait ten minutes and try again. If you continue to try, you will need to wait even longer." +msgstr "Du har koblet til og koblet fra for hurtig. Vent ti minutter og prøv igjen. Hvis du fortsetter å prøve nå, vil du måtte vente enda lenger." #: ../libpurple/protocols/toc/toc.c:560 #, c-format @@ -12956,12 +12497,13 @@ #: ../libpurple/protocols/toc/toc.c:995 msgid "Password Change Successful" -msgstr "Passordet er endret." - -#: ../libpurple/protocols/toc/toc.c:1366 ../pidgin/gtkblist.c:5582 -#: ../pidgin/gtkblist.c:5932 +msgstr "Passordet er endret" + +#: ../libpurple/protocols/toc/toc.c:1366 +#: ../pidgin/gtkblist.c:5871 +#: ../pidgin/gtkblist.c:6227 msgid "_Group:" -msgstr "Gruppe:" +msgstr "_Gruppe:" #: ../libpurple/protocols/toc/toc.c:1535 msgid "Get Dir Info" @@ -12980,8 +12522,10 @@ msgid "File transfer failed; other side probably canceled." msgstr "Filoverføringen mislyktes - sannsynligvis avbrutt på den andre siden." -#: ../libpurple/protocols/toc/toc.c:1878 ../libpurple/protocols/toc/toc.c:1918 -#: ../libpurple/protocols/toc/toc.c:2042 ../libpurple/protocols/toc/toc.c:2130 +#: ../libpurple/protocols/toc/toc.c:1878 +#: ../libpurple/protocols/toc/toc.c:1918 +#: ../libpurple/protocols/toc/toc.c:2042 +#: ../libpurple/protocols/toc/toc.c:2130 msgid "Could not connect for transfer." msgstr "Kunne ikke koble til for dataoverføring." @@ -12990,9 +12534,8 @@ msgstr "Kunne ikke skrive filhode. Filen vil ikke bli overført." #: ../libpurple/protocols/toc/toc.c:2175 -#, fuzzy msgid "Save As..." -msgstr "Lagre ikon som..." +msgstr "Lagre som..." #: ../libpurple/protocols/toc/toc.c:2209 #, c-format @@ -13016,253 +12559,223 @@ #. *< version #. * summary #. * description -#: ../libpurple/protocols/toc/toc.c:2306 ../libpurple/protocols/toc/toc.c:2308 +#: ../libpurple/protocols/toc/toc.c:2306 +#: ../libpurple/protocols/toc/toc.c:2308 msgid "TOC Protocol Plugin" msgstr "TOC-protokolltillegg" -#: ../libpurple/protocols/yahoo/yahoo.c:782 +#: ../libpurple/protocols/yahoo/yahoo.c:784 #, c-format msgid "%s has sent you a webcam invite, which is not yet supported." -msgstr "" - -#: ../libpurple/protocols/yahoo/yahoo.c:838 +msgstr "%s har sendt deg en webcam invitasjon som enda ikke er støttet." + +#: ../libpurple/protocols/yahoo/yahoo.c:840 msgid "Your Yahoo! message did not get sent." msgstr "Din Yahoo!-beskjed ble ikke sendt." -#: ../libpurple/protocols/yahoo/yahoo.c:960 +#: ../libpurple/protocols/yahoo/yahoo.c:959 #, c-format msgid "Yahoo! system message for %s:" msgstr "Yahoo! systemmelding for %s:" -#: ../libpurple/protocols/yahoo/yahoo.c:1029 +#: ../libpurple/protocols/yahoo/yahoo.c:1028 #, fuzzy msgid "Authorization denied message:" msgstr "Godkjenning nektet, grunn:" -#: ../libpurple/protocols/yahoo/yahoo.c:1047 -#, c-format -msgid "" -"%s has (retroactively) denied your request to add them to your list for the " -"following reason: %s." -msgstr "" -"%s har (tilbakevirkende) avslått din forespørsel om å bli lagt til i " -"kontaktlisten med følgende grunn: %s." - -#: ../libpurple/protocols/yahoo/yahoo.c:1050 +#: ../libpurple/protocols/yahoo/yahoo.c:1046 +#, c-format +msgid "%s has (retroactively) denied your request to add them to your list for the following reason: %s." +msgstr "%s har (tilbakevirkende) avslått din forespørsel om å bli lagt til i kontaktlisten med følgende grunn: %s." + +#: ../libpurple/protocols/yahoo/yahoo.c:1049 #, c-format msgid "%s has (retroactively) denied your request to add them to your list." -msgstr "" -"%s har (tilbakevirkende) avslått din forespørsel om å bli lagt til i " -"kontaktlisten din." - -#: ../libpurple/protocols/yahoo/yahoo.c:1052 +msgstr "%s har (tilbakevirkende) avslått din forespørsel om å bli lagt til i kontaktlisten din." + +#: ../libpurple/protocols/yahoo/yahoo.c:1051 msgid "Add buddy rejected" msgstr "Legge til kontakt avslått" -#: ../libpurple/protocols/yahoo/yahoo.c:1994 -#, fuzzy, c-format -msgid "" -"The Yahoo server has requested the use of an unrecognized authentication " -"method. You will probably not be able to successfully sign on to Yahoo. " -"Check %s for updates." -msgstr "" -"Yahoo-tjeneren har forespurt bruk av en ukjent autentiseringsmetode. Denne " -"versjonen av Gaim vil antakeligvis ikke være i stand til å logge på Yahoo. " -"Sjekk %s for oppdateringer." - -#: ../libpurple/protocols/yahoo/yahoo.c:1997 +#: ../libpurple/protocols/yahoo/yahoo.c:1993 +#, c-format +msgid "The Yahoo server has requested the use of an unrecognized authentication method. You will probably not be able to successfully sign on to Yahoo. Check %s for updates." +msgstr "Yahoo-tjeneren har forespurt bruk av en ukjent autentiseringsmetode. Denne versjonen av Pidgin vil antakeligvis ikke være i stand til å logge på Yahoo. Sjekk %s for oppdateringer." + +#: ../libpurple/protocols/yahoo/yahoo.c:1996 msgid "Failed Yahoo! Authentication" msgstr "Yahoo!-autentisering feilet" -#: ../libpurple/protocols/yahoo/yahoo.c:2063 -#, c-format -msgid "" -"You have tried to ignore %s, but the user is on your buddy list. Clicking " -"\"Yes\" will remove and ignore the buddy." -msgstr "" -"Du forsøkte å ignorere %s, men vedkommende er i kontaktlisten din. Hvis du " -"klikker på \"Ja\" vil kontakten fjernes og ignoreres." - -#: ../libpurple/protocols/yahoo/yahoo.c:2066 +#: ../libpurple/protocols/yahoo/yahoo.c:2062 +#, c-format +msgid "You have tried to ignore %s, but the user is on your buddy list. Clicking \"Yes\" will remove and ignore the buddy." +msgstr "Du forsøkte å ignorere %s, men vedkommende er i kontaktlisten din. Hvis du klikker på \"Ja\" vil kontakten fjernes og ignoreres." + +#: ../libpurple/protocols/yahoo/yahoo.c:2065 msgid "Ignore buddy?" msgstr "Ignorere kontakt?" -#: ../libpurple/protocols/yahoo/yahoo.c:2129 +#: ../libpurple/protocols/yahoo/yahoo.c:2128 msgid "Your account is locked, please log in to the Yahoo! website." -msgstr "Din konto har blitt låst, vennligst logg inn på Yahoo! nettsiden" - -#: ../libpurple/protocols/yahoo/yahoo.c:2132 +msgstr "Din konto har blitt låst, vennligst logg inn på Yahoo! nettsiden." + +#: ../libpurple/protocols/yahoo/yahoo.c:2131 #, c-format msgid "Unknown error number %d. Logging into the Yahoo! website may fix this." -msgstr "" -"Ukjent feilkode %d.\n" -"Om du logger inn på Yahoo! sin nettside, kan dette kansje løse problemet" - -#: ../libpurple/protocols/yahoo/yahoo.c:2186 +msgstr "Ukjent feilkode %d. Om du logger inn på Yahoo! sin nettside, kan dette kanskje løse problemet." + +#: ../libpurple/protocols/yahoo/yahoo.c:2185 #, c-format msgid "Could not add buddy %s to group %s to the server list on account %s." -msgstr "" -"Kunne ikke legge til kontakt %s i gruppen %s i tjenerlisten på konto %s." - -#: ../libpurple/protocols/yahoo/yahoo.c:2189 +msgstr "Kunne ikke legge til kontakt %s i gruppen %s i tjenerlisten på konto %s." + +#: ../libpurple/protocols/yahoo/yahoo.c:2188 msgid "Could not add buddy to server list" msgstr "Kunne ikke legge kontakt til tjenerens kontaktliste" -#: ../libpurple/protocols/yahoo/yahoo.c:2308 +#: ../libpurple/protocols/yahoo/yahoo.c:2307 #, c-format msgid "[ Audible %s/%s/%s.swf ] %s" -msgstr "" - -#: ../libpurple/protocols/yahoo/yahoo.c:2651 +msgstr "[ Hørbar %s/%s/%s.swf ] %s" + +#: ../libpurple/protocols/yahoo/yahoo.c:2650 #, fuzzy msgid "Received unexpected HTTP response from server." msgstr "Ugyldig svar fra tjener." -#: ../libpurple/protocols/yahoo/yahoo.c:2675 -#: ../libpurple/protocols/yahoo/yahoo.c:2861 -#: ../libpurple/protocols/yahoo/yahoo.c:2964 -#: ../libpurple/protocols/yahoo/yahoo.c:2974 +#: ../libpurple/protocols/yahoo/yahoo.c:2674 +#: ../libpurple/protocols/yahoo/yahoo.c:2860 +#: ../libpurple/protocols/yahoo/yahoo.c:2963 +#: ../libpurple/protocols/yahoo/yahoo.c:2973 #: ../libpurple/protocols/yahoo/yahoochat.c:1514 #: ../libpurple/protocols/yahoo/yahoochat.c:1584 #: ../libpurple/protocols/yahoo/ycht.c:585 msgid "Connection problem" msgstr "Problem ved tilkobling" -#: ../libpurple/protocols/yahoo/yahoo.c:2701 +#: ../libpurple/protocols/yahoo/yahoo.c:2700 #, fuzzy, c-format msgid "" "Lost connection with %s:\n" "%s" msgstr "Samtaler med %s" -#: ../libpurple/protocols/yahoo/yahoo.c:2726 +#: ../libpurple/protocols/yahoo/yahoo.c:2725 #, c-format msgid "" "Could not establish a connection with %s:\n" "%s" msgstr "" - -#: ../libpurple/protocols/yahoo/yahoo.c:3081 -#: ../libpurple/protocols/yahoo/yahoo.c:3767 -#, fuzzy +"Kunne ikke koble til med %s:\n" +"%s" + +#: ../libpurple/protocols/yahoo/yahoo.c:3080 +#: ../libpurple/protocols/yahoo/yahoo.c:3766 msgid "Not at Home" msgstr "Ikke hjemme" -#: ../libpurple/protocols/yahoo/yahoo.c:3083 -#: ../libpurple/protocols/yahoo/yahoo.c:3770 -#, fuzzy +#: ../libpurple/protocols/yahoo/yahoo.c:3082 +#: ../libpurple/protocols/yahoo/yahoo.c:3769 msgid "Not at Desk" msgstr "Ikke ved skrivebordet" -#: ../libpurple/protocols/yahoo/yahoo.c:3085 -#: ../libpurple/protocols/yahoo/yahoo.c:3773 -#, fuzzy +#: ../libpurple/protocols/yahoo/yahoo.c:3084 +#: ../libpurple/protocols/yahoo/yahoo.c:3772 msgid "Not in Office" msgstr "Ikke på kontoret" -#: ../libpurple/protocols/yahoo/yahoo.c:3089 -#: ../libpurple/protocols/yahoo/yahoo.c:3779 +#: ../libpurple/protocols/yahoo/yahoo.c:3088 +#: ../libpurple/protocols/yahoo/yahoo.c:3778 msgid "On Vacation" msgstr "På ferie" -#: ../libpurple/protocols/yahoo/yahoo.c:3093 -#: ../libpurple/protocols/yahoo/yahoo.c:3785 +#: ../libpurple/protocols/yahoo/yahoo.c:3092 +#: ../libpurple/protocols/yahoo/yahoo.c:3784 msgid "Stepped Out" msgstr "Ute" -#: ../libpurple/protocols/yahoo/yahoo.c:3186 -#: ../libpurple/protocols/yahoo/yahoo.c:3216 +#: ../libpurple/protocols/yahoo/yahoo.c:3185 +#: ../libpurple/protocols/yahoo/yahoo.c:3215 msgid "Not on server list" msgstr "Ikke på tjenerlisten" -#: ../libpurple/protocols/yahoo/yahoo.c:3233 -#: ../libpurple/protocols/yahoo/yahoo.c:3291 +#: ../libpurple/protocols/yahoo/yahoo.c:3232 +#: ../libpurple/protocols/yahoo/yahoo.c:3290 #, fuzzy msgid "Appear Online" msgstr "Lat som avlogget" -#: ../libpurple/protocols/yahoo/yahoo.c:3236 -#: ../libpurple/protocols/yahoo/yahoo.c:3312 +#: ../libpurple/protocols/yahoo/yahoo.c:3235 +#: ../libpurple/protocols/yahoo/yahoo.c:3311 #, fuzzy msgid "Appear Permanently Offline" msgstr "Lat som avlogget" -#: ../libpurple/protocols/yahoo/yahoo.c:3254 +#: ../libpurple/protocols/yahoo/yahoo.c:3253 #, fuzzy msgid "Presence" msgstr "Innstillinger" -#: ../libpurple/protocols/yahoo/yahoo.c:3297 +#: ../libpurple/protocols/yahoo/yahoo.c:3296 msgid "Appear Offline" msgstr "Lat som avlogget" -#: ../libpurple/protocols/yahoo/yahoo.c:3306 +#: ../libpurple/protocols/yahoo/yahoo.c:3305 #, fuzzy msgid "Don't Appear Permanently Offline" msgstr "Lat som avlogget" -#: ../libpurple/protocols/yahoo/yahoo.c:3354 +#: ../libpurple/protocols/yahoo/yahoo.c:3353 msgid "Join in Chat" msgstr "Bli med i samtalegruppe" -#: ../libpurple/protocols/yahoo/yahoo.c:3360 +#: ../libpurple/protocols/yahoo/yahoo.c:3359 msgid "Initiate Conference" msgstr "Start konferanse" -#: ../libpurple/protocols/yahoo/yahoo.c:3388 +#: ../libpurple/protocols/yahoo/yahoo.c:3387 #, fuzzy msgid "Presence Settings" msgstr "Skjulte Innstillinger" -#: ../libpurple/protocols/yahoo/yahoo.c:3394 +#: ../libpurple/protocols/yahoo/yahoo.c:3393 msgid "Start Doodling" msgstr "Start kruseduller" -#: ../libpurple/protocols/yahoo/yahoo.c:3495 +#: ../libpurple/protocols/yahoo/yahoo.c:3494 #, fuzzy msgid "Activate which ID?" msgstr "Aktiver hvilken ID?" -#: ../libpurple/protocols/yahoo/yahoo.c:3506 +#: ../libpurple/protocols/yahoo/yahoo.c:3505 msgid "Join whom in chat?" msgstr "Bli med hvem i samtalegruppe?" -#: ../libpurple/protocols/yahoo/yahoo.c:3518 +#: ../libpurple/protocols/yahoo/yahoo.c:3517 msgid "Activate ID..." msgstr "Aktiver ID..." -#: ../libpurple/protocols/yahoo/yahoo.c:3522 +#: ../libpurple/protocols/yahoo/yahoo.c:3521 #, fuzzy msgid "Join User in Chat..." msgstr "Bli med bruker i samtalegruppe..." -#: ../libpurple/protocols/yahoo/yahoo.c:3527 +#: ../libpurple/protocols/yahoo/yahoo.c:3526 #, fuzzy msgid "Open Inbox" msgstr "Åpne Hotmail Inbox" -#: ../libpurple/protocols/yahoo/yahoo.c:4119 -#, fuzzy -msgid "Buzz" -msgstr "Buzz!!" - -#: ../libpurple/protocols/yahoo/yahoo.c:4121 -#, c-format -msgid "Buzzing %s..." -msgstr "" - -#: ../libpurple/protocols/yahoo/yahoo.c:4136 +#: ../libpurple/protocols/yahoo/yahoo.c:4135 #, fuzzy msgid "join <room>: Join a chat room on the Yahoo network" -msgstr "" -"join: <rom> [vert]: Bli med i en gruppesamtale på denne serveren" - -#: ../libpurple/protocols/yahoo/yahoo.c:4141 +msgstr "join: <rom> [vert]: Bli med i en gruppesamtale på denne serveren" + +#: ../libpurple/protocols/yahoo/yahoo.c:4140 #, fuzzy msgid "list: List rooms on the Yahoo network" msgstr "list: Vis kanaler på dette nettverket" -#: ../libpurple/protocols/yahoo/yahoo.c:4149 +#: ../libpurple/protocols/yahoo/yahoo.c:4148 msgid "doodle: Request user to start a Doodle session" msgstr "doodle: Forespør en bruker om å starte en Doodle session" @@ -13276,72 +12789,68 @@ #. *< version #. * summary #. * description -#: ../libpurple/protocols/yahoo/yahoo.c:4358 -#: ../libpurple/protocols/yahoo/yahoo.c:4360 +#: ../libpurple/protocols/yahoo/yahoo.c:4357 +#: ../libpurple/protocols/yahoo/yahoo.c:4359 msgid "Yahoo Protocol Plugin" -msgstr "Yahoo-protokolltillegg" - -#: ../libpurple/protocols/yahoo/yahoo.c:4383 +msgstr "Yahoo-Protokolltillegg" + +#: ../libpurple/protocols/yahoo/yahoo.c:4382 msgid "Yahoo Japan" msgstr "Yahoo Japan" -#: ../libpurple/protocols/yahoo/yahoo.c:4386 +#: ../libpurple/protocols/yahoo/yahoo.c:4385 #, fuzzy msgid "Pager server" msgstr "Proxytjener" -#: ../libpurple/protocols/yahoo/yahoo.c:4389 -#, fuzzy +#: ../libpurple/protocols/yahoo/yahoo.c:4388 msgid "Japan Pager server" -msgstr "Japansk personsøker-adresse:" - -#: ../libpurple/protocols/yahoo/yahoo.c:4392 +msgstr "Japansk Personsøker server" + +#: ../libpurple/protocols/yahoo/yahoo.c:4391 msgid "Pager port" -msgstr "Personsøker-port:" - -#: ../libpurple/protocols/yahoo/yahoo.c:4395 +msgstr "Personsøker-port" + +#: ../libpurple/protocols/yahoo/yahoo.c:4394 #, fuzzy msgid "File transfer server" msgstr "Filoverføringsvert" -#: ../libpurple/protocols/yahoo/yahoo.c:4398 +#: ../libpurple/protocols/yahoo/yahoo.c:4397 #, fuzzy msgid "Japan file transfer server" msgstr "Japansk filoverføringsvert" -#: ../libpurple/protocols/yahoo/yahoo.c:4401 +#: ../libpurple/protocols/yahoo/yahoo.c:4400 msgid "File transfer port" msgstr "Filoverføringsport" -#: ../libpurple/protocols/yahoo/yahoo.c:4404 -#, fuzzy +#: ../libpurple/protocols/yahoo/yahoo.c:4403 msgid "Chat room locale" -msgstr "Samtaleromslisteadresse" - -#: ../libpurple/protocols/yahoo/yahoo.c:4407 +msgstr "Samtaleroms språk" + +#: ../libpurple/protocols/yahoo/yahoo.c:4406 msgid "Ignore conference and chatroom invitations" -msgstr "" - -#: ../libpurple/protocols/yahoo/yahoo.c:4415 -#, fuzzy +msgstr "Ignorer konferanse og samtalerom invitasjoner" + +#: ../libpurple/protocols/yahoo/yahoo.c:4414 msgid "Chat room list URL" -msgstr "Samtaleromslisteadresse" - -#: ../libpurple/protocols/yahoo/yahoo.c:4418 +msgstr "Samtaleroms URL" + +#: ../libpurple/protocols/yahoo/yahoo.c:4417 msgid "Yahoo Chat server" -msgstr "" - -#: ../libpurple/protocols/yahoo/yahoo.c:4421 -#, fuzzy +msgstr "Yahoo Chat server" + +#: ../libpurple/protocols/yahoo/yahoo.c:4420 msgid "Yahoo Chat port" -msgstr "Yahoo Japan" +msgstr "Yahoo Chat port" #. Write a local message to this conversation showing that a request for a #. * Doodle session has been made #. #: ../libpurple/protocols/yahoo/yahoo_doodle.c:98 msgid "Sent Doodle request." -msgstr "" +msgstr "Sendte Doodle forespørsel." #: ../libpurple/protocols/yahoo/yahoo_filexfer.c:270 #: ../libpurple/protocols/yahoo/yahoo_filexfer.c:279 @@ -13364,20 +12873,12 @@ msgstr "Yahoo!-profil" #: ../libpurple/protocols/yahoo/yahoo_profile.c:838 -msgid "" -"Sorry, profiles marked as containing adult content are not supported at this " -"time." -msgstr "" -"Beklager, profiler som er markert med vokseninnhold er for tiden ikke " -"støttet." +msgid "Sorry, profiles marked as containing adult content are not supported at this time." +msgstr "Beklager, profiler som er markert med vokseninnhold er for tiden ikke støttet." #: ../libpurple/protocols/yahoo/yahoo_profile.c:840 -#, fuzzy -msgid "" -"If you wish to view this profile, you will need to visit this link in your " -"web browser:" -msgstr "" -"Hvis du ønsker å vise denne profilen, må du åpne denne lenken i en nettleser" +msgid "If you wish to view this profile, you will need to visit this link in your web browser:" +msgstr "Hvis du ønsker å vise denne profilen, må du åpne denne lenken i en nettleser:" #: ../libpurple/protocols/yahoo/yahoo_profile.c:1034 msgid "Yahoo! ID" @@ -13411,7 +12912,6 @@ msgstr "Kul lenke 3" #: ../libpurple/protocols/yahoo/yahoo_profile.c:1190 -#, fuzzy msgid "Last Update" msgstr "Sist oppdatert" @@ -13422,31 +12922,16 @@ #: ../libpurple/protocols/yahoo/yahoo_profile.c:1205 #, fuzzy -msgid "" -"Sorry, this profile seems to be in a language or format that is not " -"supported at this time." -msgstr "" -"Beklager, men denne profilen ser ut til å være i et språk som for øyeblikket " -"ikke er støttet." +msgid "Sorry, this profile seems to be in a language or format that is not supported at this time." +msgstr "Beklager, men denne profilen ser ut til å være i et språk som for øyeblikket ikke er støttet." #: ../libpurple/protocols/yahoo/yahoo_profile.c:1221 -msgid "" -"Could not retrieve the user's profile. This most likely is a temporary " -"server-side problem. Please try again later." -msgstr "" -"Kunne ikke hente ned brukerens profil. Dette er mest sannsynlig et " -"midlertidig server-problem. Vennligst prøv igjen senere." +msgid "Could not retrieve the user's profile. This most likely is a temporary server-side problem. Please try again later." +msgstr "Kunne ikke hente ned brukerens profil. Dette er mest sannsynlig et midlertidig server-problem. Vennligst prøv igjen senere." #: ../libpurple/protocols/yahoo/yahoo_profile.c:1224 -msgid "" -"Could not retrieve the user's profile. This most likely means that the user " -"does not exist; however, Yahoo! sometimes does fail to find a user's " -"profile. If you know that the user exists, please try again later." -msgstr "" -"Kunne ikke hente ned brukerens profil. Dette betyr sannsynligvis at brukeren " -"ikke eksisterer, men merk at Yahoo! noen ganger ikke greier å finne en " -"brukers profil. Om du vet at brukeren eksisterer, vennligst prøv igjen " -"senere." +msgid "Could not retrieve the user's profile. This most likely means that the user does not exist; however, Yahoo! sometimes does fail to find a user's profile. If you know that the user exists, please try again later." +msgstr "Kunne ikke hente ned brukerens profil. Dette betyr sannsynligvis at brukeren ikke eksisterer, men merk at Yahoo! noen ganger ikke greier å finne en brukers profil. Om du vet at brukeren eksisterer, vennligst prøv igjen senere." #: ../libpurple/protocols/yahoo/yahoo_profile.c:1231 msgid "The user's profile is empty." @@ -13467,15 +12952,13 @@ #. -6 #: ../libpurple/protocols/yahoo/yahoochat.c:441 -#, fuzzy msgid "Unknown room" -msgstr "Ukjent feil" +msgstr "Ukjent rom" #. -15 #: ../libpurple/protocols/yahoo/yahoochat.c:444 -#, fuzzy msgid "Maybe the room is full" -msgstr "Kanskje rommet er fullt?" +msgstr "Kanskje rommet er fullt" #. -35 #: ../libpurple/protocols/yahoo/yahoochat.c:447 @@ -13484,10 +12967,8 @@ msgstr "Ikke tilgjengelig" #: ../libpurple/protocols/yahoo/yahoochat.c:451 -msgid "" -"Unknown error. You may need to logout and wait five minutes before being " -"able to rejoin a chatroom" -msgstr "" +msgid "Unknown error. You may need to logout and wait five minutes before being able to rejoin a chatroom" +msgstr "Ukjent feil. Det kan hende du må logge ut og vente fem minutter før du kan entre samtalerommet igjen" #: ../libpurple/protocols/yahoo/yahoochat.c:534 #, c-format @@ -13529,20 +13010,18 @@ msgstr "Problem ved tilkobling til YHCT-tjener." #: ../libpurple/protocols/yahoo/ycht.c:475 -#, fuzzy, c-format +#, c-format msgid "" "Lost connection with server\n" "%s" -msgstr "Du har blitt koblet fra tjeneren." +msgstr "" +"Du har blitt koblet fra tjeneren\n" +"%s" #: ../libpurple/protocols/zephyr/zephyr.c:354 #, fuzzy -msgid "" -"(There was an error converting this message.\t Check the 'Encoding' option " -"in the Account Editor)" -msgstr "" -"(Det oppstod en feil under konverteringen av denne beskjeden.\t Sjekk " -"'encoding'-innstillingen i kontooppsettet)" +msgid "(There was an error converting this message.\t Check the 'Encoding' option in the Account Editor)" +msgstr "(Det oppstod en feil under konverteringen av denne beskjeden.\t Sjekk 'encoding'-innstillingen i kontooppsettet)" #: ../libpurple/protocols/zephyr/zephyr.c:752 #, fuzzy, c-format @@ -13551,9 +13030,8 @@ #: ../libpurple/protocols/zephyr/zephyr.c:791 #: ../libpurple/protocols/zephyr/zephyr.c:1210 -#, fuzzy msgid "Hidden or not logged-in" -msgstr "
Gjemt eller ikke logget inn" +msgstr "Gjemt eller ikke logget inn" #: ../libpurple/protocols/zephyr/zephyr.c:797 #: ../libpurple/protocols/zephyr/zephyr.c:1212 @@ -13593,8 +13071,7 @@ #: ../libpurple/protocols/zephyr/zephyr.c:2700 msgid "instance <instance>: Set the instance to be used on this class" -msgstr "" -"instance <instance>: Sett hendelse som skal brukes for denne klassen" +msgstr "instance <instance>: Sett hendelse som skal brukes for denne klassen" #: ../libpurple/protocols/zephyr/zephyr.c:2705 msgid "inst <instance>: Set the instance to be used on this class" @@ -13602,44 +13079,35 @@ #: ../libpurple/protocols/zephyr/zephyr.c:2710 msgid "topic <instance>: Set the instance to be used on this class" -msgstr "" -"topic <instance>: Sett hendelse som skal brukes for denne klassen" +msgstr "topic <instance>: Sett hendelse som skal brukes for denne klassen" #: ../libpurple/protocols/zephyr/zephyr.c:2716 msgid "sub <class> <instance> <recipient>: Join a new chat" -msgstr "" -"ub <class> <instance> <recipient>: Join en ny samtale" +msgstr "ub <class> <instance> <recipient>: Join en ny samtale" #: ../libpurple/protocols/zephyr/zephyr.c:2721 -msgid "" -"zi <instance>: Send a message to <message,instance,*>" -msgstr "" +msgid "zi <instance>: Send a message to <message,instance,*>" +msgstr "zi <instance>: Send en beskjed til <beskjed,instance,*>" #: ../libpurple/protocols/zephyr/zephyr.c:2727 -msgid "" -"zci <class> <instance>: Send a message to <class," -"instance,*>" -msgstr "" +msgid "zci <class> <instance>: Send a message to <class,instance,*>" +msgstr "zci <class> <instance>: Send en beskjed til <class,instance,*>" #: ../libpurple/protocols/zephyr/zephyr.c:2733 -msgid "" -"zcir <class> <instance> <recipient>: Send a message to <" -"class,instance,recipient>" -msgstr "" +msgid "zcir <class> <instance> <recipient>: Send a message to <class,instance,recipient>" +msgstr "zcir <class> <instance> <recipient>: Send en beskjed til <class,instance,recipient>" #: ../libpurple/protocols/zephyr/zephyr.c:2739 -msgid "" -"zir <instance> <recipient>: Send a message to <MESSAGE," -"instance,recipient>" -msgstr "" +msgid "zir <instance> <recipient>: Send a message to <MESSAGE,instance,recipient>" +msgstr "zir <instance> <recipient>: Send en beskjed til <MESSAGE,instance,recipient>" #: ../libpurple/protocols/zephyr/zephyr.c:2744 msgid "zc <class>: Send a message to <class,PERSONAL,*>" -msgstr "" +msgstr "zc <class>: Send en beskjed til <class,PERSONAL,*>" #: ../libpurple/protocols/zephyr/zephyr.c:2850 msgid "Resubscribe" -msgstr "Abboner på nytt" +msgstr "Aboner på nytt" #: ../libpurple/protocols/zephyr/zephyr.c:2853 msgid "Retrieve subscriptions from server" @@ -13661,30 +13129,32 @@ msgstr "Zephyr-protokolltillegg" #: ../libpurple/protocols/zephyr/zephyr.c:2973 -#, fuzzy msgid "Use tzc" -msgstr "Enhet" +msgstr "Bruk tzc" #: ../libpurple/protocols/zephyr/zephyr.c:2976 -#, fuzzy msgid "tzc command" -msgstr "Ingen slik kommando" +msgstr "tzc kommando" #: ../libpurple/protocols/zephyr/zephyr.c:2979 +#, fuzzy msgid "Export to .anyone" -msgstr "" +msgstr "Eksporter til .anyone" #: ../libpurple/protocols/zephyr/zephyr.c:2982 +#, fuzzy msgid "Export to .zephyr.subs" -msgstr "" +msgstr "Eksporter til .zephyr.subs" #: ../libpurple/protocols/zephyr/zephyr.c:2985 +#, fuzzy msgid "Import from .anyone" -msgstr "" +msgstr "Importer fra .anyone" #: ../libpurple/protocols/zephyr/zephyr.c:2988 +#, fuzzy msgid "Import from .zephyr.subs" -msgstr "" +msgstr "Importer fra .zephyr.subs" #: ../libpurple/protocols/zephyr/zephyr.c:2991 #, fuzzy @@ -13693,9 +13163,11 @@ #: ../libpurple/protocols/zephyr/zephyr.c:2994 msgid "Exposure" -msgstr "" - -#: ../libpurple/proxy.c:459 ../libpurple/proxy.c:894 ../libpurple/proxy.c:1049 +msgstr "Eksponering" + +#: ../libpurple/proxy.c:459 +#: ../libpurple/proxy.c:894 +#: ../libpurple/proxy.c:1049 #: ../libpurple/proxy.c:1617 #, fuzzy, c-format msgid "" @@ -13706,56 +13178,54 @@ #: ../libpurple/proxy.c:659 #, c-format msgid "Unable to parse response from HTTP proxy: %s\n" -msgstr "" - -#: ../libpurple/proxy.c:698 ../libpurple/proxy.c:744 ../libpurple/proxy.c:780 +msgstr "Kunne ikke analysere syntaktisk respons fra HTTP proxy: %s\n" + +#: ../libpurple/proxy.c:698 +#: ../libpurple/proxy.c:744 +#: ../libpurple/proxy.c:780 #: ../libpurple/proxy.c:792 #, fuzzy, c-format msgid "HTTP proxy connection error %d" msgstr "Tilkoplingsfeil til mellomtjener %d" #: ../libpurple/proxy.c:788 -#, fuzzy, c-format +#, c-format msgid "Access denied: HTTP proxy server forbids port %d tunneling." -msgstr "Tilgang nektet: Mellomtjener nekter å formidle tunell for port %d" +msgstr "Tilgang nektet: Mellomtjener nekter å formidle tunell for port %d." #: ../libpurple/proxy.c:1012 -#, fuzzy, c-format +#, c-format msgid "Error resolving %s" -msgstr "Klarte ikke bli med i gruppesamtale %s" +msgstr "Error resolving %s" #: ../libpurple/proxy.c:1714 -#, fuzzy msgid "Could not resolve host name" -msgstr "Kan ikke finne datamaskinnavnet." +msgstr "Kan ikke finne datamaskinnavnet" #. * #. * A wrapper for purple_request_action() that uses @c Yes and @c No buttons. #. #: ../libpurple/request.h:1378 -#, fuzzy msgid "_Yes" -msgstr "Ja" +msgstr "_Ja" #: ../libpurple/request.h:1378 -#, fuzzy msgid "_No" -msgstr "Nei" +msgstr "_Nei" #. * #. * A wrapper for purple_request_action() that uses Accept and Cancel buttons. #. #: ../libpurple/request.h:1398 -#, fuzzy msgid "_Accept" -msgstr "Godta" +msgstr "_Godta" #. * #. * The default message to use when the user becomes auto-away. #. #: ../libpurple/savedstatuses.c:48 msgid "I'm not here right now" -msgstr "" +msgstr "Jeg er ikke her akkurat nå" #: ../libpurple/savedstatuses.c:535 #, fuzzy @@ -13770,26 +13240,26 @@ #: ../libpurple/server.c:302 #, c-format msgid "Requesting %s's attention..." -msgstr "" +msgstr "Forespør %s's oppmerksomhet..." #: ../libpurple/server.c:347 -#, fuzzy, c-format +#, c-format msgid "%s has requested your attention!" -msgstr "%s hentet informasjon om deg" - -#: ../libpurple/server.c:796 +msgstr "%s har forespurt din oppmerksomhet!" + +#: ../libpurple/server.c:793 #, fuzzy, c-format msgid "" "%s has invited %s to the chat room %s:\n" "%s" msgstr "Brukeren '%s' inviterer %s til samtalerom: '%s\n" -#: ../libpurple/server.c:801 +#: ../libpurple/server.c:798 #, c-format msgid "%s has invited %s to the chat room %s\n" msgstr "Brukeren '%s' inviterer %s til samtalerom: '%s\n" -#: ../libpurple/server.c:805 +#: ../libpurple/server.c:802 msgid "Accept chat invitation?" msgstr "Aksepter samtaleinvitasjon?" @@ -13817,184 +13287,184 @@ msgid "Unset" msgstr "Enhet" -#: ../libpurple/status.c:156 ../pidgin/gtkstatusbox.c:1059 -#, fuzzy +#: ../libpurple/status.c:156 +#: ../pidgin/gtkstatusbox.c:1059 msgid "Do not disturb" msgstr "Ikke forstyrr" #: ../libpurple/status.c:159 -#, fuzzy msgid "Extended away" msgstr "Utvidet borte" #: ../libpurple/status.c:160 -#, fuzzy msgid "Mobile" -msgstr "Mobiltelefon" +msgstr "Mobil" #: ../libpurple/status.c:609 -#, fuzzy, c-format +#, c-format msgid "%s changed status from %s to %s" -msgstr "%s har endret kanaltema til: %s" - -#: ../libpurple/status.c:619 -#, fuzzy, c-format +msgstr "%s har endret status fra %s til %s" + +#: ../libpurple/status.c:612 +#, c-format +msgid "%s (%s) changed status from %s to %s" +msgstr "%s (%s) har endret status fra %s til %s" + +#: ../libpurple/status.c:623 +#, c-format msgid "%s is now %s" -msgstr "%s heter nå %s" - -#: ../libpurple/status.c:624 -#, fuzzy, c-format +msgstr "%s er nå %s" + +#: ../libpurple/status.c:625 +#, c-format +msgid "%s (%s) is now %s" +msgstr "%s (%s) er nå %s" + +#: ../libpurple/status.c:631 +#, c-format msgid "%s is no longer %s" -msgstr "%s er tilbake." - -#: ../libpurple/status.c:1234 +msgstr "%s er ikke lenger %s" + +#: ../libpurple/status.c:633 +#, c-format +msgid "%s (%s) is no longer %s" +msgstr "%s (%s) er ikke lenger %s" + +#: ../libpurple/status.c:1244 #, c-format msgid "%s became idle" msgstr "%s har blitt inaktiv" -#: ../libpurple/status.c:1251 +#: ../libpurple/status.c:1261 #, c-format msgid "%s became unidle" msgstr "%s har blitt aktiv" -#: ../libpurple/status.c:1314 -#, fuzzy, c-format +#: ../libpurple/status.c:1324 +#, c-format msgid "+++ %s became idle" msgstr "%s har blitt inaktiv" -#: ../libpurple/status.c:1316 -#, fuzzy, c-format +#: ../libpurple/status.c:1326 +#, c-format msgid "+++ %s became unidle" msgstr "%s har blitt aktiv" -#: ../libpurple/util.c:718 +#: ../libpurple/util.c:701 #, c-format msgid "%x %X" -msgstr "" - -#: ../libpurple/util.c:2722 -#, fuzzy, c-format +msgstr "%x %X" + +#: ../libpurple/util.c:2705 +#, c-format msgid "Error Reading %s" -msgstr "" -"Klarte ikke lese %s:\n" -"%s\n" - -#: ../libpurple/util.c:2723 -#, fuzzy, c-format -msgid "" -"An error was encountered reading your %s. They have not been loaded, and " -"the old file has been renamed to %s~." -msgstr "" -"Det oppstod en feil under innlasting av kontaktlisten din. Den har ikke " -"blitt lastet, og den gamle filen ble flyttet til blist.xml~." - -#: ../libpurple/util.c:3223 +msgstr "Feil ved lesing av %s" + +#: ../libpurple/util.c:2706 +#, c-format +msgid "An error was encountered reading your %s. They have not been loaded, and the old file has been renamed to %s~." +msgstr "Det oppstod en feil under lesing av %s. Den har ikke blitt lastet, og den gamle filen ble flyttet til %s~." + +#: ../libpurple/util.c:3206 msgid "Calculating..." msgstr "Beregner..." -#: ../libpurple/util.c:3226 +#: ../libpurple/util.c:3209 msgid "Unknown." msgstr "Ukjent." -#: ../libpurple/util.c:3252 -#, fuzzy, c-format +#: ../libpurple/util.c:3235 +#, c-format msgid "%d second" msgid_plural "%d seconds" -msgstr[0] "sekund" -msgstr[1] "sekunder" - -#: ../libpurple/util.c:3264 -#, fuzzy, c-format +msgstr[0] "%d sekund" +msgstr[1] "%d sekunder" + +#: ../libpurple/util.c:3247 +#, c-format msgid "%d day" msgid_plural "%d days" -msgstr[0] "dag" -msgstr[1] "dager" - -#: ../libpurple/util.c:3272 +msgstr[0] "%d dag" +msgstr[1] "%d dager" + +#: ../libpurple/util.c:3255 #, c-format msgid "%s, %d hour" msgid_plural "%s, %d hours" -msgstr[0] "" -msgstr[1] "" - -#: ../libpurple/util.c:3278 -#, fuzzy, c-format +msgstr[0] "%s, %d time" +msgstr[1] "%s, %d timer" + +#: ../libpurple/util.c:3261 +#, c-format msgid "%d hour" msgid_plural "%d hours" -msgstr[0] "time" -msgstr[1] "timer" - -#: ../libpurple/util.c:3286 -#, fuzzy, c-format +msgstr[0] "%d time" +msgstr[1] "%d timer" + +#: ../libpurple/util.c:3269 +#, c-format msgid "%s, %d minute" msgid_plural "%s, %d minutes" -msgstr[0] "minutt" -msgstr[1] "minutter" - -#: ../libpurple/util.c:3292 -#, fuzzy, c-format +msgstr[0] "%s, %d minutt" +msgstr[1] "%s, %d minutter" + +#: ../libpurple/util.c:3275 +#, c-format msgid "%d minute" msgid_plural "%d minutes" -msgstr[0] "minutt" -msgstr[1] "minutter" - -#: ../libpurple/util.c:3552 +msgstr[0] "%d minutt" +msgstr[1] "%d minutter" + +#: ../libpurple/util.c:3535 #, c-format msgid "Could not open %s: Redirected too many times" -msgstr "" - -#: ../libpurple/util.c:3589 ../libpurple/util.c:3885 -#, fuzzy, c-format +msgstr "Kunne ikke åpne %s: Omdirigert for mange ganger" + +#: ../libpurple/util.c:3572 +#: ../libpurple/util.c:3868 +#, c-format msgid "Unable to connect to %s" -msgstr "Kan ikke koble til tjener." - -#: ../libpurple/util.c:3712 -#, c-format -msgid "" -"Unable to allocate enough memory to hold the contents from %s. The web " -"server may be trying something malicious." -msgstr "" - -#: ../libpurple/util.c:3747 -#, fuzzy, c-format +msgstr "Kan ikke koble til %s" + +#: ../libpurple/util.c:3695 +#, c-format +msgid "Unable to allocate enough memory to hold the contents from %s. The web server may be trying something malicious." +msgstr "Kunne ikke allokere nok minne til å holde på innholdet fra %s. Det kan hende web serveren prøver på noe ondskapsfullt." + +#: ../libpurple/util.c:3730 +#, c-format msgid "Error reading from %s: %s" -msgstr "" -"Klarte ikke lese %s:\n" -"%s\n" - -#: ../libpurple/util.c:3778 -#, fuzzy, c-format +msgstr "Feil ved lesing fra %s: %s" + +#: ../libpurple/util.c:3761 +#, c-format msgid "Error writing to %s: %s" -msgstr "" -"Klarte ikke skrive %s:\n" -"%s\n" - -#: ../libpurple/util.c:3803 -#, fuzzy, c-format +msgstr "Feil ved skriving til %s: %s" + +#: ../libpurple/util.c:3786 +#, c-format msgid "Unable to connect to %s: %s" -msgstr "Kan ikke koble til tjener." +msgstr "Kan ikke koble til %s: %s" #: ../pidgin.desktop.in.h:1 msgid "Internet Messenger" msgstr "Lynmeldingsklient" #: ../pidgin.desktop.in.h:2 -#, fuzzy msgid "Pidgin Internet Messenger" -msgstr "Lynmeldingsklient" +msgstr "Pidgin Lynmeldingsklient" #: ../pidgin.desktop.in.h:3 msgid "Send instant messages over multiple protocols" msgstr "Send lynmeldinger over flere protokoller" #: ../pidgin/eggtrayicon.c:129 -#, fuzzy msgid "Orientation" -msgstr "Organisasjon" +msgstr "Orientering" #: ../pidgin/eggtrayicon.c:130 msgid "The orientation of the tray." -msgstr "" +msgstr "Orienteringen av brettet." #. Build the login options frame. #: ../pidgin/gtkaccount.c:407 @@ -14002,24 +13472,20 @@ msgstr "Innloggingsvalg" #: ../pidgin/gtkaccount.c:428 -#, fuzzy msgid "Pro_tocol:" -msgstr "Protokoll:" +msgstr "Pro_tokoll:" #: ../pidgin/gtkaccount.c:439 -#, fuzzy msgid "Screen _name:" -msgstr "Skjermnavn:" +msgstr "Skjerm_navn:" #: ../pidgin/gtkaccount.c:529 -#, fuzzy msgid "_Local alias:" -msgstr "Lokale brukere" +msgstr "_Lokalt alias:" #: ../pidgin/gtkaccount.c:533 -#, fuzzy msgid "Remember pass_word" -msgstr "Husk passord" +msgstr "Husk pass_ord" #. Build the user options frame. #: ../pidgin/gtkaccount.c:591 @@ -14027,25 +13493,23 @@ msgstr "Brukervalg" #: ../pidgin/gtkaccount.c:604 -#, fuzzy msgid "New _mail notifications" -msgstr "Varsling om ny e-post" +msgstr "_Varsling om ny e-post" #. Buddy icon #: ../pidgin/gtkaccount.c:609 msgid "Use this buddy _icon for this account:" -msgstr "" +msgstr "Bruk dette kontakt _ikon for denne kontoen:" #. Build the protocol options frame. #: ../pidgin/gtkaccount.c:731 #, c-format msgid "%s Options" -msgstr "%s brukervalg" +msgstr "%s Brukervalg" #: ../pidgin/gtkaccount.c:936 -#, fuzzy msgid "Use GNOME Proxy Settings" -msgstr "Bruk globale proxyinnstilinger" +msgstr "Bruk GNOMEs proxyinnstilinger" #: ../pidgin/gtkaccount.c:937 msgid "Use Global Proxy Settings" @@ -14067,8 +13531,8 @@ msgid "SOCKS 5" msgstr "SOCKS 5" -# -#: ../pidgin/gtkaccount.c:967 ../pidgin/gtkprefs.c:1211 +#: ../pidgin/gtkaccount.c:967 +#: ../pidgin/gtkprefs.c:1213 msgid "Use Environmental Settings" msgstr "Bruk innstillinger fra miljøet" @@ -14090,15 +13554,18 @@ msgid "Proxy Options" msgstr "Proxyinnstillinger" -#: ../pidgin/gtkaccount.c:1044 ../pidgin/gtkprefs.c:1205 +#: ../pidgin/gtkaccount.c:1044 +#: ../pidgin/gtkprefs.c:1207 msgid "Proxy _type:" -msgstr "Proxytype:" - -#: ../pidgin/gtkaccount.c:1053 ../pidgin/gtkprefs.c:1226 +msgstr "Proxy_type:" + +#: ../pidgin/gtkaccount.c:1053 +#: ../pidgin/gtkprefs.c:1228 msgid "_Host:" -msgstr "Adresse:" - -#: ../pidgin/gtkaccount.c:1057 ../pidgin/gtkprefs.c:1244 +msgstr "_Vert:" + +#: ../pidgin/gtkaccount.c:1057 +#: ../pidgin/gtkprefs.c:1246 msgid "_Port:" msgstr "_Port:" @@ -14106,41 +13573,39 @@ msgid "_Username:" msgstr "_Brukernavn:" -#: ../pidgin/gtkaccount.c:1072 ../pidgin/gtkprefs.c:1281 +#: ../pidgin/gtkaccount.c:1072 +#: ../pidgin/gtkprefs.c:1283 msgid "Pa_ssword:" -msgstr "Passord:" +msgstr "Pa_ssord:" #: ../pidgin/gtkaccount.c:1195 -#, fuzzy msgid "Unable to save new account" -msgstr "Kunne ikke lage ny tilkobling." +msgstr "Kan ikke lagre ny konto" #: ../pidgin/gtkaccount.c:1196 msgid "An account already exists with the specified criteria." -msgstr "" +msgstr "En konto eksisterer allerede med de spesifiserte kriteriene." #: ../pidgin/gtkaccount.c:1473 msgid "Add Account" msgstr "Legg til konto" #: ../pidgin/gtkaccount.c:1492 -#, fuzzy msgid "_Basic" -msgstr "Tilbake" +msgstr "_Generell" #: ../pidgin/gtkaccount.c:1499 msgid "Create this new account on the server" -msgstr "" +msgstr "Opprett denne nye kontoen på tjeneren" #: ../pidgin/gtkaccount.c:1515 -#, fuzzy msgid "_Advanced" -msgstr "_Avbryt" - -#: ../pidgin/gtkaccount.c:1973 ../pidgin/gtkplugin.c:569 -#, fuzzy +msgstr "_Avansert" + +#: ../pidgin/gtkaccount.c:1973 +#: ../pidgin/gtkplugin.c:569 msgid "Enabled" -msgstr "Feilet." +msgstr "Aktivert" #: ../pidgin/gtkaccount.c:2001 msgid "Protocol" @@ -14151,270 +13616,299 @@ msgid "" "Welcome to %s!\n" "\n" -"You have no IM accounts configured. To start connecting with %s press the " -"Add button below and configure your first account. If you want %s to " -"connect to multiple IM accounts, press Add again to configure them " -"all.\n" -"\n" -"You can come back to this window to add, edit, or remove accounts from " -"Accounts->Add/Edit in the Buddy List window" -msgstr "" - -#: ../pidgin/gtkblist.c:767 +"You have no IM accounts configured. To start connecting with %s press the Add button below and configure your first account. If you want %s to connect to multiple IM accounts, press Add again to configure them all.\n" +"\n" +"You can come back to this window to add, edit, or remove accounts from Accounts->Add/Edit in the Buddy List window" +msgstr "" +"Velkommen til %s!\n" +"\n" +"Du har ikke konfigurert noen Lyndmeldings kontoer. For å starte tilkobling til %s trykk Legg til knappen under og konfigurer kontoen din først. Om du vil at %s skal koble til flere Lynmeldings kontoer, trykk Legg til igjen for å konfigurere dem alle.\n" +"\n" +"Du kan komme tilbake til dette vinduet for å legge til, redigere eller fjerne kontoer fra Kontoer->Legg til/Rediger i kontaktliste vinduet" + +#: ../pidgin/gtkblist.c:524 +#, c-format +msgid "You have %d contact named %s. Would you like to merge them?" +msgid_plural "You currently have %d contacts named %s. Would you like to merge them?" +msgstr[0] "Du har kontakten %d som %s. Vil du flette dem sammen?" +msgstr[1] "Du har kontaktene %d som %s. Vil du flette dem sammen?" + +#: ../pidgin/gtkblist.c:525 +msgid "Merging these contacts will cause them to share a single entry on the buddy list and use a single conversation window. You can separate them again by choosing 'Expand' from the contact's context menu" +msgstr "Sammenfletting av disse kontaktene vil føre til at de deler en enkelt oppføring i kontaktlisten og bruker ett enkelt samtalevindu. Du kan separere dem igjen ved å velge Utvid fra kontaktens meny i kontaktlisten" + +#: ../pidgin/gtkblist.c:527 +msgid "_Merge" +msgstr "_Flette" + +#: ../pidgin/gtkblist.c:924 msgid "Join a Chat" msgstr "Bli med i en samtalegruppe" -#: ../pidgin/gtkblist.c:788 -msgid "" -"Please enter the appropriate information about the chat you would like to " -"join.\n" -msgstr "" -"Vennligst skriv inn informasjon om samtalegruppen du ønsker å bli med i.\n" - -#. Set up stuff for the account box -#: ../pidgin/gtkblist.c:799 ../pidgin/gtkblist.c:5530 -#: ../pidgin/gtkblist.c:5893 ../pidgin/gtkpounce.c:539 +#: ../pidgin/gtkblist.c:945 +msgid "Please enter the appropriate information about the chat you would like to join.\n" +msgstr "Vennligst skriv inn informasjon om samtalegruppen du ønsker å bli med i.\n" + +#: ../pidgin/gtkblist.c:956 +#: ../pidgin/gtkblist.c:6188 +#: ../pidgin/gtkpounce.c:539 #: ../pidgin/gtkroomlist.c:396 msgid "_Account:" -msgstr "Konto:" - -#: ../pidgin/gtkblist.c:1088 ../pidgin/gtkprivacy.c:603 +msgstr "_Konto:" + +#: ../pidgin/gtkblist.c:1245 +#: ../pidgin/gtkprivacy.c:603 #: ../pidgin/gtkprivacy.c:617 -#, fuzzy msgid "_Block" -msgstr "Blokker" - -#: ../pidgin/gtkblist.c:1088 -#, fuzzy +msgstr "_Blokker" + +#: ../pidgin/gtkblist.c:1245 msgid "Un_block" -msgstr "Blokker" - -#: ../pidgin/gtkblist.c:1139 +msgstr "_Ta bort blokkering" + +#: ../pidgin/gtkblist.c:1288 +msgid "Move to" +msgstr "Flytt til" + +#: ../pidgin/gtkblist.c:1328 msgid "Get _Info" -msgstr "_Info" - -#: ../pidgin/gtkblist.c:1142 ../pidgin/pidginstock.c:90 +msgstr "Hent _Informasjon" + +#: ../pidgin/gtkblist.c:1331 +#: ../pidgin/pidginstock.c:90 msgid "I_M" msgstr "Direkte_melding" -#: ../pidgin/gtkblist.c:1148 -#, fuzzy -msgid "_Send File" -msgstr "Send fil" - -#: ../pidgin/gtkblist.c:1155 -#, fuzzy -msgid "Add Buddy _Pounce" -msgstr "Legg til kompisvarsling" - -#: ../pidgin/gtkblist.c:1160 ../pidgin/gtkblist.c:1164 -#: ../pidgin/gtkblist.c:1269 ../pidgin/gtkblist.c:1292 +#: ../pidgin/gtkblist.c:1337 +msgid "_Send File..." +msgstr "_Send fil..." + +#: ../pidgin/gtkblist.c:1344 +msgid "Add Buddy _Pounce..." +msgstr "Legg til _kontaktvarsling..." + +#: ../pidgin/gtkblist.c:1349 +#: ../pidgin/gtkblist.c:1353 +#: ../pidgin/gtkblist.c:1468 +#: ../pidgin/gtkblist.c:1491 msgid "View _Log" -msgstr "Vis _logg" - -#: ../pidgin/gtkblist.c:1177 ../pidgin/gtkblist.c:1186 -#: ../pidgin/gtkblist.c:1277 ../pidgin/gtkblist.c:1298 +msgstr "Vis _Logg" + +#: ../pidgin/gtkblist.c:1359 +#, fuzzy +msgid "Hide when offline" +msgstr "Ikke tillatt når avlogget" + +#: ../pidgin/gtkblist.c:1359 +#, fuzzy +msgid "Show when offline" +msgstr "Ikke tillatt når avlogget" + +#: ../pidgin/gtkblist.c:1373 +#: ../pidgin/gtkblist.c:1382 +#: ../pidgin/gtkblist.c:1476 +#: ../pidgin/gtkblist.c:1497 msgid "_Alias..." msgstr "_Alias..." -#: ../pidgin/gtkblist.c:1180 ../pidgin/gtkblist.c:1188 -#: ../pidgin/gtkblist.c:1279 ../pidgin/gtkblist.c:1300 +#: ../pidgin/gtkblist.c:1376 +#: ../pidgin/gtkblist.c:1384 +#: ../pidgin/gtkblist.c:1478 +#: ../pidgin/gtkblist.c:1499 msgid "_Remove" msgstr "Fje_rn" -#: ../pidgin/gtkblist.c:1238 -msgid "Add a _Buddy" -msgstr "Legg til kompis" - -#: ../pidgin/gtkblist.c:1241 -msgid "Add a C_hat" -msgstr "Legg til samtalegruppe" - -#: ../pidgin/gtkblist.c:1244 +#: ../pidgin/gtkblist.c:1434 +msgid "Add _Buddy..." +msgstr "Legg til _Kontakt..." + +#: ../pidgin/gtkblist.c:1437 +msgid "Add C_hat..." +msgstr "Legg til _Samtale..." + +#: ../pidgin/gtkblist.c:1440 msgid "_Delete Group" -msgstr "Slett gruppe" - -#: ../pidgin/gtkblist.c:1246 +msgstr "_Slett gruppe" + +#: ../pidgin/gtkblist.c:1442 msgid "_Rename" -msgstr "End_re navn" +msgstr "_Endre navn" #. join button -#: ../pidgin/gtkblist.c:1265 ../pidgin/gtkroomlist.c:307 -#: ../pidgin/gtkroomlist.c:460 ../pidgin/pidginstock.c:88 +#: ../pidgin/gtkblist.c:1462 +#: ../pidgin/gtkroomlist.c:307 +#: ../pidgin/gtkroomlist.c:460 +#: ../pidgin/pidginstock.c:88 msgid "_Join" -msgstr "_Bli med i samtalegruppe" - -#: ../pidgin/gtkblist.c:1267 +msgstr "_Bli med" + +#: ../pidgin/gtkblist.c:1464 msgid "Auto-Join" msgstr "Automatisk pålogging" -#: ../pidgin/gtkblist.c:1305 ../pidgin/gtkblist.c:1329 +#: ../pidgin/gtkblist.c:1466 +#, fuzzy +msgid "Persistent" +msgstr "Serbisk" + +#: ../pidgin/gtkblist.c:1504 +#: ../pidgin/gtkblist.c:1527 msgid "_Collapse" msgstr "_Lukk" -#: ../pidgin/gtkblist.c:1334 +#: ../pidgin/gtkblist.c:1532 msgid "_Expand" msgstr "_Utvid" -#: ../pidgin/gtkblist.c:1585 ../pidgin/gtkblist.c:1597 -#: ../pidgin/gtkblist.c:4603 ../pidgin/gtkblist.c:4616 -#, fuzzy +#: ../pidgin/gtkblist.c:1783 +#: ../pidgin/gtkblist.c:1795 +#: ../pidgin/gtkblist.c:4885 +#: ../pidgin/gtkblist.c:4898 msgid "/Tools/Mute Sounds" -msgstr "Skru av lyder" - -#: ../pidgin/gtkblist.c:2057 ../pidgin/gtkconv.c:4840 +msgstr "/Verktøy/Skru av lyder" + +#: ../pidgin/gtkblist.c:2255 +#: ../pidgin/gtkconv.c:4903 #: ../pidgin/gtkpounce.c:430 -msgid "" -"You are not currently signed on with an account that can add that buddy." +msgid "You are not currently signed on with an account that can add that buddy." msgstr "Du er ikke pålogget med noen kontoer som kan legge til den kontakten." #. Buddies menu -#: ../pidgin/gtkblist.c:2869 +#: ../pidgin/gtkblist.c:3067 msgid "/_Buddies" msgstr "/_Kontakter" -#: ../pidgin/gtkblist.c:2870 +#: ../pidgin/gtkblist.c:3068 msgid "/Buddies/New Instant _Message..." msgstr "/Kontakter/_Ny direktemelding..." -#: ../pidgin/gtkblist.c:2871 +#: ../pidgin/gtkblist.c:3069 msgid "/Buddies/Join a _Chat..." msgstr "/Kontakter/_Bli med i samtalegruppe..." -#: ../pidgin/gtkblist.c:2872 +#: ../pidgin/gtkblist.c:3070 msgid "/Buddies/Get User _Info..." msgstr "/Kontakter/_Hent brukerinfo..." -#: ../pidgin/gtkblist.c:2873 +#: ../pidgin/gtkblist.c:3071 msgid "/Buddies/View User _Log..." -msgstr "/Kontakter/Hent bruker_logg..." - -#: ../pidgin/gtkblist.c:2875 -#, fuzzy +msgstr "/Kontakter/Vis bruker_logg..." + +#: ../pidgin/gtkblist.c:3073 msgid "/Buddies/Show" -msgstr "/Kontakter/L_ogge av" - -#: ../pidgin/gtkblist.c:2876 -#, fuzzy +msgstr "/Kontakter/Vis" + +#: ../pidgin/gtkblist.c:3074 msgid "/Buddies/Show/_Offline Buddies" -msgstr "/Kontakter/_Vis avloggede kontakter" - -#: ../pidgin/gtkblist.c:2877 -#, fuzzy +msgstr "/Kontakter/Vis/_Avloggede kontakter" + +#: ../pidgin/gtkblist.c:3075 msgid "/Buddies/Show/_Empty Groups" -msgstr "/Kontakter/Vis _tomme grupper" - -#: ../pidgin/gtkblist.c:2878 -#, fuzzy +msgstr "/Kontakter/Vis/_Tomme grupper" + +#: ../pidgin/gtkblist.c:3076 msgid "/Buddies/Show/Buddy _Details" -msgstr "/Kontakter/Vis _avloggede kontakter" - -#: ../pidgin/gtkblist.c:2879 -#, fuzzy +msgstr "/Kontakter/Vis/Kontakt_detaljer" + +#: ../pidgin/gtkblist.c:3077 msgid "/Buddies/Show/Idle _Times" -msgstr "/Kontakter/Vis _avloggede kontakter" - -#: ../pidgin/gtkblist.c:2880 -#, fuzzy +msgstr "/Kontakter/Vis/_Fraværstid" + +#: ../pidgin/gtkblist.c:3078 msgid "/Buddies/Show/_Protocol Icons" -msgstr "/Kontakter/Vis _tomme grupper" - -#: ../pidgin/gtkblist.c:2881 -#, fuzzy +msgstr "/Kontakter/Vis/_Protokollikoner" + +#: ../pidgin/gtkblist.c:3079 msgid "/Buddies/_Sort Buddies" -msgstr "/Kontakter/Vis _avloggede kontakter" - -#: ../pidgin/gtkblist.c:2883 +msgstr "/Kontakter/_Sorter kontakter" + +#: ../pidgin/gtkblist.c:3081 msgid "/Buddies/_Add Buddy..." -msgstr "/Kontakter/_Legg til kompis..." - -#: ../pidgin/gtkblist.c:2884 +msgstr "/Kontakter/_Legg til kontakt..." + +#: ../pidgin/gtkblist.c:3082 msgid "/Buddies/Add C_hat..." msgstr "/Kontakter/Legg til _samtalegruppe..." -#: ../pidgin/gtkblist.c:2885 +#: ../pidgin/gtkblist.c:3083 msgid "/Buddies/Add _Group..." msgstr "/Kontakter/Legg til _gruppe..." -#: ../pidgin/gtkblist.c:2887 +#: ../pidgin/gtkblist.c:3085 msgid "/Buddies/_Quit" msgstr "/Kontakter/_Avslutt" #. Accounts menu -#: ../pidgin/gtkblist.c:2890 -#, fuzzy +#: ../pidgin/gtkblist.c:3088 msgid "/_Accounts" -msgstr "Kontoer" - -#: ../pidgin/gtkblist.c:2891 ../pidgin/gtkblist.c:6589 -#, fuzzy -msgid "/Accounts/Add\\/Edit" -msgstr "Kontoer" +msgstr "/_Kontoer" + +#: ../pidgin/gtkblist.c:3089 +#: ../pidgin/gtkblist.c:6889 +#, fuzzy +msgid "/Accounts/Manage" +msgstr "/Kontoer" #. Tools -#: ../pidgin/gtkblist.c:2894 +#: ../pidgin/gtkblist.c:3092 msgid "/_Tools" msgstr "/_Verktøy" -#: ../pidgin/gtkblist.c:2895 -#, fuzzy +#: ../pidgin/gtkblist.c:3093 msgid "/Tools/Buddy _Pounces" msgstr "/Verktøy/_Kompisvarsling" -#: ../pidgin/gtkblist.c:2896 -#, fuzzy +#: ../pidgin/gtkblist.c:3094 msgid "/Tools/_Certificates" -msgstr "/Verktøy/_Innstillinger" - -#: ../pidgin/gtkblist.c:2897 -#, fuzzy +msgstr "/Verktøy/_Sertifikater" + +#: ../pidgin/gtkblist.c:3095 msgid "/Tools/Plu_gins" -msgstr "/Verktøy/Handlinger for tillegg" - -#: ../pidgin/gtkblist.c:2898 +msgstr "/Verktøy/ _Tillegg" + +#: ../pidgin/gtkblist.c:3096 msgid "/Tools/Pr_eferences" msgstr "/Verktøy/_Innstillinger" -#: ../pidgin/gtkblist.c:2899 +#: ../pidgin/gtkblist.c:3097 msgid "/Tools/Pr_ivacy" msgstr "/Verktøy/_Sikkerhet" -#: ../pidgin/gtkblist.c:2901 +#: ../pidgin/gtkblist.c:3099 msgid "/Tools/_File Transfers" -msgstr "/Verktøy/_Filoverføringer..." - -#: ../pidgin/gtkblist.c:2902 +msgstr "/Verktøy/_Filoverføringer" + +#: ../pidgin/gtkblist.c:3100 msgid "/Tools/R_oom List" -msgstr "/Verktøy/_Romliste" - -#: ../pidgin/gtkblist.c:2903 -#, fuzzy +msgstr "/Verktøy/R_omliste" + +#: ../pidgin/gtkblist.c:3101 msgid "/Tools/System _Log" -msgstr "/Verktøy/_Vis systemlogg" - -#: ../pidgin/gtkblist.c:2905 -#, fuzzy +msgstr "/Verktøy/System _Logg" + +#: ../pidgin/gtkblist.c:3103 msgid "/Tools/Mute _Sounds" -msgstr "Skru av lyder" +msgstr "/Verktøy/_Skru av lyder" #. Help -#: ../pidgin/gtkblist.c:2907 +#: ../pidgin/gtkblist.c:3105 msgid "/_Help" msgstr "/_Hjelp" -#: ../pidgin/gtkblist.c:2908 +#: ../pidgin/gtkblist.c:3106 msgid "/Help/Online _Help" -msgstr "/Hjelp/Hjelp på _nettet" - -#: ../pidgin/gtkblist.c:2909 +msgstr "/Hjelp/Hjelp på _Nettet" + +#: ../pidgin/gtkblist.c:3107 msgid "/Help/_Debug Window" msgstr "/Hjelp/_Avlusningsvindu" -#: ../pidgin/gtkblist.c:2911 ../pidgin/gtkblist.c:2913 +#: ../pidgin/gtkblist.c:3109 +#: ../pidgin/gtkblist.c:3111 msgid "/Help/_About" msgstr "/Hjelp/_Om" -#: ../pidgin/gtkblist.c:2942 +#: ../pidgin/gtkblist.c:3140 #, c-format msgid "" "\n" @@ -14423,699 +13917,647 @@ "\n" "Konto: %s" -#: ../pidgin/gtkblist.c:3020 -#, fuzzy +#: ../pidgin/gtkblist.c:3218 msgid "Buddy Alias" -msgstr "Kontaktliste" - -#: ../pidgin/gtkblist.c:3049 -#, fuzzy +msgstr "Kontaktalias" + +#: ../pidgin/gtkblist.c:3247 msgid "Logged In" -msgstr "Logget ut" - -#: ../pidgin/gtkblist.c:3095 -#, fuzzy +msgstr "Logget inn" + +#: ../pidgin/gtkblist.c:3293 msgid "Last Seen" -msgstr "Etternavn:" - -#: ../pidgin/gtkblist.c:3116 +msgstr "Sist sett" + +#: ../pidgin/gtkblist.c:3314 msgid "Spooky" -msgstr "" - -#: ../pidgin/gtkblist.c:3118 +msgstr "Skummelt" + +#: ../pidgin/gtkblist.c:3316 msgid "Awesome" -msgstr "" - -#: ../pidgin/gtkblist.c:3120 +msgstr "Fantastisk" + +#: ../pidgin/gtkblist.c:3318 msgid "Rockin'" -msgstr "" - -#: ../pidgin/gtkblist.c:3453 -#, fuzzy, c-format +msgstr "Rocker" + +#: ../pidgin/gtkblist.c:3657 +#, c-format msgid "Idle %dd %dh %02dm" -msgstr "Inaktiv (%dt%02dm) " - -#: ../pidgin/gtkblist.c:3455 -#, fuzzy, c-format +msgstr "Inaktiv %dd %dh %02dm" + +#: ../pidgin/gtkblist.c:3659 +#, c-format msgid "Idle %dh %02dm" -msgstr "Inaktiv (%dt%02dm) " - -#: ../pidgin/gtkblist.c:3457 -#, fuzzy, c-format +msgstr "Inaktiv %dh %02dm" + +#: ../pidgin/gtkblist.c:3661 +#, c-format msgid "Idle %dm" -msgstr "Inaktiv (%dm) " - -#: ../pidgin/gtkblist.c:3602 -#, fuzzy +msgstr "Inaktiv %dm" + +#: ../pidgin/gtkblist.c:3806 msgid "/Buddies/New Instant Message..." -msgstr "/Kontakter/_Ny direktemelding..." - -#: ../pidgin/gtkblist.c:3603 ../pidgin/gtkblist.c:3636 +msgstr "/Kontakter/Ny direktemelding..." + +#: ../pidgin/gtkblist.c:3807 +#: ../pidgin/gtkblist.c:3840 msgid "/Buddies/Join a Chat..." -msgstr "/Kontakter/_Bli med i samtalegruppe..." - -#: ../pidgin/gtkblist.c:3604 -#, fuzzy +msgstr "/Kontakter/Bli med i samtalegruppe..." + +#: ../pidgin/gtkblist.c:3808 msgid "/Buddies/Get User Info..." -msgstr "/Kontakter/_Hent brukerinfo..." - -#: ../pidgin/gtkblist.c:3605 -#, fuzzy +msgstr "/Kontakter/Hent brukerinfo..." + +#: ../pidgin/gtkblist.c:3809 msgid "/Buddies/Add Buddy..." -msgstr "/Kontakter/_Legg til kompis..." - -#: ../pidgin/gtkblist.c:3606 ../pidgin/gtkblist.c:3639 -#, fuzzy +msgstr "/Kontakter/Legg til kontakt..." + +#: ../pidgin/gtkblist.c:3810 +#: ../pidgin/gtkblist.c:3843 msgid "/Buddies/Add Chat..." -msgstr "/Kontakter/Legg til _samtalegruppe..." - -#: ../pidgin/gtkblist.c:3607 -#, fuzzy +msgstr "/Kontakter/Legg til samtalegruppe..." + +#: ../pidgin/gtkblist.c:3811 msgid "/Buddies/Add Group..." -msgstr "/Kontakter/Legg til _gruppe..." - -#: ../pidgin/gtkblist.c:3642 +msgstr "/Kontakter/Legg til gruppe..." + +#: ../pidgin/gtkblist.c:3846 msgid "/Tools/Privacy" -msgstr "/Verktøy/Blo_kkeringer" - -#: ../pidgin/gtkblist.c:3645 +msgstr "/Verktøy/Blokkeringer" + +#: ../pidgin/gtkblist.c:3849 msgid "/Tools/Room List" -msgstr "/Verktøy/_Romliste" - -#: ../pidgin/gtkblist.c:3742 ../pidgin/gtkdocklet.c:153 -#, fuzzy, c-format +msgstr "/Verktøy/Romliste" + +#: ../pidgin/gtkblist.c:3944 +#: ../pidgin/gtkdocklet.c:153 +#, c-format msgid "%d unread message from %s\n" msgid_plural "%d unread messages from %s\n" -msgstr[0] "Melding fra %s" -msgstr[1] "Melding fra %s" - -#: ../pidgin/gtkblist.c:3822 -#, fuzzy +msgstr[0] "%d ulest beskjed fra %s\n" +msgstr[1] "%d uleste beskjeder fra %s\n" + +#: ../pidgin/gtkblist.c:4104 msgid "Manually" -msgstr "Egendefinert" - -#: ../pidgin/gtkblist.c:3824 -#, fuzzy -msgid "Alphabetically" -msgstr "Alfabetisk" - -#: ../pidgin/gtkblist.c:3825 +msgstr "Manuelt" + +#: ../pidgin/gtkblist.c:4107 msgid "By status" msgstr "Etter status" -#: ../pidgin/gtkblist.c:3826 +#: ../pidgin/gtkblist.c:4108 msgid "By log size" msgstr "Etter loggstørrelse" -#: ../pidgin/gtkblist.c:4031 ../pidgin/gtkconn.c:179 -#, fuzzy, c-format +#: ../pidgin/gtkblist.c:4313 +#: ../pidgin/gtkconn.c:180 +#, c-format msgid "%s disconnected" -msgstr "Frakoblet." - -#: ../pidgin/gtkblist.c:4067 -#, fuzzy, c-format +msgstr "%s koblet fra" + +#: ../pidgin/gtkblist.c:4349 +#, c-format msgid "%s disconnected: %s" -msgstr "" -"%s har blitt koplet fra.\n" -"\n" -"%s\n" -"%s" - -#: ../pidgin/gtkblist.c:4219 -#, fuzzy +msgstr "%s koblet fra: %s" + +#: ../pidgin/gtkblist.c:4501 msgid "Username:" -msgstr "" -"\n" -"Advart:" - -#: ../pidgin/gtkblist.c:4226 -#, fuzzy +msgstr "Brukernavn:" + +#: ../pidgin/gtkblist.c:4508 msgid "Password:" -msgstr "_Passord:" - -#: ../pidgin/gtkblist.c:4237 -#, fuzzy +msgstr "Passord:" + +#: ../pidgin/gtkblist.c:4519 msgid "_Login" -msgstr "Innlogging" - -#: ../pidgin/gtkblist.c:4320 -#, fuzzy +msgstr "_Innlogging" + +#: ../pidgin/gtkblist.c:4602 msgid "/Accounts" -msgstr "Kontoer" +msgstr "/Kontoer" #. Translators: Please maintain the use of -> and <- to refer to menu heirarchy -#: ../pidgin/gtkblist.c:4334 +#: ../pidgin/gtkblist.c:4616 #, c-format msgid "" "Welcome to %s!\n" "\n" -"You have no accounts enabled. Enable your IM accounts from the Accounts window at Accounts->Add/Edit. Once you enable accounts, you'll be " -"able to sign on, set your status, and talk to your friends." -msgstr "" +"You have no accounts enabled. Enable your IM accounts from the Accounts window at Accounts->Manage. Once you enable accounts, you'll be able to sign on, set your status, and talk to your friends." +msgstr "" +"Velkommen til %s!\n" +"\n" +"Du har ingen konter slått på. Slå på dine Lynmeldings kontoer fra Kontoer vinduet ved Kontoer->Administrere. Når du har slått på kontoene kan du logge inn, sette din status og snakke med dine venner." #. set the Show Offline Buddies option. must be done #. * after the treeview or faceprint gets mad. -Robot101 #. -#: ../pidgin/gtkblist.c:4597 -#, fuzzy +#: ../pidgin/gtkblist.c:4879 msgid "/Buddies/Show/Offline Buddies" -msgstr "/Kontakter/Vis _avloggede kontakter" - -#: ../pidgin/gtkblist.c:4600 -#, fuzzy +msgstr "/Kontakter/Vis/Avloggede kontakter" + +#: ../pidgin/gtkblist.c:4882 msgid "/Buddies/Show/Empty Groups" -msgstr "/Kontakter/Vis tomme grupper" - -#: ../pidgin/gtkblist.c:4606 -#, fuzzy +msgstr "/Kontakter/Vis/Tomme grupper" + +#: ../pidgin/gtkblist.c:4888 msgid "/Buddies/Show/Buddy Details" -msgstr "/Kontakter/Vis _avloggede kontakter" - -#: ../pidgin/gtkblist.c:4609 -#, fuzzy +msgstr "/Kontakter/Vis/Kontaktdetaljer" + +#: ../pidgin/gtkblist.c:4891 msgid "/Buddies/Show/Idle Times" -msgstr "/Kontakter/Vis _avloggede kontakter" - -#: ../pidgin/gtkblist.c:4612 -#, fuzzy +msgstr "/Kontakter/Vis/Fraværstider" + +#: ../pidgin/gtkblist.c:4894 msgid "/Buddies/Show/Protocol Icons" -msgstr "/Kontakter/Vis tomme grupper" - -#: ../pidgin/gtkblist.c:5507 -msgid "" -"Please enter the screen name of the person you would like to add to your " -"buddy list. You may optionally enter an alias, or nickname, for the buddy. " -"The alias will be displayed in place of the screen name whenever possible.\n" -msgstr "" -"Vennligst skriv inn skjermnavnet til den personen som du vil legge til i " -"kontaktlisten din. I tillegg kan du skrive inn et alias, eller kallenavn, " -"for kontakten. Aliaset vil bli vist i stedet for skjermnavnet der det er " -"mulig.\n" +msgstr "/Kontakter/Vis/Protokoll Ikoner" + +#: ../pidgin/gtkblist.c:5796 +msgid "Please enter the screen name of the person you would like to add to your buddy list. You may optionally enter an alias, or nickname, for the buddy. The alias will be displayed in place of the screen name whenever possible.\n" +msgstr "Vennligst skriv inn skjermnavnet til den personen som du vil legge til i kontaktlisten din. I tillegg kan du skrive inn et alias, eller kallenavn, for kontakten. Aliaset vil bli vist i stedet for skjermnavnet der det er mulig.\n" + +#. Set up stuff for the account box +#: ../pidgin/gtkblist.c:5819 +msgid "A_ccount:" +msgstr "K_onto:" #. End of account box -#: ../pidgin/gtkblist.c:5542 -#, fuzzy +#: ../pidgin/gtkblist.c:5831 msgid "_Screen name:" -msgstr "_Skjermnavn" - -#: ../pidgin/gtkblist.c:5564 ../pidgin/gtkblist.c:5914 -#, fuzzy +msgstr "_Skjermnavn:" + +#: ../pidgin/gtkblist.c:5853 +#: ../pidgin/gtkblist.c:6209 msgid "A_lias:" -msgstr "Alias:" - -#: ../pidgin/gtkblist.c:5826 +msgstr "A_lias:" + +#: ../pidgin/gtkblist.c:6121 msgid "This protocol does not support chat rooms." -msgstr "Denne protokollversjonen støtter ikke samtalerom" - -#: ../pidgin/gtkblist.c:5842 -msgid "" -"You are not currently signed on with any protocols that have the ability to " -"chat." +msgstr "Denne protokollversjonen støtter ikke samtalerom." + +#: ../pidgin/gtkblist.c:6137 +msgid "You are not currently signed on with any protocols that have the ability to chat." msgstr "Du er ikke pålogget med noen protokoller som støtter samtalegrupper." -#: ../pidgin/gtkblist.c:5883 -msgid "" -"Please enter an alias, and the appropriate information about the chat you " -"would like to add to your buddy list.\n" -msgstr "" -"Vennligst skriv inn et aliasnavn og annen informasjon for samtalegruppen.\n" - -#: ../pidgin/gtkblist.c:5964 +#: ../pidgin/gtkblist.c:6178 +msgid "Please enter an alias, and the appropriate information about the chat you would like to add to your buddy list.\n" +msgstr "Vennligst skriv inn et aliasnavn og annen informasjon for samtalegruppen.\n" + +#: ../pidgin/gtkblist.c:6237 +msgid "Autojoin when account becomes online." +msgstr "Autotilknytt når konto er tilkoblet." + +#: ../pidgin/gtkblist.c:6238 +msgid "Hide chat when the window is closed." +msgstr "Skjul samtale når vinduet er lukket." + +#: ../pidgin/gtkblist.c:6264 msgid "Please enter the name of the group to be added." msgstr "Vennligst skriv inn navnet på gruppen som skal legges til." -#: ../pidgin/gtkblist.c:6609 +#: ../pidgin/gtkblist.c:6909 msgid "/Accounts/" -msgstr "" - -#: ../pidgin/gtkblist.c:6633 -#, fuzzy +msgstr "/Kontoer/" + +#: ../pidgin/gtkblist.c:6933 msgid "_Edit Account" -msgstr "Konto:" - -#: ../pidgin/gtkblist.c:6646 ../pidgin/gtkconv.c:3073 +msgstr "_Rediger konto" + +#: ../pidgin/gtkblist.c:6946 +#: ../pidgin/gtkconv.c:3136 msgid "No actions available" msgstr "Ingen handlinger tilgjengelig" -#: ../pidgin/gtkblist.c:6654 -#, fuzzy +#: ../pidgin/gtkblist.c:6954 msgid "_Disable" -msgstr "Synlig" - -# -#: ../pidgin/gtkblist.c:6666 -#, fuzzy +msgstr "_Deaktiver" + +#: ../pidgin/gtkblist.c:6966 msgid "Enable Account" -msgstr "Konto" - -#: ../pidgin/gtkblist.c:6672 +msgstr "Aktiver konto" + +#: ../pidgin/gtkblist.c:6972 msgid "/Accounts/Enable Account" -msgstr "" - -#: ../pidgin/gtkblist.c:6721 -#, fuzzy +msgstr "/Kontoer/Aktiver konto" + +#: ../pidgin/gtkblist.c:7021 msgid "/Tools" -msgstr "/_Verktøy" - -#: ../pidgin/gtkblist.c:6791 -#, fuzzy +msgstr "/Verktøy" + +#: ../pidgin/gtkblist.c:7091 msgid "/Buddies/Sort Buddies" -msgstr "/Kontakter/Vis _avloggede kontakter" +msgstr "/Kontakter/Sorter kontakter" #. Widget creation function #: ../pidgin/gtkcertmgr.c:530 -#, fuzzy msgid "SSL Servers" -msgstr "Tjener" - -#: ../pidgin/gtkconn.c:180 -#, fuzzy, c-format +msgstr "SSL-tjenere" + +#: ../pidgin/gtkconn.c:181 +#, c-format msgid "" "%s\n" "\n" -"%s will not attempt to reconnect the account until you correct the error and " -"re-enable the account." -msgstr "" -"%s ble avkoblet pga. en feil. %s Kontoen har blitt avstengt. Korriger feilen " -"og slå på kontoen for å tilkoble." - -#: ../pidgin/gtkconv.c:482 -#, fuzzy +"%s will not attempt to reconnect the account until you correct the error and re-enable the account." +msgstr "" +"%s \n" +"\n" +"%s vil ikke prøve og koble til kontoen igjen for du har rettet på feilen og slått på kontoen igjen." + +#: ../pidgin/gtkconv.c:523 msgid "Unknown command." -msgstr "Ukjent kommando:" - -#: ../pidgin/gtkconv.c:754 ../pidgin/gtkconv.c:780 -#, fuzzy +msgstr "Ukjent kommando." + +#: ../pidgin/gtkconv.c:795 +#: ../pidgin/gtkconv.c:821 msgid "That buddy is not on the same protocol as this chat." -msgstr "Denne vennen er ikke på den samme protokollen som denne samtalegruppa" - -#: ../pidgin/gtkconv.c:774 -msgid "" -"You are not currently signed on with an account that can invite that buddy." -msgstr "" -"Du er ikke pålogget pålogget med en konto som kan invitere denne kameraten." - -#: ../pidgin/gtkconv.c:827 +msgstr "Denne kontakten er ikke på den samme protokollen som denne samtalegruppa." + +#: ../pidgin/gtkconv.c:815 +msgid "You are not currently signed on with an account that can invite that buddy." +msgstr "Du er ikke pålogget pålogget med en konto som kan invitere denne kontakten." + +#: ../pidgin/gtkconv.c:868 msgid "Invite Buddy Into Chat Room" -msgstr "Inviter kamerat inn i samtalerom" +msgstr "Inviter kontakten inn i samtalerom" #. Put our happy label in it. -#: ../pidgin/gtkconv.c:857 -msgid "" -"Please enter the name of the user you wish to invite, along with an optional " -"invite message." -msgstr "" -"Vennligst skriv inn navnet på brukeren som du vil invitere, og en eventuell " -"invitasjonsbeskjed." - -#: ../pidgin/gtkconv.c:878 +#: ../pidgin/gtkconv.c:898 +msgid "Please enter the name of the user you wish to invite, along with an optional invite message." +msgstr "Vennligst skriv inn navnet på brukeren som du vil invitere, og en eventuell invitasjonsbeskjed." + +#: ../pidgin/gtkconv.c:919 msgid "_Buddy:" -msgstr "Kontakt:" - -#: ../pidgin/gtkconv.c:889 ../pidgin/gtksavedstatuses.c:1194 +msgstr "_Kontakt:" + +#: ../pidgin/gtkconv.c:930 +#: ../pidgin/gtksavedstatuses.c:1194 #: ../pidgin/gtksavedstatuses.c:1528 msgid "_Message:" -msgstr "Beskjed:" - -#: ../pidgin/gtkconv.c:947 ../pidgin/gtkconv.c:2598 ../pidgin/gtkdebug.c:219 +msgstr "_Beskjed:" + +#: ../pidgin/gtkconv.c:988 +#: ../pidgin/gtkconv.c:2657 +#: ../pidgin/gtkdebug.c:219 #: ../pidgin/gtkft.c:543 msgid "Unable to open file." -msgstr "Klarte ikke åpne fil." - -#: ../pidgin/gtkconv.c:953 +msgstr "Kunne ikke ikke åpne fil." + +#: ../pidgin/gtkconv.c:994 #, c-format msgid "

Conversation with %s

\n" msgstr "

Samtale med %s

\n" -#: ../pidgin/gtkconv.c:991 +#: ../pidgin/gtkconv.c:1032 msgid "Save Conversation" msgstr "Lagre samtale" -#: ../pidgin/gtkconv.c:1140 ../pidgin/gtkdebug.c:167 ../pidgin/gtkdebug.c:743 +#: ../pidgin/gtkconv.c:1178 +#: ../pidgin/gtkdebug.c:167 +#: ../pidgin/gtkdebug.c:743 msgid "Find" msgstr "Finn" -# -#: ../pidgin/gtkconv.c:1166 ../pidgin/gtkdebug.c:195 +#: ../pidgin/gtkconv.c:1204 +#: ../pidgin/gtkdebug.c:195 msgid "_Search for:" msgstr "_Søk etter:" -#: ../pidgin/gtkconv.c:1622 +#: ../pidgin/gtkconv.c:1675 msgid "Un-Ignore" msgstr "Fjern ignorer" -#: ../pidgin/gtkconv.c:1625 +#: ../pidgin/gtkconv.c:1678 msgid "Ignore" msgstr "Ignorer" -#: ../pidgin/gtkconv.c:1645 +#: ../pidgin/gtkconv.c:1698 #, fuzzy msgid "Get Away Message" msgstr "Ny fraværsbeskjed" -#: ../pidgin/gtkconv.c:1668 -#, fuzzy +#: ../pidgin/gtkconv.c:1721 msgid "Last said" -msgstr "Etternavn:" - -#: ../pidgin/gtkconv.c:2606 +msgstr "Sa sist" + +#: ../pidgin/gtkconv.c:2665 msgid "Unable to save icon file to disk." msgstr "Kan ikke lagre ikonfil til disk." -#: ../pidgin/gtkconv.c:2657 +#: ../pidgin/gtkconv.c:2716 msgid "Save Icon" msgstr "Lagre ikon" -# -#: ../pidgin/gtkconv.c:2709 +#: ../pidgin/gtkconv.c:2768 msgid "Animate" msgstr "Animer" -#: ../pidgin/gtkconv.c:2714 +#: ../pidgin/gtkconv.c:2773 msgid "Hide Icon" msgstr "Skjul ikon" -#: ../pidgin/gtkconv.c:2717 +#: ../pidgin/gtkconv.c:2776 msgid "Save Icon As..." msgstr "Lagre ikon som..." -#: ../pidgin/gtkconv.c:2721 -#, fuzzy +#: ../pidgin/gtkconv.c:2780 msgid "Set Custom Icon..." -msgstr "Egendefinert" - -# -#: ../pidgin/gtkconv.c:2734 -#, fuzzy +msgstr "Velg eget ikon..." + +#: ../pidgin/gtkconv.c:2793 msgid "Remove Custom Icon" -msgstr "Fje_rn kontakt" - -#: ../pidgin/gtkconv.c:2861 +msgstr "Ta bort eget ikon" + +#: ../pidgin/gtkconv.c:2924 msgid "Show All" -msgstr "" +msgstr "Vis alle" #. Conversation menu -#: ../pidgin/gtkconv.c:2880 +#: ../pidgin/gtkconv.c:2943 msgid "/_Conversation" msgstr "/_Samtale" -#: ../pidgin/gtkconv.c:2882 +#: ../pidgin/gtkconv.c:2945 msgid "/Conversation/New Instant _Message..." -msgstr "/Samtale/Ny direktemelding..." - -#: ../pidgin/gtkconv.c:2887 +msgstr "/Samtale/Ny Direkte _Melding..." + +#: ../pidgin/gtkconv.c:2950 msgid "/Conversation/_Find..." msgstr "/Samtale/_Finn..." -# -#: ../pidgin/gtkconv.c:2889 +#: ../pidgin/gtkconv.c:2952 msgid "/Conversation/View _Log" -msgstr "/Samtale/_Vis logg..." - -#: ../pidgin/gtkconv.c:2890 +msgstr "/Samtale/_Vis logg" + +#: ../pidgin/gtkconv.c:2953 msgid "/Conversation/_Save As..." msgstr "/Samtale/_Lagre som..." -#: ../pidgin/gtkconv.c:2892 -#, fuzzy +#: ../pidgin/gtkconv.c:2955 msgid "/Conversation/Clea_r Scrollback" -msgstr "/Samtale/Tøm" - -#: ../pidgin/gtkconv.c:2896 +msgstr "/Samtale/Tø_m Tilbakeblikk" + +#: ../pidgin/gtkconv.c:2959 msgid "/Conversation/Se_nd File..." msgstr "/Samtale/Se_nd fil..." -#: ../pidgin/gtkconv.c:2897 +#: ../pidgin/gtkconv.c:2960 msgid "/Conversation/Add Buddy _Pounce..." -msgstr "/Samtale/Legg til _kompisvarsling" - -#: ../pidgin/gtkconv.c:2899 +msgstr "/Samtale/Legg til _kompisvarsling..." + +#: ../pidgin/gtkconv.c:2962 msgid "/Conversation/_Get Info" msgstr "/Samtale/_Hent info" -#: ../pidgin/gtkconv.c:2901 +#: ../pidgin/gtkconv.c:2964 msgid "/Conversation/In_vite..." -msgstr "/Samtale/_Inviter..." - -#: ../pidgin/gtkconv.c:2903 -#, fuzzy +msgstr "/Samtale/In_viter..." + +#: ../pidgin/gtkconv.c:2966 msgid "/Conversation/M_ore" -msgstr "/Samtale/L_ukk" - -#: ../pidgin/gtkconv.c:2907 -#, fuzzy +msgstr "/Samtale/M_ere" + +#: ../pidgin/gtkconv.c:2970 msgid "/Conversation/Al_ias..." -msgstr "/Samtale/Alias..." - -#: ../pidgin/gtkconv.c:2909 +msgstr "/Samtale/Al_ias..." + +#: ../pidgin/gtkconv.c:2972 msgid "/Conversation/_Block..." msgstr "/Samtale/_Blokker..." -#: ../pidgin/gtkconv.c:2911 -#, fuzzy +#: ../pidgin/gtkconv.c:2974 msgid "/Conversation/_Unblock..." -msgstr "/Samtale/_Blokker..." - -#: ../pidgin/gtkconv.c:2913 +msgstr "/Samtale/_Fjern blokkering..." + +#: ../pidgin/gtkconv.c:2976 msgid "/Conversation/_Add..." msgstr "/Samtale/_Legg til..." -#: ../pidgin/gtkconv.c:2915 +#: ../pidgin/gtkconv.c:2978 msgid "/Conversation/_Remove..." msgstr "/Samtale/_Fjern..." -#: ../pidgin/gtkconv.c:2920 +#: ../pidgin/gtkconv.c:2983 msgid "/Conversation/Insert Lin_k..." -msgstr "/Samtale/Sett inn len_ke..." - -#: ../pidgin/gtkconv.c:2922 +msgstr "/Samtale/Sett inn Len_ke..." + +#: ../pidgin/gtkconv.c:2985 msgid "/Conversation/Insert Imag_e..." -msgstr "/Samtale/Sett inn bild_e..." - -#: ../pidgin/gtkconv.c:2928 +msgstr "/Samtale/Sett inn Bild_e..." + +#: ../pidgin/gtkconv.c:2991 msgid "/Conversation/_Close" msgstr "/Samtale/L_ukk" #. Options -#: ../pidgin/gtkconv.c:2932 +#: ../pidgin/gtkconv.c:2995 msgid "/_Options" msgstr "/_Brukervalg" -#: ../pidgin/gtkconv.c:2933 +#: ../pidgin/gtkconv.c:2996 msgid "/Options/Enable _Logging" -msgstr "/Brukervalg/Slå på _logging" - -#: ../pidgin/gtkconv.c:2934 +msgstr "/Brukervalg/Slå på _Logging" + +#: ../pidgin/gtkconv.c:2997 msgid "/Options/Enable _Sounds" -msgstr "/Brukervalg/Slå på l_yder" - -#: ../pidgin/gtkconv.c:2936 -#, fuzzy +msgstr "/Brukervalg/Slå på _Lyder" + +#: ../pidgin/gtkconv.c:2999 msgid "/Options/Show Formatting _Toolbars" -msgstr "/Brukervalg/Vis _formateringsverktøy" - -#: ../pidgin/gtkconv.c:2937 -#, fuzzy +msgstr "/Brukervalg/Vis Formaterings _Verktøylinje" + +#: ../pidgin/gtkconv.c:3000 msgid "/Options/Show Ti_mestamps" -msgstr "/Brukervalg/Vis tidsstempler" - -#: ../pidgin/gtkconv.c:3061 -#, fuzzy +msgstr "/Brukervalg/Vis Ti_dsstempler" + +#: ../pidgin/gtkconv.c:3124 msgid "/Conversation/More" -msgstr "/Samtale/L_ukk" - -#: ../pidgin/gtkconv.c:3117 -#, fuzzy +msgstr "/Samtale/Mere" + +#: ../pidgin/gtkconv.c:3180 msgid "/Options" -msgstr "/_Brukervalg" +msgstr "/Brukervalg" #. The menubar has been deactivated. Make sure the 'More' submenu is regenerated next time #. * the 'Conversation' menu pops up. #. Make sure the 'Conversation -> More' menuitems are regenerated whenever #. * the 'Conversation' menu pops up because the entries can change after the #. * conversation is created. -#: ../pidgin/gtkconv.c:3152 ../pidgin/gtkconv.c:3184 -#, fuzzy +#: ../pidgin/gtkconv.c:3215 +#: ../pidgin/gtkconv.c:3247 msgid "/Conversation" -msgstr "/_Samtale" +msgstr "/Samtale" # -#: ../pidgin/gtkconv.c:3192 +#: ../pidgin/gtkconv.c:3255 msgid "/Conversation/View Log" msgstr "/Samtale/Vis logg" -#: ../pidgin/gtkconv.c:3198 +#: ../pidgin/gtkconv.c:3261 msgid "/Conversation/Send File..." msgstr "/Samtale/Send fil..." -#: ../pidgin/gtkconv.c:3202 +#: ../pidgin/gtkconv.c:3265 msgid "/Conversation/Add Buddy Pounce..." msgstr "/Samtale/Legg til kompisvarsling..." -#: ../pidgin/gtkconv.c:3208 +#: ../pidgin/gtkconv.c:3271 msgid "/Conversation/Get Info" msgstr "/Samtale/Hent info" -#: ../pidgin/gtkconv.c:3212 +#: ../pidgin/gtkconv.c:3275 msgid "/Conversation/Invite..." msgstr "/Samtale/Inviter..." -#: ../pidgin/gtkconv.c:3218 +#: ../pidgin/gtkconv.c:3281 msgid "/Conversation/Alias..." msgstr "/Samtale/Alias..." -#: ../pidgin/gtkconv.c:3222 +#: ../pidgin/gtkconv.c:3285 msgid "/Conversation/Block..." msgstr "/Samtale/Blokker..." -#: ../pidgin/gtkconv.c:3226 -#, fuzzy +#: ../pidgin/gtkconv.c:3289 msgid "/Conversation/Unblock..." -msgstr "/Samtale/Blokker..." - -#: ../pidgin/gtkconv.c:3230 +msgstr "/Samtale/Fjern blokkering..." + +#: ../pidgin/gtkconv.c:3293 msgid "/Conversation/Add..." msgstr "/Samtale/Legg til..." -#: ../pidgin/gtkconv.c:3234 +#: ../pidgin/gtkconv.c:3297 msgid "/Conversation/Remove..." msgstr "/Samtale/Fjern..." -#: ../pidgin/gtkconv.c:3240 +#: ../pidgin/gtkconv.c:3303 msgid "/Conversation/Insert Link..." -msgstr "/Samtale/Sett inn lenke" - -#: ../pidgin/gtkconv.c:3244 +msgstr "/Samtale/Sett inn lenke..." + +#: ../pidgin/gtkconv.c:3307 msgid "/Conversation/Insert Image..." msgstr "/Samtale/Sett inn bilde..." -#: ../pidgin/gtkconv.c:3250 +#: ../pidgin/gtkconv.c:3313 msgid "/Options/Enable Logging" msgstr "/Brukervalg/Slå på logging" -#: ../pidgin/gtkconv.c:3253 +#: ../pidgin/gtkconv.c:3316 msgid "/Options/Enable Sounds" msgstr "/Brukervalg/Slå på lyder" -#: ../pidgin/gtkconv.c:3266 -#, fuzzy +#: ../pidgin/gtkconv.c:3329 msgid "/Options/Show Formatting Toolbars" msgstr "/Brukervalg/Vis formateringsverktøy" -#: ../pidgin/gtkconv.c:3269 +#: ../pidgin/gtkconv.c:3332 msgid "/Options/Show Timestamps" msgstr "/Brukervalg/Vis tidsstempler" -#: ../pidgin/gtkconv.c:3346 ../pidgin/gtkconv.c:3388 +#: ../pidgin/gtkconv.c:3409 +#: ../pidgin/gtkconv.c:3451 msgid "User is typing..." msgstr "Brukeren skriver en melding..." -#: ../pidgin/gtkconv.c:3391 -#, fuzzy +#: ../pidgin/gtkconv.c:3454 msgid "User has typed something and stopped" -msgstr "Brukeren har skrevet noe og tatt pause" +msgstr "Brukeren har skrevet noe og pauset" #. Build the Send To menu -#: ../pidgin/gtkconv.c:3574 ../pidgin/gtkconv.c:8022 -#, fuzzy -msgid "_Send To" -msgstr "Send som" - -#: ../pidgin/gtkconv.c:4286 -#, fuzzy +#: ../pidgin/gtkconv.c:3637 +#: ../pidgin/gtkconv.c:8103 +msgid "S_end To" +msgstr "S_end til" + +#: ../pidgin/gtkconv.c:4349 msgid "_Send" -msgstr "Send" +msgstr "_Send" #. Setup the label telling how many people are in the room. -#: ../pidgin/gtkconv.c:4390 +#: ../pidgin/gtkconv.c:4453 msgid "0 people in room" msgstr "0 brukere i rommet" -#: ../pidgin/gtkconv.c:5759 ../pidgin/gtkconv.c:5880 +#: ../pidgin/gtkconv.c:5823 +#: ../pidgin/gtkconv.c:5944 #, c-format msgid "%d person in room" msgid_plural "%d people in room" -msgstr[0] "%d person i rommet" +msgstr[0] "%d personer i rommet" msgstr[1] "%d personer i rommet" -#: ../pidgin/gtkconv.c:6486 ../pidgin/gtkstatusbox.c:660 -#, fuzzy +#: ../pidgin/gtkconv.c:6550 +#: ../pidgin/gtkstatusbox.c:660 msgid "Typing" -msgstr "Ping" - -#: ../pidgin/gtkconv.c:6490 -#, fuzzy +msgstr "Skriver" + +#: ../pidgin/gtkconv.c:6554 msgid "Stopped Typing" -msgstr "Ping" - -#: ../pidgin/gtkconv.c:6493 +msgstr "Stoppet å skrive" + +#: ../pidgin/gtkconv.c:6557 #, fuzzy msgid "Nick Said" msgstr "Kallenavn" -#: ../pidgin/gtkconv.c:6496 ../pidgin/gtkdocklet.c:492 -#, fuzzy +#: ../pidgin/gtkconv.c:6560 +#: ../pidgin/gtkdocklet.c:492 msgid "Unread Messages" -msgstr "Send beskjed" - -#: ../pidgin/gtkconv.c:6499 -#, fuzzy +msgstr "Uleste beskjeder" + +#: ../pidgin/gtkconv.c:6563 msgid "New Event" -msgstr "Hendelse" - -#: ../pidgin/gtkconv.c:7572 -#, fuzzy +msgstr "Ny hendelse" + +#: ../pidgin/gtkconv.c:7654 msgid "clear: Clears all conversation scrollbacks." -msgstr "%s har lukket samtalevinduet." - -#: ../pidgin/gtkconv.c:7736 -#, fuzzy +msgstr "clear: Renser alle samtaler i tilbakeblikk." + +#: ../pidgin/gtkconv.c:7817 msgid "Confirm close" -msgstr "Bekrefte konto" - -#: ../pidgin/gtkconv.c:7768 -#, fuzzy +msgstr "Bekrefte lukking" + +#: ../pidgin/gtkconv.c:7849 msgid "You have unread messages. Are you sure you want to close the window?" -msgstr "Er du sikker på at du vil slette %s?" - -#: ../pidgin/gtkconv.c:8355 +msgstr "Du har uleste beskjeder. Er du sikker på at du vil lukke vinduet?" + +#: ../pidgin/gtkconv.c:8436 msgid "Close other tabs" -msgstr "" - -#: ../pidgin/gtkconv.c:8361 +msgstr "Lukk andre faner" + +#: ../pidgin/gtkconv.c:8442 msgid "Close all tabs" -msgstr "" - -#: ../pidgin/gtkconv.c:8369 +msgstr "Lukk alle faner" + +#: ../pidgin/gtkconv.c:8450 msgid "Detach this tab" -msgstr "" - -#: ../pidgin/gtkconv.c:8375 +msgstr "Koble fra denne fanen" + +#: ../pidgin/gtkconv.c:8456 msgid "Close this tab" -msgstr "" - -#: ../pidgin/gtkconv.c:8875 +msgstr "Lukk denne fanen" + +#: ../pidgin/gtkconv.c:8951 msgid "Close conversation" msgstr "Lukk samtalen" -#: ../pidgin/gtkconv.c:9477 +#: ../pidgin/gtkconv.c:9553 msgid "Last created window" -msgstr "Sist lagde vindu" - -#: ../pidgin/gtkconv.c:9479 +msgstr "Sist opprettede vindu" + +#: ../pidgin/gtkconv.c:9555 msgid "Separate IM and Chat windows" -msgstr "Skill direktemeldings- og gruppesamtalevinduer." - -#: ../pidgin/gtkconv.c:9481 ../pidgin/gtkprefs.c:1415 +msgstr "Skill direktemeldings- og gruppesamtalevinduer" + +#: ../pidgin/gtkconv.c:9557 +#: ../pidgin/gtkprefs.c:1417 msgid "New window" msgstr "Nytt vindu" -#: ../pidgin/gtkconv.c:9483 +#: ../pidgin/gtkconv.c:9559 msgid "By group" msgstr "Etter gruppe" -#: ../pidgin/gtkconv.c:9485 +#: ../pidgin/gtkconv.c:9561 msgid "By account" msgstr "Etter konto" @@ -15124,9 +14566,8 @@ msgstr "Lagre avlusningslogg" #: ../pidgin/gtkdebug.c:582 -#, fuzzy msgid "Invert" -msgstr "Sett _inn" +msgstr "Inverter" #: ../pidgin/gtkdebug.c:585 msgid "Highlight matches" @@ -15134,70 +14575,74 @@ #: ../pidgin/gtkdebug.c:652 msgid "_Icon Only" -msgstr "" +msgstr "Bare _Ikon" #: ../pidgin/gtkdebug.c:653 msgid "_Text Only" -msgstr "" +msgstr "Bare _Tekst" #: ../pidgin/gtkdebug.c:654 msgid "_Both Icon & Text" -msgstr "" +msgstr "_Både Ikon og Tekst" #: ../pidgin/gtkdebug.c:775 -#, fuzzy msgid "Filter" -msgstr "Feilet." +msgstr "Filter" #: ../pidgin/gtkdebug.c:794 -#, fuzzy msgid "Right click for more options." -msgstr "Vis flere valg" +msgstr "Høyreklikk for flere valg." #: ../pidgin/gtkdebug.c:824 msgid "Level " -msgstr "" - -#: ../pidgin/gtkdebug.c:825 ../pidgin/gtkdebug.c:831 +msgstr "Nivå" + +#: ../pidgin/gtkdebug.c:825 +#: ../pidgin/gtkdebug.c:831 msgid "Select the debug filter level." -msgstr "" +msgstr "Velg nivå for debug." #: ../pidgin/gtkdebug.c:833 -#, fuzzy msgid "All" -msgstr "Tillat" +msgstr "Alle" #: ../pidgin/gtkdebug.c:834 msgid "Misc" -msgstr "" +msgstr "Diverse" #: ../pidgin/gtkdebug.c:836 -#, fuzzy msgid "Warning" -msgstr "Advar" +msgstr "Advarsel" #: ../pidgin/gtkdebug.c:837 -#, fuzzy msgid "Error " msgstr "Feil" #: ../pidgin/gtkdebug.c:838 -#, fuzzy msgid "Fatal Error" -msgstr "Intern feil" - -#: ../pidgin/gtkdialogs.c:72 ../pidgin/gtkdialogs.c:117 +msgstr "Alvorlig feil" + +#: ../pidgin/gtkdialogs.c:72 +#: ../pidgin/gtkdialogs.c:117 msgid "lead developer" msgstr "hovedutvikler" -#: ../pidgin/gtkdialogs.c:73 ../pidgin/gtkdialogs.c:74 -#: ../pidgin/gtkdialogs.c:75 ../pidgin/gtkdialogs.c:76 -#: ../pidgin/gtkdialogs.c:77 ../pidgin/gtkdialogs.c:78 -#: ../pidgin/gtkdialogs.c:79 ../pidgin/gtkdialogs.c:80 -#: ../pidgin/gtkdialogs.c:81 ../pidgin/gtkdialogs.c:82 -#: ../pidgin/gtkdialogs.c:83 ../pidgin/gtkdialogs.c:84 -#: ../pidgin/gtkdialogs.c:85 ../pidgin/gtkdialogs.c:86 -#: ../pidgin/gtkdialogs.c:89 ../pidgin/gtkdialogs.c:91 +#: ../pidgin/gtkdialogs.c:73 +#: ../pidgin/gtkdialogs.c:74 +#: ../pidgin/gtkdialogs.c:75 +#: ../pidgin/gtkdialogs.c:76 +#: ../pidgin/gtkdialogs.c:77 +#: ../pidgin/gtkdialogs.c:78 +#: ../pidgin/gtkdialogs.c:79 +#: ../pidgin/gtkdialogs.c:80 +#: ../pidgin/gtkdialogs.c:81 +#: ../pidgin/gtkdialogs.c:82 +#: ../pidgin/gtkdialogs.c:83 +#: ../pidgin/gtkdialogs.c:84 +#: ../pidgin/gtkdialogs.c:85 +#: ../pidgin/gtkdialogs.c:86 +#: ../pidgin/gtkdialogs.c:89 +#: ../pidgin/gtkdialogs.c:91 #: ../pidgin/gtkdialogs.c:92 msgid "developer" msgstr "utvikler" @@ -15207,110 +14652,111 @@ msgid "support" msgstr "støtte" -# #: ../pidgin/gtkdialogs.c:88 -#, fuzzy msgid "support/QA" -msgstr "støtte" - -#: ../pidgin/gtkdialogs.c:90 ../pidgin/gtkdialogs.c:112 +msgstr "støtte/QA" + +#: ../pidgin/gtkdialogs.c:90 +#: ../pidgin/gtkdialogs.c:112 msgid "developer & webmaster" msgstr "utvikler og vevansvarlig" #: ../pidgin/gtkdialogs.c:99 msgid "Senior Contributor/QA" -msgstr "" +msgstr "Senior Contributor/QA" #: ../pidgin/gtkdialogs.c:108 msgid "win32 port" -msgstr "windows-versjon" - -# -#: ../pidgin/gtkdialogs.c:109 ../pidgin/gtkdialogs.c:110 +msgstr "win32 portering" + +#: ../pidgin/gtkdialogs.c:109 +#: ../pidgin/gtkdialogs.c:110 msgid "maintainer" msgstr "ansvarlig" #: ../pidgin/gtkdialogs.c:111 -#, fuzzy msgid "libfaim maintainer" -msgstr "tidligere libfaim-ansvarlig" +msgstr "libfaim-ansvarlig" #. If "lazy bum" translates literally into a serious insult, use something else or omit it. #: ../pidgin/gtkdialogs.c:114 msgid "hacker and designated driver [lazy bum]" -msgstr "hacker og sjåfør (avslappet fyr)" +msgstr "hacker og sjåfør [avslappet fyr]" #: ../pidgin/gtkdialogs.c:115 -#, fuzzy msgid "XMPP developer" -msgstr "utvikler" - -# +msgstr "XMPP-utvikler" + #: ../pidgin/gtkdialogs.c:116 msgid "original author" msgstr "opprinnelig laget av" #: ../pidgin/gtkdialogs.c:133 msgid "Afrikaans" -msgstr "" - -# -#: ../pidgin/gtkdialogs.c:134 ../pidgin/gtkdialogs.c:226 -#, fuzzy +msgstr "Afrikaans" + +#: ../pidgin/gtkdialogs.c:134 msgid "Arabic" -msgstr "Amharisk" +msgstr "Arabisk" #: ../pidgin/gtkdialogs.c:135 msgid "Belarusian Latin" -msgstr "" - -#: ../pidgin/gtkdialogs.c:136 ../pidgin/gtkdialogs.c:137 -#: ../pidgin/gtkdialogs.c:227 +msgstr "Belarusian Latin" + +#: ../pidgin/gtkdialogs.c:136 +#: ../pidgin/gtkdialogs.c:137 +#: ../pidgin/gtkdialogs.c:224 msgid "Bulgarian" msgstr "Bulgarsk" -#: ../pidgin/gtkdialogs.c:138 ../pidgin/gtkdialogs.c:139 -#: ../pidgin/gtkdialogs.c:140 ../pidgin/gtkdialogs.c:141 +#: ../pidgin/gtkdialogs.c:138 +#: ../pidgin/gtkdialogs.c:139 +#: ../pidgin/gtkdialogs.c:140 +#: ../pidgin/gtkdialogs.c:141 msgid "Bengali" -msgstr "" - -# +msgstr "Bengali" + #: ../pidgin/gtkdialogs.c:142 -#, fuzzy msgid "Bosnian" -msgstr "Estisk" - -#: ../pidgin/gtkdialogs.c:143 ../pidgin/gtkdialogs.c:228 -#: ../pidgin/gtkdialogs.c:229 +msgstr "Bosnisk" + +#: ../pidgin/gtkdialogs.c:143 +#: ../pidgin/gtkdialogs.c:225 +#: ../pidgin/gtkdialogs.c:226 msgid "Catalan" msgstr "Katalansk" -#: ../pidgin/gtkdialogs.c:144 ../pidgin/gtkdialogs.c:145 +#: ../pidgin/gtkdialogs.c:144 +#: ../pidgin/gtkdialogs.c:145 msgid "Valencian-Catalan" -msgstr "" - -#: ../pidgin/gtkdialogs.c:146 ../pidgin/gtkdialogs.c:230 +msgstr "Valencian-Catalan" + +#: ../pidgin/gtkdialogs.c:146 +#: ../pidgin/gtkdialogs.c:227 msgid "Czech" msgstr "Tsjekkisk" -# -#: ../pidgin/gtkdialogs.c:147 ../pidgin/gtkdialogs.c:148 +#: ../pidgin/gtkdialogs.c:147 +#: ../pidgin/gtkdialogs.c:148 msgid "Danish" msgstr "Dansk" -#: ../pidgin/gtkdialogs.c:149 ../pidgin/gtkdialogs.c:150 -#: ../pidgin/gtkdialogs.c:231 +#: ../pidgin/gtkdialogs.c:149 +#: ../pidgin/gtkdialogs.c:150 +#: ../pidgin/gtkdialogs.c:228 msgid "German" msgstr "Tysk" -#: ../pidgin/gtkdialogs.c:151 ../pidgin/gtkdialogs.c:152 +#: ../pidgin/gtkdialogs.c:151 +#: ../pidgin/gtkdialogs.c:152 #: ../pidgin/gtkdialogs.c:153 msgid "Dzongkha" -msgstr "" - -#: ../pidgin/gtkdialogs.c:154 ../pidgin/gtkdialogs.c:155 +msgstr "Dzongkha" + +#: ../pidgin/gtkdialogs.c:154 +#: ../pidgin/gtkdialogs.c:155 msgid "Greek" -msgstr "" +msgstr "Gresk" #: ../pidgin/gtkdialogs.c:156 msgid "Australian English" @@ -15326,58 +14772,63 @@ #: ../pidgin/gtkdialogs.c:159 msgid "Esperanto" -msgstr "" - -#: ../pidgin/gtkdialogs.c:160 ../pidgin/gtkdialogs.c:232 -#: ../pidgin/gtkdialogs.c:233 ../pidgin/gtkdialogs.c:234 -#: ../pidgin/gtkdialogs.c:235 +msgstr "Esperanto" + +#: ../pidgin/gtkdialogs.c:160 +#: ../pidgin/gtkdialogs.c:229 +#: ../pidgin/gtkdialogs.c:230 +#: ../pidgin/gtkdialogs.c:231 +#: ../pidgin/gtkdialogs.c:232 msgid "Spanish" msgstr "Spansk" -# #: ../pidgin/gtkdialogs.c:161 -#, fuzzy msgid "Estonian" msgstr "Estisk" -#: ../pidgin/gtkdialogs.c:162 ../pidgin/gtkdialogs.c:163 +#: ../pidgin/gtkdialogs.c:162 +#: ../pidgin/gtkdialogs.c:163 msgid "Euskera(Basque)" -msgstr "" - -#: ../pidgin/gtkdialogs.c:164 ../pidgin/gtkdialogs.c:165 +msgstr "Euskera(Basque)" + +#: ../pidgin/gtkdialogs.c:164 +#: ../pidgin/gtkdialogs.c:165 #: ../pidgin/gtkdialogs.c:166 #, fuzzy msgid "Persian" msgstr "Serbisk" -# -#: ../pidgin/gtkdialogs.c:167 ../pidgin/gtkdialogs.c:236 -#: ../pidgin/gtkdialogs.c:237 +#: ../pidgin/gtkdialogs.c:167 +#: ../pidgin/gtkdialogs.c:233 +#: ../pidgin/gtkdialogs.c:234 msgid "Finnish" msgstr "Finsk" -#: ../pidgin/gtkdialogs.c:168 ../pidgin/gtkdialogs.c:238 -#: ../pidgin/gtkdialogs.c:239 ../pidgin/gtkdialogs.c:240 -#: ../pidgin/gtkdialogs.c:241 +#: ../pidgin/gtkdialogs.c:168 +#: ../pidgin/gtkdialogs.c:235 +#: ../pidgin/gtkdialogs.c:236 +#: ../pidgin/gtkdialogs.c:237 +#: ../pidgin/gtkdialogs.c:238 msgid "French" msgstr "Fransk" -# -#: ../pidgin/gtkdialogs.c:169 ../pidgin/gtkdialogs.c:170 -#: ../pidgin/gtkdialogs.c:242 -#, fuzzy +#: ../pidgin/gtkdialogs.c:169 +#: ../pidgin/gtkdialogs.c:170 +#: ../pidgin/gtkdialogs.c:239 msgid "Galician" -msgstr "Italiensk" - -#: ../pidgin/gtkdialogs.c:171 ../pidgin/gtkdialogs.c:172 +msgstr "Galisisk" + +#: ../pidgin/gtkdialogs.c:171 +#: ../pidgin/gtkdialogs.c:172 msgid "Gujarati" -msgstr "" +msgstr "Gujarati" #: ../pidgin/gtkdialogs.c:172 msgid "Gujarati Language Team" -msgstr "" - -#: ../pidgin/gtkdialogs.c:173 ../pidgin/gtkdialogs.c:243 +msgstr "Gujarati Language Team" + +#: ../pidgin/gtkdialogs.c:173 +#: ../pidgin/gtkdialogs.c:240 msgid "Hebrew" msgstr "Hebraisk" @@ -15385,29 +14836,31 @@ msgid "Hindi" msgstr "Hindi" -#: ../pidgin/gtkdialogs.c:175 ../pidgin/gtkdialogs.c:244 +#: ../pidgin/gtkdialogs.c:175 +#: ../pidgin/gtkdialogs.c:241 msgid "Hungarian" msgstr "Ungarsk" #: ../pidgin/gtkdialogs.c:176 -#, fuzzy msgid "Indonesian" -msgstr "Makedons" - -# -#: ../pidgin/gtkdialogs.c:177 ../pidgin/gtkdialogs.c:245 +msgstr "Indonesisk" + +#: ../pidgin/gtkdialogs.c:177 +#: ../pidgin/gtkdialogs.c:242 msgid "Italian" msgstr "Italiensk" -#: ../pidgin/gtkdialogs.c:178 ../pidgin/gtkdialogs.c:246 -#: ../pidgin/gtkdialogs.c:247 ../pidgin/gtkdialogs.c:248 +#: ../pidgin/gtkdialogs.c:178 +#: ../pidgin/gtkdialogs.c:243 +#: ../pidgin/gtkdialogs.c:244 +#: ../pidgin/gtkdialogs.c:245 msgid "Japanese" msgstr "Japansk" -#: ../pidgin/gtkdialogs.c:179 ../pidgin/gtkdialogs.c:249 -#, fuzzy +#: ../pidgin/gtkdialogs.c:179 +#: ../pidgin/gtkdialogs.c:246 msgid "Georgian" -msgstr "Tysk" +msgstr "Georgisk" #: ../pidgin/gtkdialogs.c:179 #, fuzzy @@ -15415,378 +14868,328 @@ msgstr "Aktive oversettere" #: ../pidgin/gtkdialogs.c:180 -#, fuzzy msgid "Kannada" -msgstr "Bannlyst" +msgstr "Kannada" #: ../pidgin/gtkdialogs.c:180 msgid "Kannada Translation team" -msgstr "" - -#: ../pidgin/gtkdialogs.c:181 ../pidgin/gtkdialogs.c:250 -#: ../pidgin/gtkdialogs.c:251 +msgstr "Kannada Translation team" + +#: ../pidgin/gtkdialogs.c:181 +#: ../pidgin/gtkdialogs.c:247 +#: ../pidgin/gtkdialogs.c:248 msgid "Korean" msgstr "Koreansk" -#: ../pidgin/gtkdialogs.c:182 ../pidgin/gtkdialogs.c:183 +#: ../pidgin/gtkdialogs.c:182 +#: ../pidgin/gtkdialogs.c:183 #: ../pidgin/gtkdialogs.c:184 -#, fuzzy msgid "Kurdish" -msgstr "Tyrkisk" +msgstr "Kurdisk" #: ../pidgin/gtkdialogs.c:185 -msgid "Lao" -msgstr "" - -#: ../pidgin/gtkdialogs.c:186 ../pidgin/gtkdialogs.c:252 -#: ../pidgin/gtkdialogs.c:253 +#: ../pidgin/gtkdialogs.c:249 +#: ../pidgin/gtkdialogs.c:250 msgid "Lithuanian" msgstr "Litauisk" -#: ../pidgin/gtkdialogs.c:187 ../pidgin/gtkdialogs.c:188 -#: ../pidgin/gtkdialogs.c:189 ../pidgin/gtkdialogs.c:254 +#: ../pidgin/gtkdialogs.c:186 +#: ../pidgin/gtkdialogs.c:187 +#: ../pidgin/gtkdialogs.c:251 msgid "Macedonian" msgstr "Makedons" -#: ../pidgin/gtkdialogs.c:190 ../pidgin/gtkdialogs.c:255 -#: ../pidgin/gtkdialogs.c:256 -#, fuzzy +#: ../pidgin/gtkdialogs.c:188 +#: ../pidgin/gtkdialogs.c:252 msgid "Bokmål Norwegian" -msgstr "Norsk" - -#: ../pidgin/gtkdialogs.c:191 +msgstr "Norsk Bokmål" + +#: ../pidgin/gtkdialogs.c:189 msgid "Nepali" -msgstr "" - -#: ../pidgin/gtkdialogs.c:192 +msgstr "Nepalsk" + +#: ../pidgin/gtkdialogs.c:190 #, fuzzy msgid "Dutch, Flemish" msgstr "Nederlansk, flamsk" -#: ../pidgin/gtkdialogs.c:193 -#, fuzzy +#: ../pidgin/gtkdialogs.c:191 msgid "Norwegian Nynorsk" -msgstr "Norsk" - -# -#: ../pidgin/gtkdialogs.c:194 ../pidgin/gtkdialogs.c:195 -#: ../pidgin/gtkdialogs.c:196 ../pidgin/gtkdialogs.c:257 +msgstr "Norsk Nynorsk" + +#: ../pidgin/gtkdialogs.c:192 +#: ../pidgin/gtkdialogs.c:193 +#: ../pidgin/gtkdialogs.c:194 +#: ../pidgin/gtkdialogs.c:253 msgid "Polish" msgstr "Polsk" -#: ../pidgin/gtkdialogs.c:197 +#: ../pidgin/gtkdialogs.c:195 msgid "Portuguese" msgstr "Portugisisk" -#: ../pidgin/gtkdialogs.c:198 +#: ../pidgin/gtkdialogs.c:196 msgid "Portuguese-Brazil" msgstr "Portugisisk (Brasil)" +#: ../pidgin/gtkdialogs.c:197 +msgid "Pashto" +msgstr "Pashto" + +#: ../pidgin/gtkdialogs.c:198 +msgid "Romanian" +msgstr "Rumensk" + #: ../pidgin/gtkdialogs.c:199 -#, fuzzy -msgid "Pashto" -msgstr "Bilde" - -# -#: ../pidgin/gtkdialogs.c:200 -msgid "Romanian" -msgstr "Rumensk" - -#: ../pidgin/gtkdialogs.c:201 ../pidgin/gtkdialogs.c:258 -#: ../pidgin/gtkdialogs.c:259 +#: ../pidgin/gtkdialogs.c:254 +#: ../pidgin/gtkdialogs.c:255 msgid "Russian" msgstr "Russisk" -#: ../pidgin/gtkdialogs.c:202 ../pidgin/gtkdialogs.c:203 -#: ../pidgin/gtkdialogs.c:260 ../pidgin/gtkdialogs.c:261 -#: ../pidgin/gtkdialogs.c:262 +#: ../pidgin/gtkdialogs.c:200 +#: ../pidgin/gtkdialogs.c:201 +#: ../pidgin/gtkdialogs.c:256 +#: ../pidgin/gtkdialogs.c:257 +#: ../pidgin/gtkdialogs.c:258 msgid "Slovak" msgstr "Slovakisk" -#: ../pidgin/gtkdialogs.c:204 ../pidgin/gtkdialogs.c:263 +#: ../pidgin/gtkdialogs.c:202 +#: ../pidgin/gtkdialogs.c:259 msgid "Slovenian" msgstr "Slovensk" -# -#: ../pidgin/gtkdialogs.c:205 +#: ../pidgin/gtkdialogs.c:203 msgid "Albanian" msgstr "Albansk" -#: ../pidgin/gtkdialogs.c:206 ../pidgin/gtkdialogs.c:207 -#: ../pidgin/gtkdialogs.c:264 ../pidgin/gtkdialogs.c:265 +#: ../pidgin/gtkdialogs.c:204 +#: ../pidgin/gtkdialogs.c:205 +#: ../pidgin/gtkdialogs.c:260 +#: ../pidgin/gtkdialogs.c:261 msgid "Serbian" msgstr "Serbisk" -#: ../pidgin/gtkdialogs.c:208 ../pidgin/gtkdialogs.c:266 -#: ../pidgin/gtkdialogs.c:267 +#: ../pidgin/gtkdialogs.c:206 +#: ../pidgin/gtkdialogs.c:262 +#: ../pidgin/gtkdialogs.c:263 msgid "Swedish" msgstr "Svensk" +#: ../pidgin/gtkdialogs.c:207 +msgid "Tamil" +msgstr "Tamil" + +#: ../pidgin/gtkdialogs.c:208 +msgid "Telugu" +msgstr "Dravidisk" + #: ../pidgin/gtkdialogs.c:209 -#, fuzzy -msgid "Tamil" -msgstr "Terminal" +msgid "Thai" +msgstr "Thai" #: ../pidgin/gtkdialogs.c:210 -msgid "Telugu" -msgstr "Dravidisk" +#: ../pidgin/gtkdialogs.c:264 +msgid "Turkish" +msgstr "Tyrkisk" #: ../pidgin/gtkdialogs.c:211 -msgid "Thai" -msgstr "" - -#: ../pidgin/gtkdialogs.c:212 ../pidgin/gtkdialogs.c:268 -msgid "Turkish" -msgstr "Tyrkisk" - -#: ../pidgin/gtkdialogs.c:213 msgid "Vietnamese" msgstr "Vietnamesisk" +#: ../pidgin/gtkdialogs.c:211 +#, fuzzy +msgid "T.M.Thanh and the Gnome-Vi Team" +msgstr "T.M.Thanh and the Gnome-Vi Team" + +#: ../pidgin/gtkdialogs.c:212 +#: ../pidgin/gtkdialogs.c:265 +msgid "Simplified Chinese" +msgstr "Forenklet kinesisk" + #: ../pidgin/gtkdialogs.c:213 -msgid "T.M.Thanh and the Gnome-Vi Team" -msgstr "" - -#: ../pidgin/gtkdialogs.c:214 ../pidgin/gtkdialogs.c:269 -msgid "Simplified Chinese" -msgstr "Forenklet kinesisk" - -#: ../pidgin/gtkdialogs.c:215 ../pidgin/gtkdialogs.c:216 +#: ../pidgin/gtkdialogs.c:214 +#: ../pidgin/gtkdialogs.c:215 +msgid "Hong Kong Chinese" +msgstr "Hong Kong Kinesisk" + +#: ../pidgin/gtkdialogs.c:216 #: ../pidgin/gtkdialogs.c:217 -msgid "Hong Kong Chinese" -msgstr "" - -#: ../pidgin/gtkdialogs.c:218 ../pidgin/gtkdialogs.c:219 -#: ../pidgin/gtkdialogs.c:270 +#: ../pidgin/gtkdialogs.c:266 msgid "Traditional Chinese" -msgstr "Tradisjonell kinesisk" +msgstr "Tradisjonell Kinesisk" # -#: ../pidgin/gtkdialogs.c:225 +#: ../pidgin/gtkdialogs.c:223 msgid "Amharic" msgstr "Amharisk" -#: ../pidgin/gtkdialogs.c:357 -#, fuzzy, c-format +#: ../pidgin/gtkdialogs.c:353 +#, c-format msgid "About %s" -msgstr "Om Gaim" - -#: ../pidgin/gtkdialogs.c:400 -#, c-format -msgid "" -"%s is a graphical modular messaging client based on libpurple which is " -"capable of connecting to AIM, MSN, Yahoo!, XMPP, ICQ, IRC, SILC, SIP/SIMPLE, " -"Novell GroupWise, Lotus Sametime, Bonjour, Zephyr, MySpaceIM, Gadu-Gadu, and " -"QQ all at once. It is written using GTK+.

You may modify and " -"redistribute the program under the terms of the GPL (version 2 or later). A " -"copy of the GPL is contained in the 'COPYING' file distributed with %s. %s " -"is copyrighted by its contributors. See the 'COPYRIGHT' file for the " -"complete list of contributors. We provide no warranty for this program." -"

" -msgstr "" - -#: ../pidgin/gtkdialogs.c:418 -#, fuzzy, c-format +msgstr "Om %s" + +#: ../pidgin/gtkdialogs.c:396 +#, c-format +msgid "%s is a graphical modular messaging client based on libpurple which is capable of connecting to AIM, MSN, Yahoo!, XMPP, ICQ, IRC, SILC, SIP/SIMPLE, Novell GroupWise, Lotus Sametime, Bonjour, Zephyr, MySpaceIM, Gadu-Gadu, and QQ all at once. It is written using GTK+.

You may modify and redistribute the program under the terms of the GPL (version 2 or later). A copy of the GPL is contained in the 'COPYING' file distributed with %s. %s is copyrighted by its contributors. See the 'COPYRIGHT' file for the complete list of contributors. We provide no warranty for this program.

" +msgstr "%s er en modulær grafisk samtaleklient basert på libpurple som kan koble til AIM, MSN, Yahoo!, XMPP, ICQ, IRC, SILC,SIP/SIMPLE, Novell GroupWise, Lotus Sametime, Bonjour, Zephyr,MySpaceIM, Gadu-Gadu, og QQ samtidig. Den er skrevet ved bruk av GTK+.

Du kan modifisere og redistribuere programmet under GPL (versjon 2 eller senere) En kopi av GPL er plassert i COPYING filen distribuert med %s. %s er kopibeskyttet av utgiverne. Se COPYRIGHT filen for en komplett liste av utgivere. Vi gir ingen garanti for dette programmet.

" + +#: ../pidgin/gtkdialogs.c:414 msgid "IRC: #pidgin on irc.freenode.net

" -msgstr "IRC: #gaim på irc.freenode.net

" - -#: ../pidgin/gtkdialogs.c:423 -#, fuzzy +msgstr "IRC: #pidgin på irc.freenode.net

" + +#: ../pidgin/gtkdialogs.c:419 msgid "Current Developers" -msgstr "tidligere utviklere" - -#: ../pidgin/gtkdialogs.c:438 +msgstr "Tidligere utviklere" + +#: ../pidgin/gtkdialogs.c:434 msgid "Crazy Patch Writers" -msgstr "folk som har bidratt med rettelser" - -#: ../pidgin/gtkdialogs.c:453 +msgstr "Folk som har bidratt med rettelser" + +#: ../pidgin/gtkdialogs.c:449 msgid "Retired Developers" msgstr "tidligere utviklere" -#: ../pidgin/gtkdialogs.c:468 -#, fuzzy +#: ../pidgin/gtkdialogs.c:464 msgid "Retired Crazy Patch Writers" -msgstr "folk som har bidratt med rettelser" - -#: ../pidgin/gtkdialogs.c:483 +msgstr "\"Pensjonerte\" folk som har bidratt med rettelser" + +#: ../pidgin/gtkdialogs.c:479 msgid "Artists" -msgstr "" - -#: ../pidgin/gtkdialogs.c:498 +msgstr "Artister" + +#: ../pidgin/gtkdialogs.c:494 msgid "Current Translators" msgstr "Aktive oversettere" -#: ../pidgin/gtkdialogs.c:518 +#: ../pidgin/gtkdialogs.c:514 msgid "Past Translators" msgstr "Tidligere oversettere" -#: ../pidgin/gtkdialogs.c:536 -#, fuzzy +#: ../pidgin/gtkdialogs.c:532 msgid "Debugging Information" -msgstr "Brukerinformasjon" - -#: ../pidgin/gtkdialogs.c:906 +msgstr "Debuggings Informasjon" + +#: ../pidgin/gtkdialogs.c:902 msgid "Get User Info" msgstr "Hent brukerinfo" -#: ../pidgin/gtkdialogs.c:908 -#, fuzzy -msgid "" -"Please enter the screen name or alias of the person whose info you would " -"like to view." -msgstr "" -"Vennligst skriv inn skjermnavnet til den personen du vil se informasjon om." - -#: ../pidgin/gtkdialogs.c:998 -#, fuzzy +#: ../pidgin/gtkdialogs.c:904 +msgid "Please enter the screen name or alias of the person whose info you would like to view." +msgstr "Vennligst skriv inn skjermnavnet eller aliaset til den personen du vil se informasjon om." + +#: ../pidgin/gtkdialogs.c:994 msgid "View User Log" -msgstr "Hent brukerlogg" - -#: ../pidgin/gtkdialogs.c:1000 -#, fuzzy -msgid "" -"Please enter the screen name or alias of the person whose log you would like " -"to view." -msgstr "" -"Vennligst skriv inn skjermnavnet til den personen du vil se loggen til." - -# -#: ../pidgin/gtkdialogs.c:1020 +msgstr "Se på brukerlogg" + +#: ../pidgin/gtkdialogs.c:996 +msgid "Please enter the screen name or alias of the person whose log you would like to view." +msgstr "Vennligst skriv inn skjermnavnet eller aliaset til den personen du vil se loggen til." + +#: ../pidgin/gtkdialogs.c:1016 msgid "Alias Contact" msgstr "Kontaktalias" -# -#: ../pidgin/gtkdialogs.c:1021 +#: ../pidgin/gtkdialogs.c:1017 msgid "Enter an alias for this contact." -msgstr "Vennligst skriv inn aliasnavn for denne kontakten." - -#: ../pidgin/gtkdialogs.c:1043 +msgstr "Vennligst skriv inn et alias for denne kontakten." + +#: ../pidgin/gtkdialogs.c:1039 #, c-format msgid "Enter an alias for %s." msgstr "Oppgi et alias for %s." -#: ../pidgin/gtkdialogs.c:1045 +#: ../pidgin/gtkdialogs.c:1041 msgid "Alias Buddy" msgstr "Alias for kontakt" -#: ../pidgin/gtkdialogs.c:1066 +#: ../pidgin/gtkdialogs.c:1062 msgid "Alias Chat" msgstr "Samtalealias" -#: ../pidgin/gtkdialogs.c:1067 +#: ../pidgin/gtkdialogs.c:1063 msgid "Enter an alias for this chat." msgstr "Vennligst skriv inn aliasnavn for denne samtalegruppa." -#: ../pidgin/gtkdialogs.c:1106 +#: ../pidgin/gtkdialogs.c:1102 #, fuzzy, c-format -msgid "" -"You are about to remove the contact containing %s and %d other buddy from " -"your buddy list. Do you want to continue?" -msgid_plural "" -"You are about to remove the contact containing %s and %d other buddies from " -"your buddy list. Do you want to continue?" -msgstr[0] "" -"Er du sikker på at du vil fjerne kontakten som inneholder %s og %d andre " -"kontakter fra kontaktlisten din?" -msgstr[1] "" -"Er du sikker på at du vil fjerne kontakten som inneholder %s og %d andre " -"kontakter fra kontaktlisten din?" - -# -#: ../pidgin/gtkdialogs.c:1114 +msgid "You are about to remove the contact containing %s and %d other buddy from your buddy list. Do you want to continue?" +msgid_plural "You are about to remove the contact containing %s and %d other buddies from your buddy list. Do you want to continue?" +msgstr[0] "Er du sikker på at du vil fjerne kontakten som inneholder %s og %d andre kontakter fra kontaktlisten din?" +msgstr[1] "Er du sikker på at du vil fjerne kontakten som inneholder %s og %d andre kontakter fra kontaktlisten din?" + +#: ../pidgin/gtkdialogs.c:1110 msgid "Remove Contact" -msgstr "Fje_rn kontakt" - -# -#: ../pidgin/gtkdialogs.c:1117 -#, fuzzy +msgstr "Fjern kontakt" + +#: ../pidgin/gtkdialogs.c:1113 msgid "_Remove Contact" -msgstr "Fje_rn kontakt" - -#: ../pidgin/gtkdialogs.c:1148 +msgstr "_Fjern Kontakt" + +#: ../pidgin/gtkdialogs.c:1144 #, fuzzy, c-format -msgid "" -"You are about to merge the group called %s into the group called %s. Do you " -"want to continue?" -msgstr "" -"Er du sikker på at du vil fjerne gruppen %s med alle medlemmer fra " -"kontaktlisten din?" - -#: ../pidgin/gtkdialogs.c:1155 -#, fuzzy +msgid "You are about to merge the group called %s into the group called %s. Do you want to continue?" +msgstr "Er du sikker på at du vil fjerne gruppen %s med alle medlemmer fra kontaktlisten din?" + +#: ../pidgin/gtkdialogs.c:1151 msgid "Merge Groups" -msgstr "Fjern gruppe" - -#: ../pidgin/gtkdialogs.c:1158 -#, fuzzy +msgstr "Flett Sammen Grupper" + +#: ../pidgin/gtkdialogs.c:1154 msgid "_Merge Groups" -msgstr "Slett gruppe" - -#: ../pidgin/gtkdialogs.c:1208 -#, c-format -msgid "" -"You are about to remove the group %s and all its members from your buddy " -"list. Do you want to continue?" -msgstr "" -"Er du sikker på at du vil fjerne gruppen %s med alle medlemmer fra " -"kontaktlisten din?" - -#: ../pidgin/gtkdialogs.c:1211 +msgstr "_Flett Sammen Grupper" + +#: ../pidgin/gtkdialogs.c:1204 +#, c-format +msgid "You are about to remove the group %s and all its members from your buddy list. Do you want to continue?" +msgstr "Er du sikker på at du vil fjerne gruppen %s med alle medlemmer fra kontaktlisten din?" + +#: ../pidgin/gtkdialogs.c:1207 msgid "Remove Group" msgstr "Fjern gruppe" -#: ../pidgin/gtkdialogs.c:1214 -#, fuzzy +#: ../pidgin/gtkdialogs.c:1210 msgid "_Remove Group" -msgstr "Fjern gruppe" - -#: ../pidgin/gtkdialogs.c:1247 -#, c-format -msgid "" -"You are about to remove %s from your buddy list. Do you want to continue?" +msgstr "_Fjern Gruppe" + +#: ../pidgin/gtkdialogs.c:1243 +#, c-format +msgid "You are about to remove %s from your buddy list. Do you want to continue?" msgstr "Er du sikker på at du vil fjerne %s fra kontaktlisten din?" -#: ../pidgin/gtkdialogs.c:1250 +#: ../pidgin/gtkdialogs.c:1246 msgid "Remove Buddy" msgstr "Fjern kontakt" -#: ../pidgin/gtkdialogs.c:1253 +#: ../pidgin/gtkdialogs.c:1249 msgid "_Remove Buddy" -msgstr "Fje_rn kontakt" - -#: ../pidgin/gtkdialogs.c:1274 -#, c-format -msgid "" -"You are about to remove the chat %s from your buddy list. Do you want to " -"continue?" -msgstr "" -"Er du sikker på at du vil fjerne samtalegruppen %s fra kontaktlisten din?" - -#: ../pidgin/gtkdialogs.c:1277 +msgstr "_Fjern Kontakt" + +#: ../pidgin/gtkdialogs.c:1270 +#, c-format +msgid "You are about to remove the chat %s from your buddy list. Do you want to continue?" +msgstr "Er du sikker på at du vil fjerne samtalegruppen %s fra kontaktlisten din?" + +#: ../pidgin/gtkdialogs.c:1273 msgid "Remove Chat" msgstr "Fjern samtalegruppe" -#: ../pidgin/gtkdialogs.c:1280 -#, fuzzy +#: ../pidgin/gtkdialogs.c:1276 msgid "_Remove Chat" -msgstr "Fjern samtalegruppe" +msgstr "_Fjern samtalegruppe" #: ../pidgin/gtkdocklet.c:150 -#, fuzzy msgid "Right-click for more unread messages...\n" -msgstr "Vis flere valg" +msgstr "Høyreklikk for flere uleste beskjeder...\n" #: ../pidgin/gtkdocklet.c:435 -#, fuzzy msgid "Change Status" -msgstr "Endre adresse til:" +msgstr "Endre status" #: ../pidgin/gtkdocklet.c:487 -#, fuzzy msgid "Show Buddy List" -msgstr "Kontaktliste" - -# +msgstr "Vis kontaktliste" + #: ../pidgin/gtkdocklet.c:513 msgid "New Message..." msgstr "Ny melding..." @@ -15795,24 +15198,22 @@ msgid "Mute Sounds" msgstr "Skru av lyder" -# #: ../pidgin/gtkdocklet.c:535 #, fuzzy -msgid "Blink on new message" -msgstr "Ny melding..." +msgid "Blink on New Message" +msgstr "Blink ved nye beskjeder" #: ../pidgin/gtkdocklet.c:542 msgid "Quit" msgstr "Avslutt" #: ../pidgin/gtkft.c:154 -#, fuzzy msgid "Not started" -msgstr "Ikke støttet" +msgstr "Ikke startet" #: ../pidgin/gtkft.c:274 msgid "Receiving As:" -msgstr "Mottar som:" +msgstr "Mottas som:" #: ../pidgin/gtkft.c:276 msgid "Receiving From:" @@ -15828,35 +15229,34 @@ #: ../pidgin/gtkft.c:498 msgid "There is no application configured to open this type of file." -msgstr "Ingen applikasjon er assosiert med denne filtypen" +msgstr "Ingen applikasjon er assosiert med denne filtypen." #: ../pidgin/gtkft.c:503 msgid "An error occurred while opening the file." -msgstr "En feil oppsto under åpningen av filen" +msgstr "En feil oppsto under åpningen av filen." #: ../pidgin/gtkft.c:540 -#, fuzzy, c-format +#, c-format msgid "Error launching %s: %s" -msgstr "Feil under starting av kommando: %s:%s" +msgstr "Feil under start av %s: %s" #: ../pidgin/gtkft.c:549 -#, fuzzy, c-format +#, c-format msgid "Error running %s" -msgstr "Klarte ikke bli med i gruppesamtale %s" +msgstr "Feil ved kjøring av %s" #: ../pidgin/gtkft.c:550 #, c-format msgid "Process returned error code %d" -msgstr "" +msgstr "Prosessen returnerte feilkode %d" #: ../pidgin/gtkft.c:697 msgid "Filename:" msgstr "Filnavn:" #: ../pidgin/gtkft.c:698 -#, fuzzy msgid "Local File:" -msgstr "Lokale brukere" +msgstr "Lokal fil:" #: ../pidgin/gtkft.c:700 msgid "Speed:" @@ -15872,21 +15272,20 @@ #: ../pidgin/gtkft.c:784 msgid "Close this window when all transfers _finish" -msgstr "" +msgstr "Lukk dette vinduet når alle overføringene er _fullført" #: ../pidgin/gtkft.c:794 -#, fuzzy msgid "C_lear finished transfers" -msgstr "Fjern fullførte overføringer" +msgstr "F_jern fullførte overføringer" #. "Download Details" arrow #: ../pidgin/gtkft.c:803 -#, fuzzy msgid "File transfer _details" -msgstr "Skjul overføringsdetaljer" +msgstr "Skjul overførings_detaljer" #. Pause button -#: ../pidgin/gtkft.c:833 ../pidgin/pidginstock.c:95 +#: ../pidgin/gtkft.c:833 +#: ../pidgin/pidginstock.c:95 msgid "_Pause" msgstr "_Pause" @@ -15896,12 +15295,11 @@ msgstr "_Fortsett" #: ../pidgin/gtkimhtml.c:816 -#, fuzzy msgid "Paste as Plain _Text" -msgstr "Li_m inn som tekst" - -#: ../pidgin/gtkimhtml.c:833 ../pidgin/gtkimhtmltoolbar.c:1194 -#, fuzzy +msgstr "Lim inn som Ren _Tekst" + +#: ../pidgin/gtkimhtml.c:833 +#: ../pidgin/gtkimhtmltoolbar.c:1195 msgid "_Reset formatting" msgstr "_Fjern formatering" @@ -15911,7 +15309,7 @@ #: ../pidgin/gtkimhtml.c:1374 msgid "Color to draw hyperlinks." -msgstr "Farge på lenker" +msgstr "Fargen som lenker skal ha." #: ../pidgin/gtkimhtml.c:1377 #, fuzzy @@ -15919,22 +15317,20 @@ msgstr "Farge på lenke" #: ../pidgin/gtkimhtml.c:1378 -#, fuzzy msgid "Color to draw hyperlinks when mouse is over them." -msgstr "Farge på lenker" - -# +msgstr "Farge på lenker." + #: ../pidgin/gtkimhtml.c:1598 msgid "_Copy E-Mail Address" -msgstr "Kopier e-postadresse" +msgstr "_Kopier e-postadresse" #: ../pidgin/gtkimhtml.c:1610 msgid "_Open Link in Browser" -msgstr "Åpne i nettleser" +msgstr "_Åpne lenke i nettleser" #: ../pidgin/gtkimhtml.c:1620 msgid "_Copy Link Location" -msgstr "Kopier snarvei" +msgstr "_Kopier lenkemål" #: ../pidgin/gtkimhtml.c:3369 msgid "" @@ -15957,32 +15353,35 @@ "Går tilbake til PNG." #: ../pidgin/gtkimhtml.c:3401 -#, fuzzy, c-format +#, c-format msgid "" "Error saving image\n" "\n" "%s" msgstr "" -"Du har e-post!\n" +"Feil ved lagring av bilde\n" "\n" "%s" #: ../pidgin/gtkimhtml.c:3404 -#, fuzzy, c-format +#, c-format msgid "" "Error saving image\n" "\n" "%s" -msgstr "Feil under lagring av bilde: %s" - -#: ../pidgin/gtkimhtml.c:3482 ../pidgin/gtkimhtml.c:3494 +msgstr "" +"Feil ved lagring av bilde\n" +"\n" +"%s" + +#: ../pidgin/gtkimhtml.c:3482 +#: ../pidgin/gtkimhtml.c:3494 msgid "Save Image" msgstr "Lagre bilde" #: ../pidgin/gtkimhtml.c:3522 -#, c-format msgid "_Save Image..." -msgstr "Lagre bilde..." +msgstr "_Lagre bilde..." #: ../pidgin/gtkimhtmltoolbar.c:163 msgid "Select Font" @@ -16001,29 +15400,24 @@ msgstr "_URL" #: ../pidgin/gtkimhtmltoolbar.c:418 -#, fuzzy msgid "_Description" -msgstr "Beskrivelse" +msgstr "_Beskrivelse" #: ../pidgin/gtkimhtmltoolbar.c:421 -msgid "" -"Please enter the URL and description of the link that you want to insert. " -"The description is optional." -msgstr "" -"Vennligst skriv inn URL og beskrivelse av lenka du vil sette inn. " -"Beskrivelsesfeltet er valgfritt." +msgid "Please enter the URL and description of the link that you want to insert. The description is optional." +msgstr "Vennligst skriv inn URL og beskrivelse av lenka du vil sette inn. Beskrivelsesfeltet er valgfritt." #: ../pidgin/gtkimhtmltoolbar.c:425 msgid "Please enter the URL of the link that you want to insert." -msgstr "" -"Vennligst skriv inn URL og beskrivelse av lenka du vil sette inn. " -"Beskrivelsesfeltet er valgfritt." - -#: ../pidgin/gtkimhtmltoolbar.c:430 ../pidgin/gtkimhtmltoolbar.c:1102 +msgstr "Vennligst skriv inn URL og beskrivelse av lenka du vil sette inn. Beskrivelsesfeltet er valgfritt." + +#: ../pidgin/gtkimhtmltoolbar.c:430 +#: ../pidgin/gtkimhtmltoolbar.c:1102 msgid "Insert Link" msgstr "Sett inn lenke" -#: ../pidgin/gtkimhtmltoolbar.c:434 ../pidgin/gtkimhtmltoolbar.c:1262 +#: ../pidgin/gtkimhtmltoolbar.c:434 +#: ../pidgin/gtkimhtmltoolbar.c:1263 msgid "_Insert" msgstr "Sett _inn" @@ -16032,23 +15426,24 @@ msgid "Failed to store image: %s\n" msgstr "Klarte ikke å lagre bilde: %s\n" -#: ../pidgin/gtkimhtmltoolbar.c:540 ../pidgin/gtkimhtmltoolbar.c:550 +#: ../pidgin/gtkimhtmltoolbar.c:540 +#: ../pidgin/gtkimhtmltoolbar.c:550 msgid "Insert Image" msgstr "Sett inn bilde" #: ../pidgin/gtkimhtmltoolbar.c:761 msgid "This theme has no available smileys." -msgstr "Dette temaet har ingen tilgjengelige smileys (fjesinger)." +msgstr "Dette temaet har ingen tilgjengelige smileys." #. show everything #: ../pidgin/gtkimhtmltoolbar.c:778 msgid "Smile!" msgstr "Smil!" -#: ../pidgin/gtkimhtmltoolbar.c:846 ../pidgin/gtkimhtmltoolbar.c:1219 -#, fuzzy +#: ../pidgin/gtkimhtmltoolbar.c:846 +#: ../pidgin/gtkimhtmltoolbar.c:1220 msgid "_Font" -msgstr "Konto:" +msgstr "_Font" #: ../pidgin/gtkimhtmltoolbar.c:1054 #, fuzzy @@ -16057,44 +15452,44 @@ #: ../pidgin/gtkimhtmltoolbar.c:1054 msgid "Ungroup Items" -msgstr "" - -#: ../pidgin/gtkimhtmltoolbar.c:1088 ../pidgin/plugins/convcolors.c:287 +msgstr "Av-grupper Posteringer" + +#: ../pidgin/gtkimhtmltoolbar.c:1088 +#: ../pidgin/plugins/convcolors.c:287 msgid "Bold" msgstr "Fet" -#: ../pidgin/gtkimhtmltoolbar.c:1089 ../pidgin/plugins/convcolors.c:294 +#: ../pidgin/gtkimhtmltoolbar.c:1089 +#: ../pidgin/plugins/convcolors.c:294 msgid "Italic" msgstr "Kursiv" -#: ../pidgin/gtkimhtmltoolbar.c:1090 ../pidgin/plugins/convcolors.c:301 +#: ../pidgin/gtkimhtmltoolbar.c:1090 +#: ../pidgin/plugins/convcolors.c:301 msgid "Underline" msgstr "Understrek" #: ../pidgin/gtkimhtmltoolbar.c:1091 msgid "Strikethrough" -msgstr "" +msgstr "Gjennomstrek" #: ../pidgin/gtkimhtmltoolbar.c:1093 -#, fuzzy msgid "Increase Font Size" -msgstr "Ignorer skriftstørrelser" +msgstr "Øk skriftstørrelse" #: ../pidgin/gtkimhtmltoolbar.c:1094 msgid "Decrease Font Size" -msgstr "" +msgstr "Minsk skriftstørrelse" #: ../pidgin/gtkimhtmltoolbar.c:1096 msgid "Font Face" msgstr "Skrifttype" #: ../pidgin/gtkimhtmltoolbar.c:1097 -#, fuzzy msgid "Background Color" msgstr "Bakgrunnsfarge" #: ../pidgin/gtkimhtmltoolbar.c:1098 -#, fuzzy msgid "Foreground Color" msgstr "Forgrunnsfarge" @@ -16109,143 +15504,109 @@ msgstr "Sett inn bilde" #: ../pidgin/gtkimhtmltoolbar.c:1104 -#, fuzzy msgid "Insert Smiley" msgstr "Sett inn smilefjes" -#: ../pidgin/gtkimhtmltoolbar.c:1179 -#, fuzzy +#: ../pidgin/gtkimhtmltoolbar.c:1180 msgid "_Bold" -msgstr "_Passord:" - -#: ../pidgin/gtkimhtmltoolbar.c:1180 -#, fuzzy -msgid "_Italic" -msgstr " (irc-operatør)" +msgstr "_Uthev" #: ../pidgin/gtkimhtmltoolbar.c:1181 -#, fuzzy -msgid "_Underline" -msgstr "Understrek" +msgid "_Italic" +msgstr "_Kursiv" #: ../pidgin/gtkimhtmltoolbar.c:1182 -msgid "Strikethrough" -msgstr "" +msgid "_Underline" +msgstr "_Understrek" #: ../pidgin/gtkimhtmltoolbar.c:1183 -#, fuzzy +msgid "Strikethrough" +msgstr "Gjennomstrek" + +#: ../pidgin/gtkimhtmltoolbar.c:1184 msgid "_Larger" -msgstr "Gaim v%s" - -#: ../pidgin/gtkimhtmltoolbar.c:1185 -#, fuzzy +msgstr "_Større" + +#: ../pidgin/gtkimhtmltoolbar.c:1186 msgid "_Normal" -msgstr "Normal" - -#: ../pidgin/gtkimhtmltoolbar.c:1187 +msgstr "_Normal" + +#: ../pidgin/gtkimhtmltoolbar.c:1188 msgid "_Smaller" -msgstr "" +msgstr "_Mindre" #. If we want to show the formatting for the following items, we would #. * need to update them when formatting changes. The above items don't need #. * no updating nor nothin' -#: ../pidgin/gtkimhtmltoolbar.c:1191 -#, fuzzy +#: ../pidgin/gtkimhtmltoolbar.c:1192 msgid "_Font face" -msgstr "Skrifttype" - -#: ../pidgin/gtkimhtmltoolbar.c:1192 -#, fuzzy -msgid "Foreground _color" -msgstr "Forgrunnsfarge" +msgstr "_Skrifttype" #: ../pidgin/gtkimhtmltoolbar.c:1193 -#, fuzzy +msgid "Foreground _color" +msgstr "Forgrunns_farge" + +#: ../pidgin/gtkimhtmltoolbar.c:1194 msgid "Bac_kground color" -msgstr "Bakgrunnsfarge" - -#: ../pidgin/gtkimhtmltoolbar.c:1270 -#, fuzzy -msgid "_Smiley" -msgstr "Smil!" - -#: ../pidgin/gtkimhtmltoolbar.c:1276 -#, fuzzy +msgstr "Ba_kgrunnsfarge" + +#: ../pidgin/gtkimhtmltoolbar.c:1271 msgid "_Image" -msgstr "Lagre bilde" - -#: ../pidgin/gtkimhtmltoolbar.c:1282 -#, fuzzy +msgstr "_Bilde" + +#: ../pidgin/gtkimhtmltoolbar.c:1277 msgid "_Link" -msgstr "_Bli med i samtalegruppe" - -#: ../pidgin/gtkimhtmltoolbar.c:1288 +msgstr "_Lenke" + +#: ../pidgin/gtkimhtmltoolbar.c:1283 msgid "_Horizontal rule" -msgstr "" +msgstr "_Horizontal rule" + +#: ../pidgin/gtkimhtmltoolbar.c:1305 +msgid "_Smile!" +msgstr "_Smil!" #: ../pidgin/gtklog.c:293 #, c-format -msgid "" -"Are you sure you want to permanently delete the log of the conversation with " -"%s which started at %s?" -msgstr "" +msgid "Are you sure you want to permanently delete the log of the conversation with %s which started at %s?" +msgstr "Er du sikker på at du vil fjerne loggen permanent fra samtalen med %s som startet på %s?" #: ../pidgin/gtklog.c:304 #, c-format -msgid "" -"Are you sure you want to permanently delete the log of the conversation in %" -"s which started at %s?" -msgstr "" +msgid "Are you sure you want to permanently delete the log of the conversation in %s which started at %s?" +msgstr "Er du sikker på at du vil fjerne loggen permanent fra samtalen med %s som startet på %s?" #: ../pidgin/gtklog.c:309 #, fuzzy, c-format -msgid "" -"Are you sure you want to permanently delete the system log which started at %" -"s?" +msgid "Are you sure you want to permanently delete the system log which started at %s?" msgstr "Er du sikker på at du vil slette \"%s\"?" #: ../pidgin/gtklog.c:453 -#, fuzzy, c-format +#, c-format msgid "Conversation in %s on %s" -msgstr "" -"Du har e-post!\n" -"\n" -"%s" +msgstr "Samtale i %s på %s" #: ../pidgin/gtklog.c:456 -#, fuzzy, c-format +#, c-format msgid "Conversation with %s on %s" -msgstr "" -"Du har e-post!\n" -"\n" -"%s" +msgstr "Samtale med %s på %s" #: ../pidgin/gtklog.c:503 msgid "%B %Y" -msgstr "" +msgstr "%B %Y" #: ../pidgin/gtklog.c:550 -msgid "" -"System events will only be logged if the \"Log all status changes to system " -"log\" preference is enabled." -msgstr "" -"System hendelser vil bare bli logget om \"Logg alle status forandringer til " -"system logg\" har blitt slått på." +msgid "System events will only be logged if the \"Log all status changes to system log\" preference is enabled." +msgstr "System hendelser vil bare bli logget om \"Logg alle status forandringer til system logg\" har blitt slått på." #: ../pidgin/gtklog.c:554 -msgid "" -"Instant messages will only be logged if the \"Log all instant messages\" " -"preference is enabled." -msgstr "" -"Direktemeldinger vil bare bli logget om \"Logg alle direktemeldinger\" har " -"blitt slått på." +msgid "Instant messages will only be logged if the \"Log all instant messages\" preference is enabled." +msgstr "Direktemeldinger vil bare bli logget om \"Logg alle direktemeldinger\" har blitt slått på." #: ../pidgin/gtklog.c:557 #, fuzzy -msgid "" -"Chats will only be logged if the \"Log all chats\" preference is enabled." -msgstr "" -"Samtaler vil bare bli logget om \"Logg alle samtaler\" har blitt slått på." +msgid "Chats will only be logged if the \"Log all chats\" preference is enabled." +msgstr "Samtaler vil bare bli logget om \"Logg alle samtaler\" har blitt slått på." #: ../pidgin/gtklog.c:561 msgid "No logs were found" @@ -16254,19 +15615,19 @@ #. Steal the "HELP" response and use it to trigger browsing to the logs folder #: ../pidgin/gtklog.c:576 msgid "_Browse logs folder" -msgstr "" +msgstr "_Let gjennom loggmappe" #: ../pidgin/gtklog.c:640 -#, fuzzy msgid "Total log size:" -msgstr "Etter loggstørrelse" +msgstr "Etter loggstørrelse:" #: ../pidgin/gtklog.c:709 -#, fuzzy, c-format +#, c-format msgid "Conversations in %s" -msgstr "Samtaler med %s" - -#: ../pidgin/gtklog.c:717 ../pidgin/gtklog.c:779 +msgstr "Samtaler i %s" + +#: ../pidgin/gtklog.c:717 +#: ../pidgin/gtklog.c:779 #, c-format msgid "Conversations with %s" msgstr "Samtaler med %s" @@ -16276,9 +15637,9 @@ msgstr "Systemlogg" #: ../pidgin/gtkmain.c:386 -#, fuzzy, c-format +#, c-format msgid "%s %s. Try `%s -h' for more information.\n" -msgstr "Gaim %s. Prøv '%s -h' for mer informasjon.\n" +msgstr "%s %s. Prøv '%s -h' for mer informasjon.\n" #: ../pidgin/gtkmain.c:388 #, c-format @@ -16293,13 +15654,26 @@ " -n, --nologin don't automatically login\n" " -l, --login[=NAME] automatically login (optional argument NAME specifies\n" " account(s) to use, separated by commas)\n" +" --display=DISPLAY X display to use\n" " -v, --version display the current version and exit\n" msgstr "" - -#: ../pidgin/gtkmain.c:512 -#, c-format -msgid "" -"%s has segfaulted and attempted to dump a core file.\n" +"%s %s\n" +"Bruk: %s [VALG]...\n" +"\n" +" -c, --config=DIR Bruk DIR for konfigurasjons filer\n" +" -d, --debug skriv debugging beskjeder til stdout\n" +" -h, --help Vis denne hjelpen og avslutt\n" +" -m, --multiple do not ensure single instance\n" +" -n, --nologin Ikke logg inn automatisk\n" +" -l, --login[=NAVN] Logg inn automatisk (optional argument NAME specifies\n" +" account(s) to use, separated by commas)\n" +" --display=DISPLAY X display for bruk\n" +" -v, --version Vis den nårværende versjon og avslutt\n" + +#: ../pidgin/gtkmain.c:516 +#, c-format +msgid "" +"%s %s has segfaulted and attempted to dump a core file.\n" "This is a bug in the software and has happened through\n" "no fault of your own.\n" "\n" @@ -16317,88 +15691,97 @@ "on other protocols is at\n" "%swiki/DeveloperPages\n" msgstr "" +"%s %s har segfaultet og forsøkt å dumpe en kjerne fil.\n" +"Dette er en bug i programvaren og har skjedd\n" +"uten at det er din feil.\n" +"\n" +"Om du kan gjenskape krasjen, vennligst kontakt utviklerne\n" +"ved å rapportere en bug på:\n" +"%ssimpleticket/\n" +"\n" +"Vennligst forsikre deg om at du spesifiserer hva du gjorde\n" +"og post backtrace'en fra kjerne fila. Om du ikke vet\n" +"hvordan du lager en backtrace, vennligst les instuksjonene på\n" +"%swiki/GetABacktrace\n" +"\n" +"Om du trenger videre hjelp, vennligst IM enten SeanEgn eller \n" +"LSchiere (via AIM). Kontakt informasjon for Sean og Luke \n" +"på andre protokoller er på\n" +"%swiki/DeveloperPages\n" #. Translators may want to transliterate the name. #. It is not to be translated. -#: ../pidgin/gtkmain.c:699 ../pidgin/pidgin.h:51 -#, fuzzy +#: ../pidgin/gtkmain.c:706 +#: ../pidgin/pidgin.h:51 msgid "Pidgin" -msgstr "Paging" +msgstr "Pidgin" #: ../pidgin/gtknotify.c:349 -#, fuzzy msgid "Open All Messages" -msgstr "Send beskjed" +msgstr "Åpne alle beskjeder" #: ../pidgin/gtknotify.c:402 -#, fuzzy msgid "You have mail!" -msgstr "" -"Du har e-post!\n" -"\n" -"%s" - -#: ../pidgin/gtknotify.c:540 +msgstr "Du har fått e-post!" + +#: ../pidgin/gtknotify.c:537 #, c-format msgid "%s has %d new message." msgid_plural "%s has %d new messages." msgstr[0] "%s har %d ny beskjed." msgstr[1] "%s har %d nye beskjeder." -#: ../pidgin/gtknotify.c:564 -#, c-format -msgid "You have %d new e-mail." -msgid_plural "You have %d new e-mails." -msgstr[0] "" -msgstr[1] "" +#: ../pidgin/gtknotify.c:562 +#, c-format +msgid "%d new e-mail." +msgid_plural "%d new e-mails." +msgstr[0] "%d ny e-post." +msgstr[1] "%d nye e-poster." #: ../pidgin/gtknotify.c:989 #, fuzzy, c-format msgid "The browser command \"%s\" is invalid." msgstr "Nettleserkommandoen %s er ugyldig." -#: ../pidgin/gtknotify.c:991 ../pidgin/gtknotify.c:1003 -#: ../pidgin/gtknotify.c:1016 ../pidgin/gtknotify.c:1144 +#: ../pidgin/gtknotify.c:991 +#: ../pidgin/gtknotify.c:1003 +#: ../pidgin/gtknotify.c:1016 +#: ../pidgin/gtknotify.c:1144 msgid "Unable to open URL" msgstr "Kunne ikke åpne URL" -#: ../pidgin/gtknotify.c:1001 ../pidgin/gtknotify.c:1014 +#: ../pidgin/gtknotify.c:1001 +#: ../pidgin/gtknotify.c:1014 #, fuzzy, c-format msgid "Error launching \"%s\": %s" msgstr "Feil under starting av kommando: %s:%s" #: ../pidgin/gtknotify.c:1145 -msgid "" -"The 'Manual' browser command has been chosen, but no command has been set." -msgstr "" -"Klarte ikke å starte en nettleser fordi 'Manuell' nettleserkommando er " -"valgt, men ingen kommando for denne har blitt satt." +msgid "The 'Manual' browser command has been chosen, but no command has been set." +msgstr "Klarte ikke å starte en nettleser fordi 'Manuell' nettleserkommando er valgt, men ingen kommando for denne har blitt satt." #: ../pidgin/gtkplugin.c:265 msgid "The following plugins will be unloaded." -msgstr "" +msgstr "Følgende tillegg kunne ikke losses." #: ../pidgin/gtkplugin.c:284 msgid "Multiple plugins will be unloaded." -msgstr "" +msgstr "Flere tillegg vil ble losset." #: ../pidgin/gtkplugin.c:288 -#, fuzzy msgid "Unload Plugins" -msgstr "Tillegg" +msgstr "Losse Tillegg" #: ../pidgin/gtkplugin.c:400 -#, fuzzy, c-format +#, c-format msgid "" "%s%sWritten by:\t%s\n" "Website:\t\t%s\n" "Filename:\t\t%s" msgstr "" -"%s %s\n" -"\n" -"Skrevet av:\t%s\n" -"Webside:\t\t%s\n" -"Filnavn:\t%s" +"%s%sSkrevet av:\t%s\n" +"Hjemmeside:\t\t%s\n" +"Filnavn:\t\t%s" #: ../pidgin/gtkplugin.c:410 #, c-format @@ -16407,6 +15790,9 @@ "Error: %s\n" "Check the plugin website for an update." msgstr "" +"%s\n" +" Feil: %s\n" +"Sjekk tilleggets webside for en oppdatering." #: ../pidgin/gtkplugin.c:536 #, fuzzy @@ -16415,7 +15801,7 @@ #: ../pidgin/gtkplugin.c:599 msgid "Plugin Details" -msgstr "" +msgstr "Tillegget Detaljer" #: ../pidgin/gtkpounce.c:157 msgid "Select a file" @@ -16423,106 +15809,93 @@ #. Create the "Pounce on Whom" frame. #: ../pidgin/gtkpounce.c:532 -#, fuzzy msgid "Pounce on Whom" -msgstr "Varsling for" +msgstr "Varsling for hvem" #: ../pidgin/gtkpounce.c:559 msgid "_Buddy name:" -msgstr "Kontaktnavn:" +msgstr "_Kontaktnavn:" #: ../pidgin/gtkpounce.c:593 -#, fuzzy msgid "Si_gns on" -msgstr "Pålo_gging" +msgstr "Lo_gger på" #: ../pidgin/gtkpounce.c:595 -#, fuzzy msgid "Signs o_ff" -msgstr "Logg _av" +msgstr "Logger _av" #: ../pidgin/gtkpounce.c:597 -#, fuzzy msgid "Goes a_way" -msgstr "Kontakt forsvinner" +msgstr "Går _vekk" #: ../pidgin/gtkpounce.c:599 -#, fuzzy msgid "Ret_urns from away" -msgstr "_Returnere fra fravær" +msgstr "_Returnerer fra fravær" #: ../pidgin/gtkpounce.c:601 -#, fuzzy msgid "Becomes _idle" -msgstr "%s har blitt inaktiv" +msgstr "Blir _inaktiv" #: ../pidgin/gtkpounce.c:603 -#, fuzzy msgid "Is no longer i_dle" -msgstr "%s er ikke lenger inaktiv" +msgstr "Er ikke lenger i_naktiv" #: ../pidgin/gtkpounce.c:605 -#, fuzzy msgid "Starts _typing" -msgstr "Venn s_tarter å skrive" +msgstr "Starte_r å skrive" #: ../pidgin/gtkpounce.c:607 msgid "P_auses while typing" -msgstr "" +msgstr "P_auser under skriving" #: ../pidgin/gtkpounce.c:609 -#, fuzzy msgid "Stops t_yping" -msgstr "Venn slutter å skrive til deg" +msgstr "Stoppe_r å skrive" #: ../pidgin/gtkpounce.c:611 -#, fuzzy msgid "Sends a _message" -msgstr "Send _beskjed" +msgstr "Sender en _beskjed" #: ../pidgin/gtkpounce.c:654 -#, fuzzy msgid "Ope_n an IM window" -msgstr "Åpne vindu for direktem_elding" +msgstr "Åpn_e vindu for direktemelding" #: ../pidgin/gtkpounce.c:656 -#, fuzzy msgid "_Pop up a notification" -msgstr "Varslingsvindu spretter o_pp" +msgstr "_Varslingsvindu spretter opp" #: ../pidgin/gtkpounce.c:658 msgid "Send a _message" -msgstr "Send _beskjed" +msgstr "Send en _beskjed" #: ../pidgin/gtkpounce.c:660 msgid "E_xecute a command" -msgstr "Kjør en kommando" +msgstr "K_jør en kommando" #: ../pidgin/gtkpounce.c:662 msgid "P_lay a sound" -msgstr "Spill av en lyd" +msgstr "S_pill av en lyd" #: ../pidgin/gtkpounce.c:668 -#, fuzzy msgid "Brows_e..." -msgstr "_Bla gjennom..." +msgstr "Bla g_jennom..." #: ../pidgin/gtkpounce.c:670 -#, fuzzy msgid "Br_owse..." -msgstr "_Bla gjennom..." +msgstr "Bl_a gjennom..." #: ../pidgin/gtkpounce.c:671 msgid "Pre_view" -msgstr "Forhånds_visning" +msgstr "For_hånds visning" #: ../pidgin/gtkpounce.c:798 msgid "P_ounce only when my status is not Available" -msgstr "" +msgstr "P_ounce kun når min status er ikke Tilgjengelig" #: ../pidgin/gtkpounce.c:803 +#, fuzzy msgid "_Recurring" -msgstr "" +msgstr "Gjentar" #: ../pidgin/gtkpounce.c:1246 #, fuzzy @@ -16531,25 +15904,20 @@ #: ../pidgin/gtkprefs.c:386 #: ../pidgin/pixmaps/emotes/default/24/default.theme.in.h:1 -#, fuzzy msgid "Default" -msgstr "Gnome-standard" +msgstr "Forvalgt" #: ../pidgin/gtkprefs.c:517 msgid "Smiley theme failed to unpack." -msgstr "" +msgstr "Smiley tema feilet å pakke ut." #: ../pidgin/gtkprefs.c:644 msgid "Install Theme" -msgstr "" +msgstr "Installer tema" #: ../pidgin/gtkprefs.c:697 -msgid "" -"Select a smiley theme that you would like to use from the list below. New " -"themes can be installed by dragging and dropping them onto the theme list." -msgstr "" -"Velg smilefjes-temaet du vil bruke fra listen nedenfor. Nye temaer kan " -"installeres ved å dra og slippe dem over temalisten." +msgid "Select a smiley theme that you would like to use from the list below. New themes can be installed by dragging and dropping them onto the theme list." +msgstr "Velg smilefjes-temaet du vil bruke fra listen nedenfor. Nye temaer kan installeres ved å dra og slippe dem over temalisten." #: ../pidgin/gtkprefs.c:732 msgid "Icon" @@ -16560,33 +15928,30 @@ msgstr "System-trayikon" #: ../pidgin/gtkprefs.c:895 -#, fuzzy msgid "_Show system tray icon:" -msgstr "System-trayikon" +msgstr "_Vis system tray ikon:" #: ../pidgin/gtkprefs.c:899 -#, fuzzy msgid "On unread messages" -msgstr "Send _beskjed" +msgstr "Ved uleste beskjeder" #: ../pidgin/gtkprefs.c:904 -#, fuzzy msgid "Conversation Window Hiding" -msgstr "Samtalevinduer for direktemeldinger" +msgstr "Samtalevinduer Vindu Skjuling" #: ../pidgin/gtkprefs.c:905 -#, fuzzy msgid "_Hide new IM conversations:" -msgstr "Lukk samtalen" - -#: ../pidgin/gtkprefs.c:908 ../pidgin/gtkprefs.c:1944 +msgstr "_Gjem nye direktemeldingssamtaler:" + +#: ../pidgin/gtkprefs.c:908 +#: ../pidgin/gtkprefs.c:1946 msgid "When away" msgstr "Når fraværende" #. All the tab options! #: ../pidgin/gtkprefs.c:916 msgid "Tabs" -msgstr "" +msgstr "Faner" #: ../pidgin/gtkprefs.c:918 msgid "Show IMs and chats in _tabbed windows" @@ -16597,9 +15962,8 @@ msgstr "Vis _lukkeknapp på faner" #: ../pidgin/gtkprefs.c:935 -#, fuzzy msgid "_Placement:" -msgstr "ExtPlacement" +msgstr "_Plassering:" #: ../pidgin/gtkprefs.c:937 msgid "Top" @@ -16618,204 +15982,193 @@ msgstr "Høyre" #: ../pidgin/gtkprefs.c:942 +#, fuzzy msgid "Left Vertical" -msgstr "" +msgstr "Venstre vertikal" #: ../pidgin/gtkprefs.c:943 +#, fuzzy msgid "Right Vertical" -msgstr "" +msgstr "Høyre vertikal" #: ../pidgin/gtkprefs.c:950 -#, fuzzy msgid "N_ew conversations:" -msgstr "Lukk samtalen" +msgstr "N_ye samtaler:" #: ../pidgin/gtkprefs.c:995 -#, fuzzy msgid "Show _formatting on incoming messages" -msgstr "Vis formateringsverktøylinje" - -#: ../pidgin/gtkprefs.c:998 -#, fuzzy -msgid "Show _detailed information" -msgstr "Profilinformasjon" +msgstr "Vis _formateringsverktøy på innkommende beskjeder" + +#: ../pidgin/gtkprefs.c:997 +msgid "Close IMs immediately when the tab is closed" +msgstr "Lukk direktemeldinger straks når fanen er lukket" #: ../pidgin/gtkprefs.c:1000 +msgid "Show _detailed information" +msgstr "Vis _detaljert informasjon" + +#: ../pidgin/gtkprefs.c:1002 msgid "Enable buddy ic_on animation" msgstr "Slå på _animasjoner i kontaktikoner" -#: ../pidgin/gtkprefs.c:1007 +#: ../pidgin/gtkprefs.c:1009 msgid "_Notify buddies that you are typing to them" -msgstr "Varsle kontakter når skriver til dem" - -#: ../pidgin/gtkprefs.c:1010 -#, fuzzy +msgstr "_Varsle kontakter når skriver til dem" + +#: ../pidgin/gtkprefs.c:1012 msgid "Highlight _misspelled words" -msgstr "Marker stavefeil" - -#: ../pidgin/gtkprefs.c:1014 +msgstr "Marker _feilstavede ord" + +#: ../pidgin/gtkprefs.c:1016 msgid "Use smooth-scrolling" -msgstr "" - -#: ../pidgin/gtkprefs.c:1017 -#, fuzzy -msgid "F_lash window when IMs are received" -msgstr "_Blink vinduet når nye beskjeder mottas" +msgstr "Bruk behagelig scrolling" #: ../pidgin/gtkprefs.c:1019 -#, fuzzy +msgid "F_lash window when IMs are received" +msgstr "B_link vinduet når nye direktemeldinger mottas" + +#: ../pidgin/gtkprefs.c:1021 msgid "Minimi_ze new conversation windows" -msgstr "Samtalevinduer for direktemeldinger" - -#: ../pidgin/gtkprefs.c:1023 -#, fuzzy -msgid "Font" -msgstr "Skrifttype" +msgstr "Mini_mer nye samtalevinduer" #: ../pidgin/gtkprefs.c:1025 -msgid "Use document font from _theme" -msgstr "" +msgid "Font" +msgstr "Skrifttype" #: ../pidgin/gtkprefs.c:1027 -msgid "Use font from _theme" -msgstr "" +msgid "Use document font from _theme" +msgstr "Bruk dokument font fra _tema" #: ../pidgin/gtkprefs.c:1029 -#, fuzzy +msgid "Use font from _theme" +msgstr "Bruk font fra _tema" + +#: ../pidgin/gtkprefs.c:1031 msgid "Conversation _font:" -msgstr "Samtaler" - -#: ../pidgin/gtkprefs.c:1043 +msgstr "Samtle _font:" + +#: ../pidgin/gtkprefs.c:1045 msgid "Default Formatting" msgstr "Standardformatering" -#: ../pidgin/gtkprefs.c:1062 -#, fuzzy -msgid "" -"This is how your outgoing message text will appear when you use protocols " -"that support formatting." -msgstr "" -"Slik vil dine utgående meldinger se ut når du bruker protokoller som støtter " -"formatering :)" - -#: ../pidgin/gtkprefs.c:1128 -#, fuzzy +#: ../pidgin/gtkprefs.c:1064 +msgid "This is how your outgoing message text will appear when you use protocols that support formatting." +msgstr "Slik vil dine utgående meldinger se ut når du bruker protokoller som støtter formatering." + +#: ../pidgin/gtkprefs.c:1130 msgid "ST_UN server:" -msgstr "_Tjener:" - -#: ../pidgin/gtkprefs.c:1140 +msgstr "ST_UN-tjener:" + +#: ../pidgin/gtkprefs.c:1142 msgid "Example: stunserver.org" -msgstr "" - -#: ../pidgin/gtkprefs.c:1144 -#, fuzzy +msgstr "Eksempel: stunserver.org" + +#: ../pidgin/gtkprefs.c:1146 msgid "_Autodetect IP address" msgstr "Finn IP-adresse _automatisk" -#: ../pidgin/gtkprefs.c:1153 +#: ../pidgin/gtkprefs.c:1155 msgid "Public _IP:" -msgstr "Offentlig _IP (ved NAT):" - -#: ../pidgin/gtkprefs.c:1182 +msgstr "Offentlig _IP:" + +#: ../pidgin/gtkprefs.c:1184 msgid "Ports" msgstr "Porter" -#: ../pidgin/gtkprefs.c:1185 +#: ../pidgin/gtkprefs.c:1187 msgid "_Manually specify range of ports to listen on" msgstr "_Manuellt spesifiser et intervall av porter å lytte på" -#: ../pidgin/gtkprefs.c:1188 -#, fuzzy +#: ../pidgin/gtkprefs.c:1190 msgid "_Start port:" msgstr "_Startport:" -#: ../pidgin/gtkprefs.c:1195 -#, fuzzy +#: ../pidgin/gtkprefs.c:1197 msgid "_End port:" msgstr "_Sluttport:" -#: ../pidgin/gtkprefs.c:1203 +#: ../pidgin/gtkprefs.c:1205 msgid "Proxy Server" msgstr "Proxytjener" -#: ../pidgin/gtkprefs.c:1207 +#: ../pidgin/gtkprefs.c:1209 msgid "No proxy" msgstr "Ingen proxy" -#: ../pidgin/gtkprefs.c:1263 +#: ../pidgin/gtkprefs.c:1265 msgid "_User:" msgstr "_Bruker:" -#: ../pidgin/gtkprefs.c:1328 +#: ../pidgin/gtkprefs.c:1330 msgid "Seamonkey" -msgstr "" - -#: ../pidgin/gtkprefs.c:1329 +msgstr "Seamonkey" + +#: ../pidgin/gtkprefs.c:1331 msgid "Opera" msgstr "Opera" -#: ../pidgin/gtkprefs.c:1330 +#: ../pidgin/gtkprefs.c:1332 msgid "Netscape" msgstr "Netscape" -#: ../pidgin/gtkprefs.c:1331 +#: ../pidgin/gtkprefs.c:1333 msgid "Mozilla" msgstr "Mozilla" -#: ../pidgin/gtkprefs.c:1332 +#: ../pidgin/gtkprefs.c:1334 msgid "Konqueror" msgstr "Konqueror" -#: ../pidgin/gtkprefs.c:1333 +#: ../pidgin/gtkprefs.c:1335 #, fuzzy msgid "GNOME Default" msgstr "Gnome-standard" -#: ../pidgin/gtkprefs.c:1334 +#: ../pidgin/gtkprefs.c:1336 msgid "Galeon" msgstr "Galeon" -#: ../pidgin/gtkprefs.c:1335 +#: ../pidgin/gtkprefs.c:1337 msgid "Firefox" msgstr "Firefox" -#: ../pidgin/gtkprefs.c:1336 +#: ../pidgin/gtkprefs.c:1338 msgid "Firebird" msgstr "Firebird" -#: ../pidgin/gtkprefs.c:1337 +#: ../pidgin/gtkprefs.c:1339 msgid "Epiphany" msgstr "Epiphany" -#: ../pidgin/gtkprefs.c:1346 +#: ../pidgin/gtkprefs.c:1348 msgid "Manual" msgstr "Egendefinert" -#: ../pidgin/gtkprefs.c:1399 +#: ../pidgin/gtkprefs.c:1401 msgid "Browser Selection" msgstr "Valg av nettleser" -#: ../pidgin/gtkprefs.c:1403 +#: ../pidgin/gtkprefs.c:1405 msgid "_Browser:" msgstr "_Nettleser:" -#: ../pidgin/gtkprefs.c:1411 +#: ../pidgin/gtkprefs.c:1413 msgid "_Open link in:" msgstr "_Åpne lenke i:" -#: ../pidgin/gtkprefs.c:1413 +#: ../pidgin/gtkprefs.c:1415 msgid "Browser default" msgstr "Standard for nettleser" -#: ../pidgin/gtkprefs.c:1414 +#: ../pidgin/gtkprefs.c:1416 msgid "Existing window" msgstr "Eksisterende vindu" -#: ../pidgin/gtkprefs.c:1416 +#: ../pidgin/gtkprefs.c:1418 msgid "New tab" -msgstr "Ny tab" - -#: ../pidgin/gtkprefs.c:1430 +msgstr "Ny fane" + +#: ../pidgin/gtkprefs.c:1432 #, c-format msgid "" "_Manual:\n" @@ -16824,72 +16177,64 @@ "_Egendefinert:\n" "(%s for URL)" -#: ../pidgin/gtkprefs.c:1470 -#, fuzzy +#: ../pidgin/gtkprefs.c:1472 msgid "Log _format:" msgstr "Logg_format:" -#: ../pidgin/gtkprefs.c:1475 -#, fuzzy -msgid "Log all _instant messages" -msgstr "Logg alle direktemeldinger" - #: ../pidgin/gtkprefs.c:1477 -msgid "Log all c_hats" -msgstr "Logg alle samtaler" +msgid "Log all _instant messages" +msgstr "Logg alle d_irektemeldinger" #: ../pidgin/gtkprefs.c:1479 +msgid "Log all c_hats" +msgstr "Logg alle s_amtaler" + +#: ../pidgin/gtkprefs.c:1481 msgid "Log all _status changes to system log" -msgstr "Logg alle status endinger til systemlogg" - -#: ../pidgin/gtkprefs.c:1625 +msgstr "Logg alle _status endinger til systemlogg" + +#: ../pidgin/gtkprefs.c:1627 msgid "Sound Selection" msgstr "Lydvalg" -#: ../pidgin/gtkprefs.c:1635 -#, fuzzy, c-format -msgid "Quietest" -msgstr "Avslutt" - #: ../pidgin/gtkprefs.c:1637 -#, fuzzy, c-format -msgid "Quieter" -msgstr "Avslutt" +msgid "Quietest" +msgstr "Stillest" #: ../pidgin/gtkprefs.c:1639 -#, fuzzy, c-format +msgid "Quieter" +msgstr "Stillere" + +#: ../pidgin/gtkprefs.c:1641 msgid "Quiet" -msgstr "Avslutt" - -#: ../pidgin/gtkprefs.c:1643 -#, fuzzy, c-format -msgid "Loud" -msgstr "Last" +msgstr "Stille" #: ../pidgin/gtkprefs.c:1645 -#, fuzzy, c-format -msgid "Louder" -msgstr "time" +msgid "Loud" +msgstr "Høy" #: ../pidgin/gtkprefs.c:1647 -#, fuzzy, c-format +msgid "Louder" +msgstr "Høyere" + +#: ../pidgin/gtkprefs.c:1649 msgid "Loudest" -msgstr "Lyder" - -#: ../pidgin/gtkprefs.c:1713 +msgstr "Høyest" + +#: ../pidgin/gtkprefs.c:1715 msgid "_Method:" msgstr "_Metode:" -#: ../pidgin/gtkprefs.c:1715 +#: ../pidgin/gtkprefs.c:1717 msgid "Console beep" msgstr "Konsollpip" -#: ../pidgin/gtkprefs.c:1722 +#: ../pidgin/gtkprefs.c:1724 #, fuzzy msgid "No sounds" msgstr "Lyder" -#: ../pidgin/gtkprefs.c:1730 +#: ../pidgin/gtkprefs.c:1732 #, c-format msgid "" "Sound c_ommand:\n" @@ -16898,91 +16243,84 @@ "_Program for lydavspilling\n" "(%s for filnavn)" -# -#: ../pidgin/gtkprefs.c:1757 +#: ../pidgin/gtkprefs.c:1759 msgid "Sounds when conversation has _focus" msgstr "Lyder når samtalevinduet har _fokus" -#: ../pidgin/gtkprefs.c:1759 -#, fuzzy +#: ../pidgin/gtkprefs.c:1761 msgid "Enable sounds:" -msgstr "Feilet." - -#: ../pidgin/gtkprefs.c:1770 +msgstr "Aktiver lyder:" + +#: ../pidgin/gtkprefs.c:1772 msgid "Volume:" -msgstr "" - -#: ../pidgin/gtkprefs.c:1850 +msgstr "Volum:" + +#: ../pidgin/gtkprefs.c:1852 msgid "Play" msgstr "Spill av" -#: ../pidgin/gtkprefs.c:1927 -#, fuzzy +#: ../pidgin/gtkprefs.c:1929 msgid "_Report idle time:" -msgstr "Vis inaktiv tid" - -#: ../pidgin/gtkprefs.c:1932 +msgstr "_Vis inaktiv tid:" + +#: ../pidgin/gtkprefs.c:1934 msgid "Based on keyboard or mouse use" -msgstr "" - -#: ../pidgin/gtkprefs.c:1941 +msgstr "Basert på tastatur eller mus bruk" + +#: ../pidgin/gtkprefs.c:1943 msgid "_Auto-reply:" -msgstr "_Automatisk svar" - -#: ../pidgin/gtkprefs.c:1945 -#, fuzzy +msgstr "_Automatisk svar:" + +#: ../pidgin/gtkprefs.c:1947 msgid "When both away and idle" -msgstr "Når fraværende og inaktiv" +msgstr "Når både fraværende og inaktiv" #. Auto-away stuff -#: ../pidgin/gtkprefs.c:1951 +#: ../pidgin/gtkprefs.c:1953 msgid "Auto-away" msgstr "Automatisk fraværsmarkering" -#: ../pidgin/gtkprefs.c:1953 -#, fuzzy +#: ../pidgin/gtkprefs.c:1955 msgid "Change status when _idle" -msgstr "Sett som borte når inaktiv" - -#: ../pidgin/gtkprefs.c:1957 +msgstr "Endre status hvis _inaktiv" + +#: ../pidgin/gtkprefs.c:1959 #, fuzzy msgid "_Minutes before becoming idle:" msgstr "Antall minutter før fraværsmarkert:" -#: ../pidgin/gtkprefs.c:1965 -#, fuzzy +#: ../pidgin/gtkprefs.c:1967 msgid "Change _status to:" -msgstr "Endre adresse til:" +msgstr "Endre _status til:" #. Signon status stuff -#: ../pidgin/gtkprefs.c:1986 +#: ../pidgin/gtkprefs.c:1988 msgid "Status at Startup" -msgstr "" - -#: ../pidgin/gtkprefs.c:1988 +msgstr "Status ved oppstart" + +#: ../pidgin/gtkprefs.c:1990 msgid "Use status from last _exit at startup" -msgstr "" - -#: ../pidgin/gtkprefs.c:1994 +msgstr "Bruk status fra siste _avslutt ved oppstart" + +#: ../pidgin/gtkprefs.c:1996 msgid "Status to a_pply at startup:" -msgstr "" - -#: ../pidgin/gtkprefs.c:2032 +msgstr "L_egg til status ved oppstart:" + +#: ../pidgin/gtkprefs.c:2034 msgid "Interface" msgstr "Grensesnitt" -#: ../pidgin/gtkprefs.c:2034 +#: ../pidgin/gtkprefs.c:2036 msgid "Smiley Themes" msgstr "Smilefjes-tema" -#: ../pidgin/gtkprefs.c:2041 +#: ../pidgin/gtkprefs.c:2043 msgid "Browser" msgstr "Nettleser" -#: ../pidgin/gtkprefs.c:2045 -#, fuzzy +#: ../pidgin/gtkprefs.c:2047 msgid "Status / Idle" -msgstr "Borte / inaktiv" +msgstr "Status / inaktiv" #: ../pidgin/gtkprivacy.c:80 msgid "Allow all users to contact me" @@ -17017,7 +16355,8 @@ msgid "Set privacy for:" msgstr "Sett sikkerhet for:" -#: ../pidgin/gtkprivacy.c:557 ../pidgin/gtkprivacy.c:574 +#: ../pidgin/gtkprivacy.c:557 +#: ../pidgin/gtkprivacy.c:574 msgid "Permit User" msgstr "Tillat bruker" @@ -17027,13 +16366,12 @@ #: ../pidgin/gtkprivacy.c:559 msgid "Please enter the name of the user you wish to be able to contact you." -msgstr "" -"Vennligst skriv inn navnet på brukeren som du vil skal kunne kontakte deg." - -#: ../pidgin/gtkprivacy.c:562 ../pidgin/gtkprivacy.c:578 -#, fuzzy +msgstr "Vennligst skriv inn navnet på brukeren som du vil skal kunne kontakte deg." + +#: ../pidgin/gtkprivacy.c:562 +#: ../pidgin/gtkprivacy.c:578 msgid "_Permit" -msgstr "Tillat" +msgstr "_Tillat" #: ../pidgin/gtkprivacy.c:568 #, c-format @@ -17045,7 +16383,8 @@ msgid "Are you sure you wish to allow %s to contact you?" msgstr "Er du sikker på at du vil at %s skal kunne kontakte deg?" -#: ../pidgin/gtkprivacy.c:599 ../pidgin/gtkprivacy.c:613 +#: ../pidgin/gtkprivacy.c:599 +#: ../pidgin/gtkprivacy.c:613 msgid "Block User" msgstr "Blokker bruker" @@ -17073,7 +16412,7 @@ #: ../pidgin/gtkrequest.c:1507 msgid "That file already exists" -msgstr "Filen eksisterer allerede." +msgstr "Filen eksisterer allerede" #: ../pidgin/gtkrequest.c:1508 msgid "Would you like to overwrite it?" @@ -17081,16 +16420,16 @@ #: ../pidgin/gtkrequest.c:1511 msgid "Overwrite" -msgstr "" +msgstr "Overskriv" #: ../pidgin/gtkrequest.c:1512 msgid "Choose New Name" -msgstr "" - -#: ../pidgin/gtkrequest.c:1650 ../pidgin/gtkrequest.c:1664 -#, fuzzy +msgstr "Velg Nytt Navn" + +#: ../pidgin/gtkrequest.c:1650 +#: ../pidgin/gtkrequest.c:1664 msgid "Select Folder..." -msgstr "Velg tekstfarge" +msgstr "Velg mappe..." #. Create the window. #: ../pidgin/gtkroomlist.c:375 @@ -17104,9 +16443,8 @@ #. add button #: ../pidgin/gtkroomlist.c:451 -#, fuzzy msgid "_Add Chat" -msgstr "Legg til samtale" +msgstr "_Legg til samtale" #: ../pidgin/gtksavedstatuses.c:337 #, fuzzy @@ -17114,29 +16452,27 @@ msgstr "Er du sikker på at du vil slette %s?" #. Use button -#: ../pidgin/gtksavedstatuses.c:620 ../pidgin/gtksavedstatuses.c:1266 -#, fuzzy +#: ../pidgin/gtksavedstatuses.c:620 +#: ../pidgin/gtksavedstatuses.c:1266 msgid "_Use" -msgstr "Bruk" +msgstr "_Bruk" #: ../pidgin/gtksavedstatuses.c:780 msgid "Title already in use. You must choose a unique title." msgstr "Tittel allerede i bruk. Du må velge en unik tittel." #: ../pidgin/gtksavedstatuses.c:970 -#, fuzzy msgid "Different" -msgstr "Avdeling" +msgstr "Forskjellig" #: ../pidgin/gtksavedstatuses.c:1159 -#, fuzzy msgid "_Title:" -msgstr "Tittel" - -#: ../pidgin/gtksavedstatuses.c:1178 ../pidgin/gtksavedstatuses.c:1497 -#, fuzzy +msgstr "_Tittel:" + +#: ../pidgin/gtksavedstatuses.c:1178 +#: ../pidgin/gtksavedstatuses.c:1497 msgid "_Status:" -msgstr "Status:" +msgstr "_Status:" #. Different status message expander #: ../pidgin/gtksavedstatuses.c:1210 @@ -17149,9 +16485,9 @@ msgstr "Lagre & bruk" #: ../pidgin/gtksavedstatuses.c:1480 -#, fuzzy, c-format +#, c-format msgid "Status for %s" -msgstr "Status: %s" +msgstr "Status for %s" #: ../pidgin/gtkstatusbox.c:664 #, fuzzy @@ -17160,80 +16496,68 @@ #: ../pidgin/gtkutils.c:632 msgid "Google Talk" -msgstr "" - -#: ../pidgin/gtkutils.c:1399 ../pidgin/gtkutils.c:1422 -#, fuzzy, c-format +msgstr "Google Talk" + +#: ../pidgin/gtkutils.c:1399 +#: ../pidgin/gtkutils.c:1422 +#, c-format msgid "The following error has occurred loading %s: %s" -msgstr "En ukjent påloggingsfeil har inntruffet: %s." - -#: ../pidgin/gtkutils.c:1402 ../pidgin/gtkutils.c:1424 +msgstr "Følgende feil har oppstått ved lasting av %s: %s" + +#: ../pidgin/gtkutils.c:1402 +#: ../pidgin/gtkutils.c:1424 #, fuzzy msgid "Failed to load image" msgstr "Klarte ikke å lagre bilde: %s\n" #: ../pidgin/gtkutils.c:1498 -#, fuzzy, c-format +#, c-format msgid "Cannot send folder %s." -msgstr "Kan ikke sende fil" +msgstr "Kan ikke sende mappe %s." #: ../pidgin/gtkutils.c:1499 -#, fuzzy, c-format -msgid "" -"%s cannot transfer a folder. You will need to send the files within " -"individually." -msgstr "Gaim kan ikke overføre en mappe. Du må sende filene inni hver for seg" - -#: ../pidgin/gtkutils.c:1531 ../pidgin/gtkutils.c:1543 +#, c-format +msgid "%s cannot transfer a folder. You will need to send the files within individually." +msgstr "%s kan ikke overføre en mappe. Du må sende filene inni hver for seg." + +#: ../pidgin/gtkutils.c:1531 +#: ../pidgin/gtkutils.c:1543 #: ../pidgin/gtkutils.c:1550 #, fuzzy msgid "You have dragged an image" msgstr "Du har tastet inn et ugyldig brukernavn" #: ../pidgin/gtkutils.c:1532 -msgid "" -"You can send this image as a file transfer, embed it into this message, or " -"use it as the buddy icon for this user." -msgstr "" -"Du kan sende dette bildet som filoverføring, sett det inn i denne bekjeden " -"eller bruk det som kompis ikon for denne brukeren." - -#: ../pidgin/gtkutils.c:1538 ../pidgin/gtkutils.c:1558 -#, fuzzy +msgid "You can send this image as a file transfer, embed it into this message, or use it as the buddy icon for this user." +msgstr "Du kan sende dette bildet som filoverføring, sett det inn i denne bekjeden eller bruk det som kontaktikon for denne brukeren." + +#: ../pidgin/gtkutils.c:1538 +#: ../pidgin/gtkutils.c:1558 msgid "Set as buddy icon" -msgstr "Vis kontaktikoner" - -#: ../pidgin/gtkutils.c:1539 ../pidgin/gtkutils.c:1559 -#, fuzzy +msgstr "Sett som kontaktikon" + +#: ../pidgin/gtkutils.c:1539 +#: ../pidgin/gtkutils.c:1559 msgid "Send image file" -msgstr "Send beskjed" - -#: ../pidgin/gtkutils.c:1540 ../pidgin/gtkutils.c:1559 +msgstr "Send bildefil" + +#: ../pidgin/gtkutils.c:1540 +#: ../pidgin/gtkutils.c:1559 #, fuzzy msgid "Insert in message" msgstr "Sett inn bilde" #: ../pidgin/gtkutils.c:1544 -#, fuzzy msgid "Would you like to set it as the buddy icon for this user?" -msgstr "Ønsker du å bli med i samtalen?" +msgstr "Vil du sette dette som kontaktikon for denne brukeren?" #: ../pidgin/gtkutils.c:1551 -#, fuzzy -msgid "" -"You can send this image as a file transfer, or use it as the buddy icon for " -"this user." -msgstr "" -"Du kan sende dette bildet som filoverføring, sett det inn i denne bekjeden " -"eller bruk det som kompis ikon for denne brukeren." +msgid "You can send this image as a file transfer, or use it as the buddy icon for this user." +msgstr "Du kan sende dette bildet som filoverføring, sett det inn i denne bekjeden eller bruk det som kontaktikon for denne brukeren." #: ../pidgin/gtkutils.c:1552 -msgid "" -"You can insert this image into this message, or use it as the buddy icon for " -"this user" -msgstr "" -"Du kan sette inn dette bildet i beskjed eller bruke det som kompis ikon for " -"denne brukeren" +msgid "You can insert this image into this message, or use it as the buddy icon for this user" +msgstr "Du kan sette inn dette bildet i beskjed eller bruke det som kontaktikon for denne brukeren" #. I don't know if we really want to do anything here. Most of the desktop item types are crap like #. * "MIME Type" (I have no clue how that would be a desktop item) and "Comment"... nothing we can really @@ -17246,10 +16570,9 @@ msgstr "Kan ikke sende fil" #: ../pidgin/gtkutils.c:1610 -msgid "" -"You dragged a desktop launcher. Most likely you wanted to send whatever this " -"launcher points to instead of this launcher itself." -msgstr "" +#, fuzzy +msgid "You dragged a desktop launcher. Most likely you wanted to send whatever this launcher points to instead of this launcher itself." +msgstr "Du dro en skrivebords starter. Sannsynligvis ville du sende det som starteren peker til og ikke starteren selv." #: ../pidgin/gtkutils.c:2345 #, c-format @@ -17265,52 +16588,46 @@ #: ../pidgin/gtkutils.c:2641 #, c-format msgid "The file '%s' is too large for %s. Please try a smaller image.\n" -msgstr "" +msgstr "Filen '%s' er for stor for %s. Vennligst prøv et mindre bilde.\n" #: ../pidgin/gtkutils.c:2643 -#, fuzzy msgid "Icon Error" -msgstr "Ukjent feil" +msgstr "Ikon Feil" #: ../pidgin/gtkutils.c:2644 -#, fuzzy msgid "Could not set icon" -msgstr "Kunne ikke sende" +msgstr "Kunne ikke sette ikon" #: ../pidgin/gtkutils.c:2744 -#, fuzzy, c-format +#, c-format msgid "Failed to open file '%s': %s" -msgstr "Klarte ikke å lagre bilde: %s\n" +msgstr "Klarte ikke å åpne fil '%s': %s" #: ../pidgin/gtkutils.c:2793 #, c-format -msgid "" -"Failed to load image '%s': reason not known, probably a corrupt image file" -msgstr "" - -#: ../pidgin/gtkwhiteboard.c:754 ../pidgin/gtkwhiteboard.c:773 -#, fuzzy +msgid "Failed to load image '%s': reason not known, probably a corrupt image file" +msgstr "Feilet å laste bilde '%s': grunn ukjent, sannsynligvis en korrupt bilde fil" + +#: ../pidgin/gtkwhiteboard.c:754 +#: ../pidgin/gtkwhiteboard.c:773 msgid "Save File" -msgstr "Lagre fil..." +msgstr "Lagre fil" #: ../pidgin/gtkwhiteboard.c:861 -#, fuzzy msgid "Select color" -msgstr "Velg tekstfarge" +msgstr "Velg farge" #: ../pidgin/pidginstock.c:87 msgid "_Alias" msgstr "_Alias" #: ../pidgin/pidginstock.c:89 -#, fuzzy msgid "Close _tabs" -msgstr "L_ukk" +msgstr "Lukk _faner" #: ../pidgin/pidginstock.c:91 -#, fuzzy msgid "_Get Info" -msgstr "Hent informasjon" +msgstr "_Hent informasjon" #: ../pidgin/pidginstock.c:92 msgid "_Invite" @@ -17322,34 +16639,33 @@ #: ../pidgin/pidginstock.c:94 msgid "_Open Mail" -msgstr "Åpne _e-post" +msgstr "_Åpne e-post" #: ../pidgin/pixmaps/emotes/default/24/default.theme.in.h:2 msgid "Pidgin smileys" -msgstr "" +msgstr "Pidgin smileys" #: ../pidgin/pixmaps/emotes/none/none.theme.in.h:1 msgid "Penguin Pimps" -msgstr "" +msgstr "Penguin Pimps" #: ../pidgin/pixmaps/emotes/none/none.theme.in.h:2 msgid "Selecting this disables graphical emoticons." -msgstr "" +msgstr "Valg av dette fjerner bruk av grafiske animasjons ikoner." #: ../pidgin/pixmaps/emotes/none/none.theme.in.h:3 -#, fuzzy msgid "none" -msgstr "Alle" +msgstr "ingen" #: ../pidgin/plugins/cap/cap.c:450 #, fuzzy msgid "Display Statistics" msgstr "Vis advarsler om tidsavbrudd" -#: ../pidgin/plugins/cap/cap.c:462 ../pidgin/plugins/cap/cap.c:465 -#, fuzzy +#: ../pidgin/plugins/cap/cap.c:462 +#: ../pidgin/plugins/cap/cap.c:465 msgid "Response Probability:" -msgstr "Svaret gikk tapt" +msgstr "Svaret gikk tapt:" #: ../pidgin/plugins/cap/cap.c:811 #, fuzzy @@ -17359,23 +16675,24 @@ #. msg_difference spinner #: ../pidgin/plugins/cap/cap.c:814 msgid "Maximum response timeout:" -msgstr "" - -#: ../pidgin/plugins/cap/cap.c:817 ../pidgin/plugins/cap/cap.c:824 -#: ../pidgin/plugins/cap/cap.c:831 ../pidgin/plugins/timestamp.c:150 -#, fuzzy +msgstr "Maximum response timeout:" + +#: ../pidgin/plugins/cap/cap.c:817 +#: ../pidgin/plugins/cap/cap.c:824 +#: ../pidgin/plugins/cap/cap.c:831 +#: ../pidgin/plugins/timestamp.c:150 msgid "minutes" msgstr "minutter" #. last_seen spinner #: ../pidgin/plugins/cap/cap.c:821 msgid "Maximum last-seen difference:" -msgstr "" +msgstr "Maximum sist-sett differanse:" #. threshold spinner #: ../pidgin/plugins/cap/cap.c:828 msgid "Threshold:" -msgstr "" +msgstr "Terskel:" #. *< type #. *< ui_requirement @@ -17385,60 +16702,51 @@ #. *< id #: ../pidgin/plugins/cap/cap.c:936 msgid "Contact Availability Prediction" -msgstr "" +msgstr "Forutsigelse av Kontaktens Tilgjengelighet" #. *< name #. *< version #: ../pidgin/plugins/cap/cap.c:938 msgid "Contact Availability Prediction plugin." -msgstr "" +msgstr "Forutsigelse av Kontaktens Tilgjengelighet tillegg." #. * summary #: ../pidgin/plugins/cap/cap.c:939 -msgid "" -"The contact availability plugin (cap) is used to display statistical " -"information about buddies in a users contact list." -msgstr "" +msgid "The contact availability plugin (cap) is used to display statistical information about buddies in a users contact list." +msgstr "Forutsigelse av Kontaktens Tilgjengelighet tillegg (cap) er brukt for å vise statistisk informasjon om kontakter i en brukers kontaktliste." #: ../pidgin/plugins/contact_priority.c:61 -#, fuzzy msgid "Buddy is idle" -msgstr "Kontakt er inaktiv:" +msgstr "Kontakt er inaktiv" #: ../pidgin/plugins/contact_priority.c:62 -#, fuzzy msgid "Buddy is away" -msgstr "Kontakt er borte:" +msgstr "Kontakt er borte" #: ../pidgin/plugins/contact_priority.c:63 -#, fuzzy msgid "Buddy is \"extended\" away" -msgstr "Kontakt er borte:" +msgstr "Kontakt er \"forlenget\" borte" #. Not used yet. #: ../pidgin/plugins/contact_priority.c:66 -#, fuzzy msgid "Buddy is mobile" -msgstr "Kontakt er inaktiv:" +msgstr "Kontakt er mobil" #: ../pidgin/plugins/contact_priority.c:68 -#, fuzzy msgid "Buddy is offline" -msgstr "Kontakt er avlogget:" +msgstr "Kontakt er avlogget" #: ../pidgin/plugins/contact_priority.c:90 msgid "Point values to use when..." msgstr "Verdier for bruk når..." #: ../pidgin/plugins/contact_priority.c:118 -msgid "" -"The buddy with the largest score is the buddy who will have priority " -"in the contact.\n" -msgstr "" +msgid "The buddy with the largest score is the buddy who will have priority in the contact.\n" +msgstr "Kontakten med den største score er kontakten som vil ha prioritet i kontakten.\n" #: ../pidgin/plugins/contact_priority.c:125 msgid "Use last buddy when scores are equal" -msgstr "" +msgstr "Bruk den siste kontakten når resultatene er lik" #: ../pidgin/plugins/contact_priority.c:130 #, fuzzy @@ -17459,26 +16767,21 @@ #. *< version #. *< summary #: ../pidgin/plugins/contact_priority.c:190 -msgid "" -"Allows for controlling the values associated with different buddy states." -msgstr "" -"Lar deg kontrollere verdiene for de ulike tilstandene kontakter kan være i." +msgid "Allows for controlling the values associated with different buddy states." +msgstr "Lar deg kontrollere verdiene for de ulike tilstandene kontakter kan være i." #. *< description #: ../pidgin/plugins/contact_priority.c:192 -msgid "" -"Allows for changing the point values of idle/away/offline states for buddies " -"in contact priority computations." -msgstr "" -"Lar deg endre vektingen for inaktiv/borte/avlogget for kontakter i " -"kontaktprioritetsutregninger." +msgid "Allows for changing the point values of idle/away/offline states for buddies in contact priority computations." +msgstr "Lar deg endre vektingen for inaktiv/borte/avlogget for kontakter i kontaktprioritetsutregninger." #: ../pidgin/plugins/convcolors.c:23 #, fuzzy msgid "Conversation Colors" msgstr "/Samtale/L_ukk" -#: ../pidgin/plugins/convcolors.c:25 ../pidgin/plugins/convcolors.c:26 +#: ../pidgin/plugins/convcolors.c:25 +#: ../pidgin/plugins/convcolors.c:26 #, fuzzy msgid "Customize colors in the conversation window" msgstr "Samtalevinduer for direktemeldinger" @@ -17499,19 +16802,18 @@ msgstr "Send beskjed" #: ../pidgin/plugins/convcolors.c:85 -#, fuzzy msgid "Sent Messages" -msgstr "Send beskjed" +msgstr "Sendte beskjeder" #: ../pidgin/plugins/convcolors.c:86 -#, fuzzy msgid "Received Messages" -msgstr "Send beskjed" - -#: ../pidgin/plugins/convcolors.c:210 ../pidgin/plugins/pidginrc.c:251 -#, fuzzy, c-format +msgstr "Mottatte beskjeder" + +#: ../pidgin/plugins/convcolors.c:210 +#: ../pidgin/plugins/pidginrc.c:245 +#, c-format msgid "Select Color for %s" -msgstr "Velg tekstfarge" +msgstr "Velg farge for %s" #: ../pidgin/plugins/convcolors.c:310 #, fuzzy @@ -17519,13 +16821,12 @@ msgstr "Ignorer farger" #: ../pidgin/plugins/convcolors.c:311 -#, fuzzy msgid "Apply in Chats" -msgstr "Samtalealias" +msgstr "Legg til i Samtaler" #: ../pidgin/plugins/convcolors.c:312 msgid "Apply in IMs" -msgstr "" +msgstr "Legg til i Direktemeldinger" #: ../pidgin/plugins/extplacement.c:80 msgid "By conversation count" @@ -17537,10 +16838,8 @@ #. Translators: "New conversations" should match the text in the preferences dialog and "By conversation count" should be the same text used above #: ../pidgin/plugins/extplacement.c:105 -msgid "" -"Note: The preference for \"New conversations\" must be set to \"By " -"conversation count\"." -msgstr "" +msgid "Note: The preference for \"New conversations\" must be set to \"By conversation count\"." +msgstr "NB: Preferansene for \"Nye samtaler\" må være satt til \"By conversation count\"." #: ../pidgin/plugins/extplacement.c:111 msgid "Number of conversations per window" @@ -17548,9 +16847,7 @@ #: ../pidgin/plugins/extplacement.c:117 msgid "Separate IM and Chat windows when placing by number" -msgstr "" -"Separere direktemeldings- og chattevinduer når programet plasserer etter " -"nummer" +msgstr "Separere direktemeldings- og chattevinduer når programet plasserer etter nummer" #. *< type #. *< ui_requirement @@ -17566,17 +16863,13 @@ #. *< version #: ../pidgin/plugins/extplacement.c:148 msgid "Extra conversation placement options." -msgstr "Flere plasseringsmuligheter for samtaler" +msgstr "Flere plasseringsmuligheter for samtaler." #. *< summary #. * description #: ../pidgin/plugins/extplacement.c:150 -msgid "" -"Restrict the number of conversations per windows, optionally separating IMs " -"and Chats" -msgstr "" -"Begrens det maksimale antallet samtaler per vindu, og eventuelt separering " -"av direktemeldinger og chat" +msgid "Restrict the number of conversations per windows, optionally separating IMs and Chats" +msgstr "Begrens det maksimale antallet samtaler per vindu, og eventuelt separering av direktemeldinger og chat" #. Configuration frame #: ../pidgin/plugins/gestures/gestures.c:235 @@ -17638,9 +16931,7 @@ #. Add the label. #: ../pidgin/plugins/gevolution/add_buddy_dialog.c:457 msgid "Select a person from your address book below, or add a new person." -msgstr "" -"Velg en person fra adresseboken som er vist under, eller legg til en ny " -"person" +msgstr "Velg en person fra adresseboken som er vist under, eller legg til en ny person." #: ../pidgin/plugins/gevolution/add_buddy_dialog.c:551 #: ../pidgin/plugins/gevolution/new_person_dialog.c:301 @@ -17661,18 +16952,13 @@ #. Add the label. #: ../pidgin/plugins/gevolution/assoc-buddy.c:343 -msgid "" -"Select a person from your address book to add this buddy to, or create a new " -"person." -msgstr "" -"Velg en person fra adresseboka for å legge til denne kontakten, eller lag en " -"ny kontakt." +msgid "Select a person from your address book to add this buddy to, or create a new person." +msgstr "Velg en person fra adresseboka for å legge til denne kontakten, eller lag en ny kontakt." #. Add the expander #: ../pidgin/plugins/gevolution/assoc-buddy.c:431 -#, fuzzy msgid "User _details" -msgstr "Skjul brukerdetaljer" +msgstr "_Brukerdetaljer" #. "Associate Buddy" button #: ../pidgin/plugins/gevolution/assoc-buddy.c:484 @@ -17681,24 +16967,22 @@ #: ../pidgin/plugins/gevolution/gevolution.c:240 #: ../pidgin/plugins/gevolution/gevolution.c:246 -#, fuzzy msgid "Unable to send e-mail" -msgstr "Kunne ikke sende e-post" +msgstr "Klarte ikke å sende e-post" #: ../pidgin/plugins/gevolution/gevolution.c:241 msgid "The evolution executable was not found in the PATH." -msgstr "Den kjørbare filen til Evolution ble ikke funnet i banen" +msgstr "Den kjørbare filen til Evolution ble ikke funnet i banen." #: ../pidgin/plugins/gevolution/gevolution.c:247 msgid "An e-mail address was not found for this buddy." -msgstr "" +msgstr "En e-post adresse ble ikke funnet for denne kontakten." #: ../pidgin/plugins/gevolution/gevolution.c:273 msgid "Add to Address Book" msgstr "Legg til i adresseboka" #: ../pidgin/plugins/gevolution/gevolution.c:285 -#, fuzzy msgid "Send E-Mail" msgstr "Send E-post" @@ -17729,9 +17013,8 @@ #. * description #: ../pidgin/plugins/gevolution/gevolution.c:530 #: ../pidgin/plugins/gevolution/gevolution.c:532 -#, fuzzy msgid "Provides integration with Evolution." -msgstr "Tilbyr integrasjon med Ximian Evolution" +msgstr "Tilbyr integrasjon med Evolution." #: ../pidgin/plugins/gevolution/new_person_dialog.c:262 msgid "Please enter the person's information below." @@ -17739,9 +17022,7 @@ #: ../pidgin/plugins/gevolution/new_person_dialog.c:266 msgid "Please enter the buddy's screen name and account type below." -msgstr "" -"Venligst tast inn kontaktens brukernavn og hvilken protokoll kontakten " -"finnes på under." +msgstr "Venligst tast inn kontaktens brukernavn og hvilken protokoll kontakten finnes på under." #: ../pidgin/plugins/gevolution/new_person_dialog.c:286 msgid "Account type:" @@ -17750,7 +17031,7 @@ #. Optional Information section #: ../pidgin/plugins/gevolution/new_person_dialog.c:309 msgid "Optional information:" -msgstr "Tilleggsinformasjon" +msgstr "Tilleggsinformasjon:" #: ../pidgin/plugins/gevolution/new_person_dialog.c:344 msgid "First name:" @@ -17793,7 +17074,7 @@ "\n" "Inaktiv:" -#: ../pidgin/plugins/history.c:188 +#: ../pidgin/plugins/history.c:192 msgid "History" msgstr "Historikk" @@ -17811,7 +17092,8 @@ #. *< version #. * summary #. * description -#: ../pidgin/plugins/iconaway.c:85 ../pidgin/plugins/iconaway.c:87 +#: ../pidgin/plugins/iconaway.c:85 +#: ../pidgin/plugins/iconaway.c:87 msgid "Iconifies the buddy list and your conversations when you go away." msgstr "Minimer kontaktlisten og samtalene når du er markert som borte." @@ -17825,40 +17107,40 @@ #: ../pidgin/plugins/mailchk.c:163 msgid "Adds a small box to the buddy list that shows if you have new mail." -msgstr "" -"Legger til en liten boks i kontaktlista som viser om du har fått e-post." +msgstr "Legger til en liten boks i kontaktlista som viser om du har fått e-post." #: ../pidgin/plugins/markerline.c:23 #, fuzzy msgid "Markerline" msgstr "Understrek" -#: ../pidgin/plugins/markerline.c:25 ../pidgin/plugins/markerline.c:26 +#: ../pidgin/plugins/markerline.c:25 +#: ../pidgin/plugins/markerline.c:26 msgid "Draw a line to indicate new messages in a conversation." -msgstr "" +msgstr "Tegn en linje for å indikere nye beskjeder for denne samtalen." #: ../pidgin/plugins/markerline.c:246 msgid "Draw Markerline in " -msgstr "" - -#: ../pidgin/plugins/markerline.c:250 ../pidgin/plugins/notify.c:682 +msgstr "Tegn Understrek i " + +#: ../pidgin/plugins/markerline.c:250 +#: ../pidgin/plugins/notify.c:682 msgid "_IM windows" msgstr "Vinduer for direktemeldinger" # -#: ../pidgin/plugins/markerline.c:254 ../pidgin/plugins/notify.c:689 +#: ../pidgin/plugins/markerline.c:254 +#: ../pidgin/plugins/notify.c:689 msgid "C_hat windows" msgstr "_Samtalevinduer" #: ../pidgin/plugins/musicmessaging/musicmessaging.c:44 -msgid "" -"A music messaging session has been requested. Please click the MM icon to " -"accept." -msgstr "" +msgid "A music messaging session has been requested. Please click the MM icon to accept." +msgstr "En musikk samtale økt har blitt forespurt. Vennligst klikk på MM ikonet for å akseptere." #: ../pidgin/plugins/musicmessaging/musicmessaging.c:45 msgid "Music messaging session confirmed." -msgstr "" +msgstr "Musikk samtale økt bekreftet." #: ../pidgin/plugins/musicmessaging/musicmessaging.c:430 #, fuzzy @@ -17867,7 +17149,7 @@ #: ../pidgin/plugins/musicmessaging/musicmessaging.c:431 msgid "There was a conflict in running the command:" -msgstr "" +msgstr "Det oppsto en konflikt ved kjøring av kommando:" #: ../pidgin/plugins/musicmessaging/musicmessaging.c:539 #, fuzzy @@ -17875,9 +17157,8 @@ msgstr "Klarte ikke bli med i gruppesamtale %s" #: ../pidgin/plugins/musicmessaging/musicmessaging.c:540 -#, fuzzy msgid "The following error has occurred:" -msgstr "En ukjent påloggingsfeil har inntruffet: %s." +msgstr "Følgende feil har oppstått:" #. Configuration frame #: ../pidgin/plugins/musicmessaging/musicmessaging.c:639 @@ -17887,11 +17168,11 @@ #: ../pidgin/plugins/musicmessaging/musicmessaging.c:643 msgid "Score Editor Path" -msgstr "" +msgstr "Resultat Redigerings Bane" #: ../pidgin/plugins/musicmessaging/musicmessaging.c:644 msgid "_Apply" -msgstr "Bruk" +msgstr "_Bruk" #. *< type #. *< ui_requirement @@ -17903,14 +17184,12 @@ #. *< version #: ../pidgin/plugins/musicmessaging/musicmessaging.c:685 msgid "Music Messaging Plugin for collaborative composition." -msgstr "" +msgstr "Musikk Samtale Tillegg for samarbeids komposisjon." #. * summary #: ../pidgin/plugins/musicmessaging/musicmessaging.c:687 -msgid "" -"The Music Messaging Plugin allows a number of users to simultaneously work " -"on a piece of music by editting a common score in real-time." -msgstr "" +msgid "The Music Messaging Plugin allows a number of users to simultaneously work on a piece of music by editting a common score in real-time." +msgstr "Musikk Samtale Tillegg tillater flere brukere å arbeide på et stykke musikk samtidig ved å redigere et felles resultat i samtid." #. ---------- "Notify For" ---------- #: ../pidgin/plugins/notify.c:678 @@ -17919,7 +17198,7 @@ #: ../pidgin/plugins/notify.c:697 msgid "\t_Only when someone says your screen name" -msgstr "" +msgstr "\t_Kun når noen sier skjermnavnet ditt" # #: ../pidgin/plugins/notify.c:707 @@ -18004,7 +17283,8 @@ #. *< version #. * summary #. * description -#: ../pidgin/plugins/notify.c:910 ../pidgin/plugins/notify.c:912 +#: ../pidgin/plugins/notify.c:910 +#: ../pidgin/plugins/notify.c:912 msgid "Provides a variety of ways of notifying you of unread messages." msgstr "Lar deg bli varslet om uleste meldinger på flere vis." @@ -18015,9 +17295,8 @@ #. *< priority #. *< id #: ../pidgin/plugins/pidgininc.c:91 -#, fuzzy msgid "Pidgin Demonstration Plugin" -msgstr "Gaim eksempeltillegg" +msgstr "Pidgin Demonstrasjons Tillegg" #. *< name #. *< version @@ -18054,54 +17333,41 @@ #: ../pidgin/plugins/pidginrc.c:54 msgid "GtkTreeView Horizontal Separation" -msgstr "" - -#: ../pidgin/plugins/pidginrc.c:73 +msgstr "GtkTreeView Horizontal Separation" + +#: ../pidgin/plugins/pidginrc.c:69 #, fuzzy msgid "Conversation Entry" msgstr "Samtaler" -#: ../pidgin/plugins/pidginrc.c:74 -#, fuzzy -msgid "Conversation History" -msgstr "Samtaler Historie" - -#: ../pidgin/plugins/pidginrc.c:75 -#, fuzzy -msgid "Log Viewer" -msgstr "Log Viser" - -#: ../pidgin/plugins/pidginrc.c:76 +#: ../pidgin/plugins/pidginrc.c:70 #, fuzzy msgid "Request Dialog" msgstr "Anmodnings Dialog" -#: ../pidgin/plugins/pidginrc.c:77 +#: ../pidgin/plugins/pidginrc.c:71 #, fuzzy msgid "Notify Dialog" msgstr "Bruk varsling for" -#: ../pidgin/plugins/pidginrc.c:253 -#, fuzzy +#: ../pidgin/plugins/pidginrc.c:247 msgid "Select Color" -msgstr "Velg tekstfarge" - -#: ../pidgin/plugins/pidginrc.c:300 -#, fuzzy, c-format +msgstr "Velg Farge" + +#: ../pidgin/plugins/pidginrc.c:294 msgid "Select Interface Font" -msgstr "Velg skrifttype" - -#: ../pidgin/plugins/pidginrc.c:303 -#, fuzzy, c-format +msgstr "Velg Grensesnitt Font" + +#: ../pidgin/plugins/pidginrc.c:297 +#, c-format msgid "Select Font for %s" -msgstr "Velg skrifttype" - -#: ../pidgin/plugins/pidginrc.c:371 -#, fuzzy +msgstr "Velg Font for %s" + +#: ../pidgin/plugins/pidginrc.c:365 msgid "GTK+ Interface Font" -msgstr "Valg for grensesnitt" - -#: ../pidgin/plugins/pidginrc.c:391 +msgstr "GTK+ Grensesnitt Font" + +#: ../pidgin/plugins/pidginrc.c:385 msgid "GTK+ Text Shortcut Theme" msgstr "GTK+ Tekst Tema Snarvei" @@ -18125,42 +17391,39 @@ #. widget_bool_widgets[i]); #. } #. -#: ../pidgin/plugins/pidginrc.c:428 -#, fuzzy +#: ../pidgin/plugins/pidginrc.c:422 msgid "Interface colors" -msgstr "Ignorer farger" - -#: ../pidgin/plugins/pidginrc.c:452 +msgstr "Grensesnitt farger" + +#: ../pidgin/plugins/pidginrc.c:446 msgid "Widget Sizes" -msgstr "" - -#: ../pidgin/plugins/pidginrc.c:473 -#, fuzzy +msgstr "Widget Sizes" + +#: ../pidgin/plugins/pidginrc.c:467 msgid "Fonts" -msgstr "Kontoer" - -#: ../pidgin/plugins/pidginrc.c:497 -#, fuzzy +msgstr "Fonter" + +#: ../pidgin/plugins/pidginrc.c:491 msgid "Gtkrc File Tools" -msgstr "Styre Gaim fra kontrollfil" - -#: ../pidgin/plugins/pidginrc.c:502 +msgstr "Gtkrc Fil Verktøy" + +#: ../pidgin/plugins/pidginrc.c:496 #, c-format msgid "Write settings to %s%sgtkrc-2.0" -msgstr "" - -#: ../pidgin/plugins/pidginrc.c:511 +msgstr "Skriv instillinger til %s%sgtkrc-2.0" + +#: ../pidgin/plugins/pidginrc.c:505 msgid "Re-read gtkrc files" -msgstr "" - -#: ../pidgin/plugins/pidginrc.c:544 -#, fuzzy +msgstr "Les gtkrc filer på nytt" + +#: ../pidgin/plugins/pidginrc.c:538 msgid "Pidgin GTK+ Theme Control" -msgstr "Gaim GTK+ Tema Kontroll" - -#: ../pidgin/plugins/pidginrc.c:546 ../pidgin/plugins/pidginrc.c:547 +msgstr "Pidgin GTK+ Tema Kontroll" + +#: ../pidgin/plugins/pidginrc.c:540 +#: ../pidgin/plugins/pidginrc.c:541 msgid "Provides access to commonly used gtkrc settings." -msgstr "Gir tilgang til vanlig brukte gtkrc innstillinger" +msgstr "Gir tilgang til vanlig brukte gtkrc innstillinger." #: ../pidgin/plugins/raw.c:175 msgid "Raw" @@ -18172,30 +17435,23 @@ #: ../pidgin/plugins/raw.c:178 #, fuzzy -msgid "" -"Lets you send raw input to text-based protocols (XMPP, MSN, IRC, TOC). Hit " -"'Enter' in the entry box to send. Watch the debug window." -msgstr "" -"Lar deg sende direktekommandoer til tekstbaserte protokoller (Jabber, MSN, " -"IRC, TOC). Trykk 'Enter' for å sende, og sjekk avlusningsvinduet." +msgid "Lets you send raw input to text-based protocols (XMPP, MSN, IRC, TOC). Hit 'Enter' in the entry box to send. Watch the debug window." +msgstr "Lar deg sende direktekommandoer til tekstbaserte protokoller (Jabber, MSN, IRC, TOC). Trykk 'Enter' for å sende, og sjekk avlusningsvinduet." #: ../pidgin/plugins/relnot.c:71 -#, fuzzy, c-format -msgid "" -"You are using %s version %s. The current version is %s. You can get it " -"from %s
" -msgstr "Du bruker Gaim versjon %s. Den nåværende versjonen er %s.
" +#, c-format +msgid "You are using %s version %s. The current version is %s. You can get it from %s
" +msgstr "Du bruker %s versjon %s. Den nåværende versjonen er %s. Du kan hente den fra %s
" #: ../pidgin/plugins/relnot.c:79 -#, fuzzy, c-format +#, c-format msgid "ChangeLog:
%s" -msgstr "" -" Endringslogg: \n" -"%s

" - -#: ../pidgin/plugins/relnot.c:84 ../pidgin/plugins/relnot.c:85 +msgstr "Endringslogg:
%s" + +#: ../pidgin/plugins/relnot.c:84 +#: ../pidgin/plugins/relnot.c:85 msgid "New Version Available" -msgstr "Ny versjon tilgjengelig" +msgstr "Ny Versjon Tilgjengelig" #. *< type #. *< ui_requirement @@ -18212,15 +17468,12 @@ #. * summary #: ../pidgin/plugins/relnot.c:146 msgid "Checks periodically for new releases." -msgstr "Sjekker periodisk for nye utgaver" +msgstr "Sjekker periodisk for nye utgaver." #. * description #: ../pidgin/plugins/relnot.c:148 -msgid "" -"Checks periodically for new releases and notifies the user with the " -"ChangeLog." -msgstr "" -"Sjekker periodisk for nye versjoner, og gir endringslista til brukeren." +msgid "Checks periodically for new releases and notifies the user with the ChangeLog." +msgstr "Sjekker periodisk for nye versjoner, og gir endringslista til brukeren." #: ../pidgin/plugins/spellchk.c:1962 msgid "Duplicate Correction" @@ -18228,7 +17481,7 @@ #: ../pidgin/plugins/spellchk.c:1963 msgid "The specified word already exists in the correction list." -msgstr "Ordet finnes allerede i korrigerings listen" +msgstr "Ordet finnes allerede i korrigerings listen." #: ../pidgin/plugins/spellchk.c:2177 msgid "Text Replacements" @@ -18236,11 +17489,11 @@ #: ../pidgin/plugins/spellchk.c:2200 msgid "You type" -msgstr "Når du skriver" +msgstr "Du skriver" #: ../pidgin/plugins/spellchk.c:2214 msgid "You send" -msgstr "Erstatt det til" +msgstr "Du sender" #: ../pidgin/plugins/spellchk.c:2228 msgid "Whole words only" @@ -18248,7 +17501,7 @@ #: ../pidgin/plugins/spellchk.c:2240 msgid "Case sensitive" -msgstr "" +msgstr "Case sensitive" #: ../pidgin/plugins/spellchk.c:2266 msgid "Add a new text replacement" @@ -18256,20 +17509,20 @@ #: ../pidgin/plugins/spellchk.c:2282 msgid "You _type:" -msgstr "Når du skriver:" +msgstr "Du _skriver:" #: ../pidgin/plugins/spellchk.c:2299 msgid "You _send:" -msgstr "Erstatt det til: " +msgstr "Du _sender:" #. Created here so it can be passed to whole_words_button_toggled. #: ../pidgin/plugins/spellchk.c:2311 msgid "_Exact case match (uncheck for automatic case handling)" -msgstr "" +msgstr "_Eksakt case match (huk av for automatisk case handling)" #: ../pidgin/plugins/spellchk.c:2313 msgid "Only replace _whole words" -msgstr "Erstatt kun hele ord" +msgstr "Erstatt kun _hele ord" #: ../pidgin/plugins/spellchk.c:2338 #, fuzzy @@ -18278,13 +17531,14 @@ #: ../pidgin/plugins/spellchk.c:2339 msgid "Enable replacement of last word on send" -msgstr "" +msgstr "Slå på utskiftning av siste ord på send" #: ../pidgin/plugins/spellchk.c:2370 msgid "Text replacement" msgstr "Teksterstatter" -#: ../pidgin/plugins/spellchk.c:2372 ../pidgin/plugins/spellchk.c:2373 +#: ../pidgin/plugins/spellchk.c:2372 +#: ../pidgin/plugins/spellchk.c:2373 msgid "Replaces text in outgoing messages according to user-defined rules." msgstr "Erstatter tekst i utgående beskjeder etter regler som du bestemmer." @@ -18294,7 +17548,8 @@ #. *< dependencies #. *< priority #. *< id -#: ../pidgin/plugins/ticker/ticker.c:74 ../pidgin/plugins/ticker/ticker.c:354 +#: ../pidgin/plugins/ticker/ticker.c:74 +#: ../pidgin/plugins/ticker/ticker.c:354 msgid "Buddy Ticker" msgstr "Rullende kontaktliste" @@ -18302,14 +17557,14 @@ #. *< version #. * summary #. * description -#: ../pidgin/plugins/ticker/ticker.c:357 ../pidgin/plugins/ticker/ticker.c:359 +#: ../pidgin/plugins/ticker/ticker.c:357 +#: ../pidgin/plugins/ticker/ticker.c:359 msgid "A horizontal scrolling version of the buddy list." msgstr "En horisontalt rullende versjon av kontaktlisten." #: ../pidgin/plugins/timestamp.c:137 -#, fuzzy msgid "Display Timestamps Every" -msgstr "iChat tidsstempel" +msgstr "Vis Tidsstempel Hver" #. *< type #. *< ui_requirement @@ -18325,9 +17580,8 @@ #. *< version #. * summary #: ../pidgin/plugins/timestamp.c:205 -#, fuzzy msgid "Display iChat-style timestamps" -msgstr "iChat tidsstempel" +msgstr "Vis tidsstempel i iChat stil" #. * description #: ../pidgin/plugins/timestamp.c:207 @@ -18337,22 +17591,19 @@ #: ../pidgin/plugins/timestamp_format.c:23 msgid "Timestamp Format Options" -msgstr "" +msgstr "Innstillinger for Tidsstempel Format" #: ../pidgin/plugins/timestamp_format.c:26 -#, c-format msgid "_Force 24-hour time format" -msgstr "" +msgstr "_Tving 24-timers format" #: ../pidgin/plugins/timestamp_format.c:33 -#, fuzzy msgid "Show dates in..." -msgstr "Vis flere valg" +msgstr "Vis datoer i..." #: ../pidgin/plugins/timestamp_format.c:38 -#, fuzzy msgid "Co_nversations:" -msgstr "Samtaler" +msgstr "Sa_mtaler:" #: ../pidgin/plugins/timestamp_format.c:40 #: ../pidgin/plugins/timestamp_format.c:49 @@ -18363,12 +17614,11 @@ #: ../pidgin/plugins/timestamp_format.c:41 #: ../pidgin/plugins/timestamp_format.c:50 msgid "For delayed messages and in chats" -msgstr "" +msgstr "For forsinkede beskjeder og i samtaler" #: ../pidgin/plugins/timestamp_format.c:47 -#, fuzzy msgid "_Message Logs:" -msgstr "Beskjedlogging" +msgstr "_Beskjed logging:" #. *< type #. *< ui_requirement @@ -18378,21 +17628,19 @@ #. *< id #: ../pidgin/plugins/timestamp_format.c:151 msgid "Message Timestamp Formats" -msgstr "" +msgstr "Beskjeds Tidsstempel Formater" #. *< name #. *< version #. * summary #: ../pidgin/plugins/timestamp_format.c:154 msgid "Customizes the message timestamp formats." -msgstr "" +msgstr "Lager egne tidsstempel formater for beskjeder." #. * description #: ../pidgin/plugins/timestamp_format.c:156 -msgid "" -"This plugin allows the user to customize conversation and logging message " -"timestamp formats." -msgstr "" +msgid "This plugin allows the user to customize conversation and logging message timestamp formats." +msgstr "Dette tillegget tillater brukeren å lage egne samtale og loggings tidsstempler." #: ../pidgin/plugins/win32/transparency/win2ktrans.c:175 #: ../pidgin/plugins/win32/transparency/win2ktrans.c:598 @@ -18460,13 +17708,11 @@ #: ../pidgin/plugins/win32/transparency/win2ktrans.c:698 #, fuzzy msgid "" -"This plugin enables variable alpha transparency on conversation windows and " -"the buddy list.\n" +"This plugin enables variable alpha transparency on conversation windows and the buddy list.\n" "\n" "* Note: This plugin requires Win2000 or greater." msgstr "" -"Dette tillegget gjør at samtalevinduene og kontaktlisten blir delvis " -"gjennomsiktige.\n" +"Dette tillegget gjør at samtalevinduene og kontaktlisten blir delvis gjennomsiktige.\n" "\n" "* Merk: du må ha Windows 2000 eller Windows XP for at denne skal virke." @@ -18480,9 +17726,9 @@ msgstr "Oppstart" #: ../pidgin/plugins/win32/winprefs/winprefs.c:312 -#, fuzzy, c-format +#, c-format msgid "_Start %s on Windows startup" -msgstr "Start Gaim når Windows starter" +msgstr "_Start %s når Windows starter" #: ../pidgin/plugins/win32/winprefs/winprefs.c:327 msgid "_Dockable Buddy List" @@ -18490,14 +17736,14 @@ #. Blist On Top #: ../pidgin/plugins/win32/winprefs/winprefs.c:331 -#, fuzzy msgid "_Keep Buddy List window on top:" -msgstr "Hold kontaktlistevinduet øverst" +msgstr "_Hold kontaktlistevinduet øverst:" #. XXX: Did this ever work? #: ../pidgin/plugins/win32/winprefs/winprefs.c:336 +#, fuzzy msgid "Only when docked" -msgstr "" +msgstr "Only when docked" #: ../pidgin/plugins/win32/winprefs/winprefs.c:341 #, fuzzy @@ -18510,21 +17756,16 @@ msgstr "Innloggingsvalg" #: ../pidgin/plugins/win32/winprefs/winprefs.c:373 -#, fuzzy msgid "Options specific to Pidgin for Windows." -msgstr "Innstillinger som er spesifikke for Windows Gaim." +msgstr "Innstillinger som er spesifikke for Windows Pidgin." #: ../pidgin/plugins/win32/winprefs/winprefs.c:374 -#, fuzzy -msgid "" -"Provides options specific to Pidgin for Windows , such as buddy list docking." -msgstr "" -"Gir spesifikke innstillinger for Windows Gaim, slik som kontaktliste docking " -"og samtale blinking." +msgid "Provides options specific to Pidgin for Windows , such as buddy list docking." +msgstr "Gir spesifikke innstillinger for Windows Pidgin, slik som kontaktliste docking og samtale blinking." #: ../pidgin/plugins/xmppconsole.c:667 msgid "Logged out." -msgstr "" +msgstr "Logget ut." #. *< type #. *< ui_requirement @@ -18532,1705 +17773,41 @@ #. *< dependencies #. *< priority #. *< id -#: ../pidgin/plugins/xmppconsole.c:746 ../pidgin/plugins/xmppconsole.c:841 +#: ../pidgin/plugins/xmppconsole.c:746 +#: ../pidgin/plugins/xmppconsole.c:841 #: ../pidgin/plugins/xmppconsole.c:860 msgid "XMPP Console" -msgstr "" +msgstr "XMPP Konsoll" #: ../pidgin/plugins/xmppconsole.c:753 -#, fuzzy msgid "Account: " msgstr "Konto:" #: ../pidgin/plugins/xmppconsole.c:780 msgid "Not connected to XMPP" -msgstr "" +msgstr "Ikke koblet til XMPP" #: ../pidgin/plugins/xmppconsole.c:790 msgid "Insert an stanza." -msgstr "" +msgstr "Sett inn et vers." #: ../pidgin/plugins/xmppconsole.c:799 msgid "Insert a stanza." -msgstr "" +msgstr "Sett inn et vers." #: ../pidgin/plugins/xmppconsole.c:808 -#, fuzzy msgid "Insert a stanza." -msgstr "Sett inn bilde" +msgstr "Sett inn et vers." #. *< name #. *< version #. * summary #: ../pidgin/plugins/xmppconsole.c:863 msgid "Send and receive raw XMPP stanzas." -msgstr "" +msgstr "Send og motta direkte XMPP vers." #. * description #: ../pidgin/plugins/xmppconsole.c:865 msgid "This plugin is useful for debbuging XMPP servers or clients." -msgstr "" - -#, fuzzy -#~ msgid "Offline buddies" -#~ msgstr "Dimme ned inaktive kontakter" - -#, fuzzy -#~ msgid "Sort" -#~ msgstr "Port" - -#, fuzzy -#~ msgid "By Status" -#~ msgstr "Etter status" - -#, fuzzy -#~ msgid "By Log Size" -#~ msgstr "Etter loggstørrelse" - -#, fuzzy -#~ msgid "Unable to connect to contact server" -#~ msgstr "Kan ikke koble til tjener." - -#, fuzzy -#~ msgid "Unable to retrieve MSN Address Book" -#~ msgstr "Kunne ikke hente kontaktliste" - -#, fuzzy -#~ msgid "Current media" -#~ msgstr "Pålogget på" - -#, fuzzy -#~ msgid "Windows Live Messenger Protocol Plugin" -#~ msgstr "Novel GroupWise Messenger protolltillegg" - -#, fuzzy -#~ msgid "Windows Live ID authentication Failed" -#~ msgstr "Normal autentisering feilet" - -#, fuzzy -#~ msgid "%s just sent you a Nudge!" -#~ msgstr "%s ønsker å sende deg en fil." - -#, fuzzy -#~ msgid "Unknown error (%d)" -#~ msgstr "Ukjent feil" - -#, fuzzy -#~ msgid "Unable to connect to OIM server" -#~ msgstr "Kan ikke koble til tjener." - -#, fuzzy -#~ msgid "%s (%s) changed status from %s to %s" -#~ msgstr "%s har endret kanaltema til: %s" - -#, fuzzy -#~ msgid "%s (%s) is now %s" -#~ msgstr "%s heter nå %s" - -#, fuzzy -#~ msgid "%s (%s) is no longer %s" -#~ msgstr "%s er tilbake." - -#, fuzzy -#~ msgid "_Merge" -#~ msgstr "Beskjed:" - -#, fuzzy -#~ msgid "_Send File..." -#~ msgstr "_Send fil" - -#, fuzzy -#~ msgid "Add Buddy _Pounce..." -#~ msgstr "Legg til kompisvarsling" - -#, fuzzy -#~ msgid "Hide when offline" -#~ msgstr "Ikke tillatt når avlogget" - -#, fuzzy -#~ msgid "Show when offline" -#~ msgstr "Ikke tillatt når avlogget" - -#, fuzzy -#~ msgid "Add _Buddy..." -#~ msgstr "Legg til kontakt" - -#, fuzzy -#~ msgid "Add C_hat..." -#~ msgstr "Legg til samtale" - -#, fuzzy -#~ msgid "Persistent" -#~ msgstr "Tillat" - -#, fuzzy -#~ msgid "/Accounts/Manage" -#~ msgstr "Kontoer" - -#, fuzzy -#~ msgid "A_ccount:" -#~ msgstr "Konto:" - -#, fuzzy -#~ msgid "S_end To" -#~ msgstr "Send som" - -#~ msgid "Gaim Internet Messenger" -#~ msgstr "Gaim lynmeldingsklient" - -#~ msgid "Hide Disconnect Errors" -#~ msgstr "Skjul frakoblingsfeil" - -#~ msgid "Hide Login Errors" -#~ msgstr "Skjul påloggningsfeil" - -#, fuzzy -#~ msgid "Hide Reconnecting Dialog" -#~ msgstr "Skjul frakoblingsfeil" - -#~ msgid "When you are kicked offline, this reconnects you." -#~ msgstr "" -#~ "Dette tillegget vil koble deg til på nytt dersom du mister forbindelsen." - -#~ msgid "Use last matching buddy" -#~ msgstr "Bruk samme kontakt som sist" - -#, fuzzy -#~ msgid "" -#~ "The buddy with the lowest score is the buddy who will have priority in " -#~ "the contact.\n" -#~ "The default values (offline = 4, away = 2, and idle = 1) will use what " -#~ "used to be\n" -#~ "the built-in order: active, idle, away, away + idle, offline." -#~ msgstr "" -#~ "Kompisen med den laveste verdien er den som er prioritert i kontakten.\n" -#~ "Standardverdiene (frakoblet = 4, fraværende = 2, og ingen aktivitet = 1)\n" -#~ "vil tilsvare det som var den innebygde rekkefølgen:\n" -#~ "aktiv -> ingen aktivitet -> fraværende -> fraværende og ingen aktivitet -" -#~ "> ikke pålogget." - -#~ msgid "Gaim" -#~ msgstr "Gaim" - -#~ msgid "Gaim - Signed off" -#~ msgstr "Gaim - Avlogget" - -#~ msgid "Gaim - Away" -#~ msgstr "Gaim - Borte" - -#~ msgid "Join A Chat..." -#~ msgstr "Bli med i samtalegruppe..." - -#~ msgid "Displays an icon for Gaim in the system tray." -#~ msgstr "Viser et ikon for gaim i systemtray." - -#~ msgid "" -#~ "Displays a system tray icon (in GNOME, KDE or Windows for example) to " -#~ "show the current status of Gaim, allow fast access to commonly used " -#~ "functions, and to toggle display of the buddy list or login window. Also " -#~ "allows messages to be queued until the icon is clicked, similar to ICQ." -#~ msgstr "" -#~ "Bruker et beskjedvarslings-applet (f.eks. i GNOME eller KDE) for å vise " -#~ "Gaims status, gi hurtig tilgang til ofte brukte funksjoner, og for å " -#~ "fjerne/vise kontaktlisten og påloggingsvinduet. Muliggjør også kølegging " -#~ "av beskjeder helt til ikonet klikkes, a la ICQ." - -#, fuzzy -#~ msgid "GtkTreeView Expander Size" -#~ msgstr "Utvider-størrelse" - -#~ msgid "The specified buddy was not found in the Evolution Contacts." -#~ msgstr "Kompisen ble ikke funnet i adresseboka til Evolution" - -#~ msgid "" -#~ "When a new conversation is opened this plugin will insert the last " -#~ "conversation into the current conversation.\n" -#~ "\n" -#~ "The history plugin requires logging be enabled. Logging can be enabled " -#~ "from Tools -> Preferences -> Logging. Enabling logs for instant messages " -#~ "and/or chats will activate history for the same conversation type(s)." -#~ msgstr "" -#~ "Når en ny samtale er åpnet vil dette tillegget sette inn siste samtale i " -#~ "den pågående samtalen.\n" -#~ "\n" -#~ "Historie tillegget krever at logging er slått på. Logging kan bli satt på " -#~ "gjennom Verktøy -> Innstillinger -> Logging. Å slå på logger for " -#~ "lynmeldinger og/eller prat vil aktivere historie for den samme " -#~ "samtaletypen." - -#~ msgid "" -#~ "You can get version %s from:
http://gaim.sourceforge.net." -#~ msgstr "" -#~ "Du kan finne versjon %s her:
http://gaim.sourceforge.net." - -#~ msgid "Delay" -#~ msgstr "Sett inn hvert" - -#~ msgid "WinGaim Options" -#~ msgstr "WinGaim Innstilinger" - -#~ msgid "" -#~ "%d buddy from group %s was not removed because its account was not logged " -#~ "in. This buddy and the group were not removed.\n" -#~ msgid_plural "" -#~ "%d buddies from group %s were not removed because their accounts were not " -#~ "logged in. These buddies and the group were not removed.\n" -#~ msgstr[0] "" -#~ "%d kontakt fra gruppen %s ble ikke fjernet fordi kontaktens konto ikke " -#~ "var innlogget. Denne kontakten (og gruppen) ble ikke fjernet.\n" -#~ msgstr[1] "" -#~ "%d kontakter fra gruppen %s ble ikke fjernet fordi kontoene deres ikke " -#~ "var innlogget. Disse kontaktene (og gruppen) ble ikke fjernet.\n" - -#~ msgid "Group not removed" -#~ msgstr "Gruppe ikke fjernet" - -#~ msgid "(+%d more)" -#~ msgstr "(+%d flere)" - -#~ msgid " left the room (%s)." -#~ msgstr " forlot rommet (%s)." - -#~ msgid "Screen Name:" -#~ msgstr "Skjermnavn:" - -#~ msgid "Buddy icon:" -#~ msgstr "Kontaktikon:" - -#~ msgid "" -#~ "\n" -#~ "\n" -#~ "Do you wish to add him or her to your buddy list?" -#~ msgstr "" -#~ "\n" -#~ "\n" -#~ "Ønsker du å legge vedkommende til i din kontaktliste?" - -#~ msgid "_Alias Buddy..." -#~ msgstr "_Alias for kontakt..." - -# -#, fuzzy -#~ msgid "Alias Contact..." -#~ msgstr "Kontaktalias..." - -#~ msgid "/Tools/Account Ac_tions" -#~ msgstr "/Verktøy/_Handlinger for kontoer" - -#~ msgid "/Tools/A_ccounts" -#~ msgstr "/Verktøy/K_ontoer" - -# -#, fuzzy -#~ msgid "" -#~ "\n" -#~ "Contact Alias: %s" -#~ msgstr "" -#~ "\n" -#~ "Kontaktalias:" - -#, fuzzy -#~ msgid "" -#~ "\n" -#~ "Alias: %s" -#~ msgstr "" -#~ "\n" -#~ "Alias:" - -#, fuzzy -#~ msgid "" -#~ "\n" -#~ "Nickname: %s" -#~ msgstr "" -#~ "\n" -#~ "Kallenavn:" - -#, fuzzy -#~ msgid "" -#~ "\n" -#~ "Logged In: %s" -#~ msgstr "" -#~ "\n" -#~ "Pålogget: " - -#~ msgid "" -#~ "\n" -#~ "Status: Offline" -#~ msgstr "" -#~ "\n" -#~ "Status: Avlogget" - -#~ msgid "" -#~ "\n" -#~ "Description: Spooky" -#~ msgstr "" -#~ "\n" -#~ "Beskrivelse: Skummel" - -#, fuzzy -#~ msgid "" -#~ "\n" -#~ "Status: Awesome" -#~ msgstr "" -#~ "\n" -#~ "Status: Fantastisk" - -#, fuzzy -#~ msgid "" -#~ "\n" -#~ "Status: Rockin'" -#~ msgstr "" -#~ "\n" -#~ "Status: Rockin'" - -#~ msgid "/Tools/Buddy Pounce" -#~ msgstr "/Verktøy/Kompisvarsel" - -#~ msgid "/Tools/Account Actions" -#~ msgstr "/Verktøy/_Handlinger for kontoe" - -# Lot "me" stå, var usikker på om denne brukes "teknisk" -# (denne meldingen kommer opp når du skriver "debug version" -# - da byttes "me" ut med kallenavn) -#~ msgid "me is using Gaim v%s." -#~ msgstr "me bruker Gaim v%s." - -#, fuzzy -#~ msgid "/Options/Show Buddy _Icon" -#~ msgstr "Vis kontaktikoner" - -#, fuzzy -#~ msgid "/Options/Show Buddy Icon" -#~ msgstr "Vis kontaktikoner" - -#~ msgid "IM the user" -#~ msgstr "Send beskjed til bruker" - -#~ msgid "Ignore the user" -#~ msgstr "Ignorer bruker" - -#~ msgid "Get the user's information" -#~ msgstr "Hent brukerinformasjon" - -#, fuzzy -#~ msgid "Jabber developer" -#~ msgstr "tidligere jabber-utvikler" - -#, fuzzy -#~ msgid "" -#~ "Gaim is a modular messaging client capable of using AIM, MSN, Yahoo!, " -#~ "Jabber, ICQ, IRC, SILC, Novell GroupWise, Napster, Zephyr, and Gadu-Gadu " -#~ "all at once. It is written using GTK+ and is licensed under the GNU GPL." -#~ "

" -#~ msgstr "" -#~ "Gaim er en modulbasert klient for direktemeldinger som kan bruke AIM, " -#~ "MSN, Yahoo!, Jabber, ICQ, IRC, SILC, Novell GroupWise, Napster, Zephyr, " -#~ "og Gadu-Gadu samtidig. Programmet er bygget på Gtk+ og er lisensiert " -#~ "under GPL.

" - -#~ msgid "IRC: #wingaim on irc.freenode.net

" -#~ msgstr "IRC: #wingaim på irc.freenode.net

" - -#~ msgid "Active Developers" -#~ msgstr "Aktive utviklere" - -#~ msgid "_Keep the dialog open" -#~ msgstr "Hold dialogen åpen" - -#~ msgid "Smaller font size" -#~ msgstr "Mindre skrift" - -#~ msgid "Insert link" -#~ msgstr "Sett inn lenke" - -#~ msgid "Insert image" -#~ msgstr "Sett inn bilde" - -#, fuzzy -#~ msgid "Conversation in %s on %s" -#~ msgstr "Samtaler med %s" - -#~ msgid "From: %s\n" -#~ msgstr "Fra: %s\n" - -#~ msgid "Subject: %s\n" -#~ msgstr "Emne: %s\n" - -#~ msgid "" -#~ "You have mail!\n" -#~ "\n" -#~ "%s%s%s%s" -#~ msgstr "" -#~ "Du har e-post!\n" -#~ "\n" -#~ "%s%s%s%s" - -#~ msgid "Error launching %s: %s" -#~ msgstr "Feil under starting av kommando: %s:%s" - -#~ msgid "A_way" -#~ msgstr "_Borte" - -#~ msgid "_Idle" -#~ msgstr "_Inaktiv" - -#~ msgid "Retur_n from idle" -#~ msgstr "Retur_ner fra inaktivitet" - -#~ msgid "Pounce Action" -#~ msgstr "Varslingsmåte" - -#~ msgid "Bro_wse..." -#~ msgstr "Bla _gjennom" - -#~ msgid "Sav_e this pounce after activation" -#~ msgstr "Lagre denne varslingen etter aktivering" - -#~ msgid "Remove Buddy Pounce" -#~ msgstr "Fjern kompisvarsling" - -#~ msgid "Send unknown \"_slash\" commands as messages" -#~ msgstr "Send ukjente \"skråstreks\"-kommandoer som meldinger" - -#~ msgid "Show buddy _icons" -#~ msgstr "Vis kontaktikoner" - -#~ msgid "Tab Options" -#~ msgstr "Fanevalg" - -#~ msgid "_Sounds while away" -#~ msgstr "Lyder når du er fraværsmarkert" - -#~ msgid "_Queue new messages when away" -#~ msgstr "Når borte, legg nye beskjeder i kø" - -#, fuzzy -#~ msgid "Custom status" -#~ msgstr "Etter status" - -#~ msgid "" -#~ "Unable to play sound because the 'Command' sound method has been chosen, " -#~ "but no command has been set." -#~ msgstr "" -#~ "Kunne ikke spille av lyd fordi du har valgt at et eksternt program skal " -#~ "spille av lyd, men ikke spesifisert navnet på programmet." - -#~ msgid "" -#~ "Unable to play sound because the configured sound command could not be " -#~ "launched: %s" -#~ msgstr "" -#~ "Kunne ikke spille av lyd fordi det konfigurerte avspillingsprogrammet " -#~ "ikke kunne startes: %s" - -#~ msgid "_Warn" -#~ msgstr "Advar" - -#~ msgid "" -#~ "You can send this image as a file transfer or embed it into this message, " -#~ "or use it as the buddy icon for this user." -#~ msgstr "" -#~ "Du kan sende dette bildet som filoverføring, sett det inn i denne " -#~ "bekjeden eller bruk det som kompis ikon for denne brukeren." - -#, fuzzy -#~ msgid "" -#~ "\n" -#~ "Status: %s" -#~ msgstr "" -#~ "\n" -#~ "Status: Fantastisk" - -#, fuzzy -#~ msgid "" -#~ "\n" -#~ "Message: %s" -#~ msgstr "" -#~ "\n" -#~ "%s: %s" - -#, fuzzy -#~ msgid "Could't open file" -#~ msgstr "Kan ikke sende fil" - -#, fuzzy -#~ msgid "Change password" -#~ msgstr "Bytt passord" - -#~ msgid "%s: %s" -#~ msgstr "%s: %s" - -#~ msgid "%s: %s
" -#~ msgstr "%s: %s
" - -#~ msgid "Realname" -#~ msgstr "Virkelig navn" - -#~ msgid "Cannot join %s:" -#~ msgstr "Kan ikke bli med i %s:" - -#~ msgid "" -#~ "Server requires TLS/SSL for login. Select \"Use TLS if available\" in " -#~ "account properties" -#~ msgstr "" -#~ "Tjeneren krever TSL/SSL for innlogging. Velg \"Bruk TLS hvis tilgjengelig " -#~ "\" i kontoalternativer." - -#~ msgid "Jabber ID" -#~ msgstr "Jabber-feil" - -#, fuzzy -#~ msgid "Search for Jabber users" -#~ msgstr "Kontaktsøk etter e-postadresse" - -#~ msgid "Invalid Jabber ID" -#~ msgstr "Ugyldig jabber-ID" - -#~ msgid "Change Jabber Password" -#~ msgstr "Bytt jabber-passord" - -#~ msgid "Jabber Protocol Plugin" -#~ msgstr "Jabber-protokolltillegg" - -#~ msgid "Use TLS if available" -#~ msgstr "Bruk TLS hvis tilgjengelig" - -#~ msgid "The user %s wants to add %s to his or her buddy list." -#~ msgstr "Brukeren %s ønsker å legge til %s i kontaktlisten sin." - -#~ msgid "You have just sent a Nudge!" -#~ msgstr "Du har sent en Nudge!" - -#~ msgid "" -#~ "\n" -#~ "%s: %s" -#~ msgstr "" -#~ "\n" -#~ "%s: %s" - -#~ msgid "Hidden" -#~ msgstr "Usynlig" - -#~ msgid "%s: " -#~ msgstr "%s: " - -#~ msgid "MSN Profile" -#~ msgstr "MSN-profil" - -#~ msgid "Login server" -#~ msgstr "Påloggingstjener" - -#~ msgid "The user %s (%s) wants to add %s to his or her buddy list." -#~ msgstr "Brukeren %s (%s) ønsker å legge til %s i kontaktlisten sin." - -#~ msgid "Unable to read header from server" -#~ msgstr "Kunne ikke lese meldingshode fra tjener" - -#~ msgid "" -#~ "Unable to read message from server: %s. Command is %hd, length is %hd." -#~ msgstr "" -#~ "Kunne ikke lese melding fra tjener: %s. Kommando er %hd, lengde er %hd." - -#~ msgid "users: %s, files: %s, size: %sGB" -#~ msgstr "brukere: %s, filer: %s, størrelse %sGB" - -#~ msgid "Unable to add \"%s\" to your Napster hotlist" -#~ msgstr "Kunne ikke legge til \"%s\" i Napster-listen din" - -#~ msgid "%s requested a PING" -#~ msgstr "%s pinget deg" - -#~ msgid "NAPSTER Protocol Plugin" -#~ msgstr "Napster-protokolltillegg" - -# -#~ msgid "Invalid password" -#~ msgstr "Ugyldig passord" - -#~ msgid "Invalid username or password" -#~ msgstr "Ugyldig brukernavn eller passord" - -#~ msgid "Error processing event or response (%s)." -#~ msgstr "Klarte ikke behandle hendelse eller svar (%s)." - -#~ msgid "Direct IM with %s closed" -#~ msgstr "Direkte samtale med %s stengt" - -#~ msgid "Direct IM with %s failed" -#~ msgstr "Direkte samtale med %s mislyktes" - -#~ msgid "Unable to open Direct IM" -#~ msgstr "Kunne ikke åpne direkte direktesamtale" - -#, fuzzy -#~ msgid "You have lost your connection to chat room %s." -#~ msgstr "Du har blitt koblet fra samtalegruppen %s." - -#~ msgid "Chat is currently unavailable" -#~ msgstr "Samtalegrupper er for tiden utilgjengelig" - -#~ msgid "" -#~ "Transfer of file %s timed out.\n" -#~ " Try enabling proxy servers for file transfers in Tools->Preferences->AIM/" -#~ "ICQ." -#~ msgstr "" -#~ "Overføring av filen %s timet ut.\n" -#~ " Forsøk å slå på proxy servere for filoverføringer i Verktøy-" -#~ ">Innstillinger->AIM/ICQ." - -#, fuzzy -#~ msgid "Unable to log into file transfer proxy." -#~ msgstr "Kunne ikke skrive fil %s." - -#, fuzzy -#~ msgid "" -#~ "Unable to establish listener socket or no AOL proxy connection present." -#~ msgstr "Kunne ikke etablere lytte-socket." - -#~ msgid "" -#~ "The user %s requires authorization before being added to a buddy list. " -#~ "Do you want to send an authorization request?" -#~ msgstr "" -#~ "Brukeren %s krever godkjenning før vedkommende legges til i " -#~ "kontaktlisten. Vil du sende en godkjenningsforespørsel?" - -#~ msgid "Request Authorization" -#~ msgstr "Spør om godkjenning" - -#, fuzzy -#~ msgid "" -#~ "The user %u wants to add %s to their buddy list for the following " -#~ "reason:\n" -#~ "%s" -#~ msgstr "" -#~ "Brukeren %u ønsker å legge deg til sin kontaktliste og oppgav følgende " -#~ "grunn:\n" -#~ "%s" - -#~ msgid "Authorization Request" -#~ msgstr "Godkjenningsforespørsel" - -#~ msgid "UIN: %s
Status: %s
%s" -#~ msgstr "UIN: %s
Status: %s
%s" - -#~ msgid "SNAC threw error: %s\n" -#~ msgstr "SNAC-feil: %s\n" - -#~ msgid "User information for %s unavailable:" -#~ msgstr "Brukerinformasjon for %s er ikke tilgjengelig:" - -#~ msgid "Rate limiting error." -#~ msgstr "Feil ved hastighetsbegrensning." - -#~ msgid "You have been signed off for an unknown reason." -#~ msgstr "Du har blitt logget av, årsak ukjent." - -#~ msgid "" -#~ "Your screen name is currently formatted as follows:\n" -#~ "%s" -#~ msgstr "" -#~ "Skjermnavnet ditt er formatert slik:\n" -#~ "%s" - -#~ msgid "Unable to set AIM away message." -#~ msgstr "Kunne ikke sette fraværsbeskjed for AIM." - -#~ msgid "" -#~ "You have probably requested to set your away message before the login " -#~ "procedure completed. You remain in a \"present\" state; try setting it " -#~ "again when you are fully connected." -#~ msgstr "" -#~ "Du har antakeligvis prøvd å sette en fraværsbeskjed før " -#~ "innloggingsprosedyren var ferdig. Du er fortsatt markert som til stede. " -#~ "Prøv å gjenta operasjonen når du er ferdig pålogget." - -#~ msgid "" -#~ "Could not add the buddy %s for an unknown reason. The most common reason " -#~ "for this is that you have the maximum number of allowed buddies in your " -#~ "buddy list." -#~ msgstr "" -#~ "Kunne ikke legge til kontakten %s pga. en ukjent feil. Den vanligste " -#~ "årsaken til dette er at du har nådd maksimalgrensen for antall kontakter " -#~ "i kontaktlisten din." - -#, fuzzy -#~ msgid "" -#~ "The user %s wants to add %s to their buddy list for the following " -#~ "reason:\n" -#~ "%s" -#~ msgstr "" -#~ "Brukeren %s ønsker å legge deg til i kontaktlisten sin med følgende " -#~ "grunn:\n" -#~ "%s" - -#, fuzzy -#~ msgid "Hide IP address" -#~ msgstr "IP-adresse" - -#, fuzzy -#~ msgid "Web aware" -#~ msgstr "Web-oppmerksom" - -#~ msgid "New screen name formatting:" -#~ msgstr "Ny skjermnavn-formatering:" - -#~ msgid "Format Screen Name..." -#~ msgstr "Formatere skjermnavn..." - -#~ msgid "Use AIM/ICQ proxy server (Slower/More Secure/Usually Works)" -#~ msgstr "Bruk AIM/ICQ proxy server (Saktere/Mer sikkert/Fungerer vanligvis)" - -#~ msgid "Auth host" -#~ msgstr "Autentiseringsadresse:" - -#~ msgid "Auth port" -#~ msgstr "Autentiseringsport:" - -#~ msgid "Active" -#~ msgstr "Aktiv" - -#~ msgid "" -#~ "Could not add the buddy %s because every simple user has to start with " -#~ "'sip:'." -#~ msgstr "" -#~ "Kunne ikke tilføye kompis %s fordi hver enkel bruker må starte med 'sip:'." - -#~ msgid "Thomas Butter " -#~ msgstr "Thomas Butter " - -#~ msgid "EMail" -#~ msgstr "E-post" - -#~ msgid "Instant Messages" -#~ msgstr "Direktemeldinger" - -#~ msgid "Verify all IM message signatures" -#~ msgstr "Bekreft alle direktemeldingssignaturer" - -#~ msgid "Channel Messages" -#~ msgstr "Kanalmeldinger" - -#~ msgid "Digitally sign all channel messages" -#~ msgstr "Signer alle kanalmeldinger digitalt" - -#~ msgid "Verify all channel message signatures" -#~ msgstr "Bekreft alle kanalmeldingssignaturer" - -#, fuzzy -#~ msgid "Reject watching by other users" -#~ msgstr "Avvis overvåkning fra andre brukere" - -#~ msgid "Block invites" -#~ msgstr "Blokker invitasjoner" - -#, fuzzy -#~ msgid "Reject online status attribute requests" -#~ msgstr "Avvis spørsmål om tilkoplingsstatus" - -#~ msgid "TOC has sent a PAUSE command." -#~ msgstr "TOC har sendt en PAUSE-kommando." - -#~ msgid "" -#~ "When this happens, TOC ignores any messages sent to it, and may kick you " -#~ "off if you send a message. Gaim will prevent anything from going through. " -#~ "This is only temporary, please be patient." -#~ msgstr "" -#~ "Når dette skjer, vil TOC ignorere alle beskjeder som blir sendt, og vil " -#~ "kanskje kaste deg ut hvis du prøver å sende. Gaim vil derfor stoppe alle " -#~ "utsendelser. Dette er bare midlertidig, vennligst vent." - -#~ msgid "Gaim - Save As..." -#~ msgstr "Gaim - Lagre som..." - -#~ msgid "TOC host" -#~ msgstr "TOC-adresse:" - -#~ msgid "TOC port" -#~ msgstr "TOC-port:" - -#, fuzzy -#~ msgid "Message (optional) :" -#~ msgstr "Beskjedvarsling" - -#~ msgid "" -#~ "The normal authentication method has failed. This means either your " -#~ "password is incorrect, or Yahoo!'s authentication scheme has changed. " -#~ "Gaim will now attempt to log in using Web Messenger authentication, which " -#~ "will result in reduced functionality and features." -#~ msgstr "" -#~ "Den normale autentifikasjonsmekanismen har feilet, noe som enten betyr at " -#~ "passordet ditt er feil, eller at Yahoo! sin autentifikasjonsmetode har " -#~ "endret seg. Gaim vil nå forsøke å logge inn ved hjelp av Web Messenger " -#~ "autentifikasjon, noe som vil føre til redusert funksjonalitet og færre " -#~ "muligheter" - -#~ msgid "Unable to read" -#~ msgstr "Kunne ikke lese" - -#, fuzzy -#~ msgid "Stealth" -#~ msgstr "Fylke/stat" - -#~ msgid "Pager host" -#~ msgstr "Personsøker-adresse:" - -#, fuzzy -#~ msgid "YCHT Host" -#~ msgstr "YCHT-vert" - -#, fuzzy -#~ msgid "YCHT Port" -#~ msgstr "YCHT-Port" - -#~ msgid "IP Address: %s
" -#~ msgstr "IP-adresse: %s
" - -#~ msgid "(%d message)" -#~ msgid_plural "(%d messages)" -#~ msgstr[0] "(%d beskjeder)" -#~ msgstr[1] "(%d beskjeder)" - -#~ msgid "(1 message)" -#~ msgstr "(1 beskjed)" - -#~ msgid "%s came back" -#~ msgstr "%s kom tilbake" - -#, fuzzy -#~ msgid "Default auto-away" -#~ msgstr "Automatisk fraværsmarkering" - -#~ msgid "g003: Error opening connection.\n" -#~ msgstr "g003: Feil ved tilkobling.\n" - -#, fuzzy -#~ msgid "Show more buddy details" -#~ msgstr "Vis brukerdetaljer" - -#~ msgid "Gnome Default" -#~ msgstr "Gnome-standard" - -#~ msgid "Away m_essage:" -#~ msgstr "Fraværsbeskjed:" - -#, fuzzy -#~ msgid "Quit message" -#~ msgstr "(1 beskjed)" - -#~ msgid "Restore Away State On Reconnect" -#~ msgstr "" -#~ "Fortsett som fraværende etter at forbindelsen har blitt gjennoprettet" - -#~ msgid "Mail Server" -#~ msgstr "E-posttjener" - -#~ msgid "%s (%d new/%d total)" -#~ msgstr "%s (%d nye/%d totalt)" - -#~ msgid "Check Mail" -#~ msgstr "Sjekk e-post" - -#~ msgid "Check e-mail every X seconds.\n" -#~ msgstr "Sjekk e-post hvert Xte sekund.\n" - -#~ msgid "Auto-login" -#~ msgstr "Automatisk pålogging" - -#~ msgid "Signoff" -#~ msgstr "Logge av" - -#~ msgid "_Hide new messages until tray icon is clicked" -#~ msgstr "Skjul nye beskjeder inntil trayikon klikkes" - -#~ msgid "Not connected to AIM" -#~ msgstr "Ikke tilkoblet til AIM" - -#~ msgid "No roomname given." -#~ msgstr "Romnavn ikke oppgitt." - -#~ msgid "Invalid AIM URI" -#~ msgstr "Ugyldig AIM URI" - -#~ msgid "" -#~ "Failed to assign %s to a socket:\n" -#~ "%s" -#~ msgstr "" -#~ "Klarte ikke tilordne %s til en socket:\n" -#~ "%s" - -#~ msgid "Remote Control" -#~ msgstr "Styre Gaim fra kontrollfil" - -#~ msgid "Provides remote control for gaim applications." -#~ msgstr "Muliggjør fjernstyring for Gaim-applikasjoner." - -#~ msgid "" -#~ "Gives Gaim the ability to be remote-controlled through third-party " -#~ "applications or through the gaim-remote tool." -#~ msgstr "" -#~ "Lar Gaim bli kontrollert fra tredjeparts-applikasjoner eller gjennom " -#~ "verktøyet gaim-remote." - -#~ msgid "Docked _Buddy List is always on top" -#~ msgstr "Dockable kontaktliste er alltid øverst" - -#~ msgid "Away!" -#~ msgstr "Borte" - -#~ msgid "Edit This Message" -#~ msgstr "Rediger denne meldingen" - -#~ msgid "I'm Back!" -#~ msgstr "Tilbake!" - -#~ msgid "Remove Away Message" -#~ msgstr "Fjern fraværsbeskjed" - -#~ msgid "Set All Away" -#~ msgstr "Marker som borte på alle" - -#~ msgid "You cannot save an away message with a blank title" -#~ msgstr "Du kan ikke lagre en fraværsbeskjed uten tittel" - -#~ msgid "" -#~ "Please give the message a title, or choose \"Use\" to use without saving." -#~ msgstr "" -#~ "Vennligst gi beskjeden en tittel, eller velg \"Bruk\" for å bruke uten " -#~ "lagring." - -#~ msgid "You cannot create an empty away message" -#~ msgstr "Du kan ikke lage en tom fraværsbeskjed" - -#~ msgid "Away title: " -#~ msgstr "Tittel: " - -#~ msgid "Buddy List Error" -#~ msgstr "Feil i kontaktliste" - -#~ msgid "Size of the expander arrow" -#~ msgstr "Størrelse på utvider-pil" - -#~ msgid "" -#~ "Usage: %s command [OPTIONS] [URI]\n" -#~ "\n" -#~ " COMMANDS:\n" -#~ " uri Handle AIM: URI\n" -#~ " away Popup the away dialog with the default " -#~ "message\n" -#~ " back Remove the away dialog\n" -#~ " quit Close running copy of Gaim\n" -#~ "\n" -#~ " OPTIONS:\n" -#~ " -h, --help [command] Show help for command\n" -#~ msgstr "" -#~ "Bruksmåte: %s kommando [FLAGG] [URI]\n" -#~ "\n" -#~ " KOMMANDOER:\n" -#~ " uri Håndtere AIM-URI\n" -#~ " away Sprett opp fraværsdialogen med " -#~ "standardmeldingen\n" -#~ " back Fjern standardmeldingen\n" -#~ " quit Lukk Gaim-program som kjører\n" -#~ "\n" -#~ " FLAGG:\n" -#~ " -h, --help [kommando] Vis hjelp for kommando\n" - -#~ msgid "" -#~ "Gaim not running (on session 0)\n" -#~ "Is the \"Remote Control\" plugin loaded?\n" -#~ msgstr "" -#~ "Gaim kjører ikke (på sesjon 0)\n" -#~ "Er fjernstyringstillegget lastet?\n" - -#~ msgid "" -#~ "\n" -#~ "Using AIM: URIs:\n" -#~ "Sending an IM to a screen name:\n" -#~ "\tgaim-remote uri 'aim:goim?screenname=Penguin&message=hello+world'\n" -#~ "In this case, 'Penguin' is the screen name we wish to IM, and 'hello " -#~ "world'\n" -#~ "is the message to be sent. '+' must be used in place of spaces.\n" -#~ "Please note the quoting used above - if you run this from a shell the " -#~ "'&'\n" -#~ "needs to be escaped, or the command will stop at that point.\n" -#~ "Also,the following will just open a conversation window to a screen " -#~ "name,\n" -#~ "with no message:\n" -#~ "\tgaim-remote uri 'aim:goim?screenname=Penguin'\n" -#~ "\n" -#~ "Joining a chat:\n" -#~ "\tgaim-remote uri 'aim:gochat?roomname=PenguinLounge'\n" -#~ "...joins the 'PenguinLounge' chat room.\n" -#~ "\n" -#~ "Adding a buddy to your buddy list:\n" -#~ "\tgaim-remote uri 'aim:addbuddy?screenname=Penguin'\n" -#~ "...prompts you to add 'Penguin' to your buddy list.\n" -#~ msgstr "" -#~ "\n" -#~ "Bruke AIM: URIer:\n" -#~ "Å sende en direktebeskjed til en kontakts skjermnavn:\n" -#~ "\tgaim-remote uri 'aim:goim?screenname=Penguin&message=hello+world'\n" -#~ "'Penguin' er skjermnavnet vi ønsker å sende direktebeskjed til, og " -#~ "'hello\n" -#~ "world' er beskjeden. Tegnet '+' må brukes som erstatning for mellomrom.\n" -#~ "Merk at hvordan kommandoen over bruker anførselstegn - hvis du starter\n" -#~ "kommandoen fra et shell, må du passe på å 'escape' tegnet &, ellers vil " -#~ "resten\n" -#~ "av linja ignoreres. Hvis du bare ønsker å åpne et samtalevindu til en " -#~ "kontakt\n" -#~ "uten å sende noen beskjed først, kan du gjøre slik:\n" -#~ "\tgaim-remote uri aim:goim?screenname=Penguin\n" -#~ "\n" -#~ "For å bli med i en samtale:\n" -#~ "\tgaim-remote uri aim:gochat?roomname=PenguinLounge\n" -#~ "...starter en samtale i PenguinLounge-samtalerommet.\n" -#~ "\n" -#~ "For å legge til en kontakt i kontaktlisten:\n" -#~ "\tgaim-remote uri aim:addbuddy?screenname=Penguin\n" -#~ "...vil spørre deg om å legge til Penguin i kontaktlisten.\n" - -#~ msgid "" -#~ "\n" -#~ "Close running copy of Gaim\n" -#~ msgstr "" -#~ "\n" -#~ "Lukk eksisterende Gaim-program\n" - -#~ msgid "" -#~ "\n" -#~ "Mark all accounts as \"away\" with the default message.\n" -#~ msgstr "" -#~ "\n" -#~ "Merk alle kontoer som \"fraværende\" med standardmeldingen.\n" - -#~ msgid "" -#~ "\n" -#~ "Set all accounts as not away.\n" -#~ msgstr "" -#~ "\n" -#~ "Sett alle kontoers status til ikke fraværende.\n" - -#~ msgid "Show fewer options" -#~ msgstr "Vis færre valg" - -#~ msgid "/Tools/_Away" -#~ msgstr "/Verktøy/_Borte" - -#~ msgid "/Tools/Pl_ugin Actions" -#~ msgstr "/Verktøy/Handlinger for tillegg" - -#~ msgid "Rename Group" -#~ msgstr "Endre gruppenavn" - -#~ msgid "New group name" -#~ msgstr "Nytt gruppenavn:" - -#~ msgid "%d%%" -#~ msgstr "%d%%" - -#~ msgid "" -#~ "\n" -#~ "Account:" -#~ msgstr "" -#~ "\n" -#~ "Konto:" - -#~ msgid "Warned (%d%%) " -#~ msgstr "Advart (%d%%) " - -#~ msgid "/Tools/Away" -#~ msgstr "/Verktøy/Borte" - -#~ msgid "Send a message to the selected buddy" -#~ msgstr "Send beskjed til den valgte kontakten" - -#~ msgid "Get information on the selected buddy" -#~ msgstr "Hent informasjon om den valgte kontakten" - -#~ msgid "_Chat" -#~ msgstr "_Gruppesamtale" - -#~ msgid "Join a chat room" -#~ msgstr "Bli med i samtalegruppe" - -#~ msgid "_Away" -#~ msgstr "_Borte" - -#~ msgid "Set an away message" -#~ msgstr "Sett en fraværsbeskjed" - -#~ msgid "Done." -#~ msgstr "Ferdig." - -#~ msgid "Signon: " -#~ msgstr "Pålogging: " - -#~ msgid "Signon" -#~ msgstr "Pålogging" - -#~ msgid "Cancel All" -#~ msgstr "A_vbryt alle" - -# -#~ msgid "_Reconnect" -#~ msgstr "Kople til på nytt" - -#~ msgid "Reason Unknown." -#~ msgstr "Ukjent årsak." - -# -#~ msgid "Reconnect _All" -#~ msgstr "Kople til _alle på nytt" - -#~ msgid "Get Away Msg" -#~ msgstr "Hent fraværsbeskjed" - -#~ msgid "/Conversation/_Warn..." -#~ msgstr "/Samtale/A_dvar..." - -#~ msgid "/Conversation/A_lias..." -#~ msgstr "/Samtale/_Alias..." - -#~ msgid "/Options/Show T_imestamps" -#~ msgstr "/Brukervalg/Vis t_idsstempler" - -#~ msgid "/Conversation/Warn..." -#~ msgstr "/Samtale/Advar..." - -#~ msgid "Warn the user" -#~ msgstr "Advar brukeren" - -#~ msgid "Send a file to the user" -#~ msgstr "Send en fil til brukeren" - -#~ msgid "Remove the user from your buddy list" -#~ msgstr "Fjern brukeren fra kontaktlisten din" - -#~ msgid "Invite a user" -#~ msgstr "Inviter en bruker" - -#~ msgid "Add the chat to your buddy list" -#~ msgstr "Legg til samtalen i kontaktlisten din" - -#~ msgid "
/Conversation/Close" -#~ msgstr "
/Samtale/Lukk" - -#~ msgid "former lead developer" -#~ msgstr "tidligere hovedutvikler" - -#~ msgid "former maintainer" -#~ msgstr "tidligere ansvarlig" - -#, fuzzy -#~ msgid "Azerbaijani" -#~ msgstr "Serbisk" - -#~ msgid "Burmese" -#~ msgstr "Burmesisk" - -#~ msgid "Ukrainian" -#~ msgstr "Ukrainsk" - -# -#~ msgid "Chinese" -#~ msgstr "Kinesisk" - -#~ msgid "" -#~ "Warn %s?\n" -#~ "\n" -#~ "This will increase %s's warning level and he or she will be subject to " -#~ "harsher rate limiting.\n" -#~ msgstr "" -#~ "Advar %s?\n" -#~ "\n" -#~ "Dette vil øke advarselsnivået til %s og vedkommende vil måtte tåle " -#~ "strengere hastighetsbegrensning.\n" - -#~ msgid "Warn _anonymously?" -#~ msgstr "Advar anonymt" - -#~ msgid "Anonymous warnings are less severe." -#~ msgstr "Anonyme advarsler er mindre betydningsfulle." - -#~ msgid "Show transfer details" -#~ msgstr "Vis overføringsdetaljer" - -#~ msgid "D_isplay remote nicknames if no alias is set" -#~ msgstr "Vis kallenavn for personer hvis de ikke har noe alias" - -#~ msgid "Display" -#~ msgstr "Vis" - -#~ msgid "Show _timestamp on messages" -#~ msgstr "Vis tidsstempel på beskjeder" - -#~ msgid "Ignore font _faces" -#~ msgstr "Ignorer skrifttyper" - -#~ msgid "_Send default formatting with outgoing messages" -#~ msgstr "_Send standardformatering med utgående meldinger" - -#~ msgid "Enter _sends message" -#~ msgstr "Enter _sender beskjeden" - -#~ msgid "Window Closing" -#~ msgstr "Lukke vindu" - -#~ msgid "_Escape closes window" -#~ msgstr "_ESC lukker vinduet" - -#~ msgid "Insertions" -#~ msgstr "Innsettinger" - -#~ msgid "Control-{B/I/U} changes _formatting" -#~ msgstr "CTRL-{b/i/u/s} endrer _formatering" - -#~ msgid "Control-(number) _inserts smileys" -#~ msgstr "CTRL-(tall) setter _inn smilefjes" - -#~ msgid "Show _buttons as:" -#~ msgstr "Vis knapper som:" - -#~ msgid "Text" -#~ msgstr "Tekst" - -#~ msgid "Pictures and text" -#~ msgstr "Bilder og tekst" - -#~ msgid "_Raise window on events" -#~ msgstr "Flytt vinduet øverst ved hendelser" - -#~ msgid "Show _warning levels" -#~ msgstr "Vis advarselsnivåer" - -#~ msgid "Enable \"_slash\" commands" -#~ msgstr "Skru på \"_skråstreks\"-kommandoer" - -#~ msgid "_Raise IM window on events" -#~ msgstr "Flytt direktemeldingsvindu øverst ved hendelser" - -#~ msgid "Raise chat _window on events" -#~ msgstr "Flytt gruppesamtalevinduet øverst ved hendelser" - -#~ msgid "Use _multi-colored screen names in chats" -#~ msgstr "Bruk _flerfargede brukernavn i samtalegrupper" - -#~ msgid "Tab p_lacement:" -#~ msgstr "_Faneplassering:" - -#~ msgid "New conversation _placement:" -#~ msgstr "Ny samtale_plassering" - -#~ msgid "System Logs" -#~ msgstr "Systemlogging" - -#~ msgid "_Enable system log" -#~ msgstr "Skru på _systemlogg:" - -#~ msgid "Log when buddies _sign on/sign off" -#~ msgstr "Skriv til logg når kontakter logger av/på" - -#~ msgid "Log when buddies become _idle/un-idle" -#~ msgstr "Skriv til logg når kontakter blir aktiv/inaktiv" - -#~ msgid "Log when buddies go away/come _back" -#~ msgstr "Skriv til logg når kontakter blir borte/kommer tilbake" - -#~ msgid "Log your _own signons/idleness/awayness" -#~ msgstr "Skriv egne pålogginger/inaktivitet/bortemarkeringer til logg" - -#~ msgid "Idle _time reporting:" -#~ msgstr "Rapportering av inaktiv _tid:" - -#~ msgid "Gaim usage" -#~ msgstr "Gaim-bruk" - -#~ msgid "X usage" -#~ msgstr "X-bruk" - -#~ msgid "Windows usage" -#~ msgstr "Windows-bruk" - -#~ msgid "" -#~ "%s %s\n" -#~ "\n" -#~ "Written by: %s\n" -#~ "URL: %s\n" -#~ "File name: %s" -#~ msgstr "" -#~ "%s %s\n" -#~ "\n" -#~ "Skrevet av: %s\n" -#~ "URL: %s\n" -#~ "Filnavn: %s" - -#~ msgid "Summary" -#~ msgstr "Oppsummering" - -#~ msgid "Details" -#~ msgstr "Detaljer" - -#~ msgid "Message Text" -#~ msgstr "Beskjeder" - -#~ msgid "Shortcuts" -#~ msgstr "Hurtigtaster" - -#~ msgid "Away Messages" -#~ msgstr "Fraværsbeskjeder" - -#~ msgid "Please create an account." -#~ msgstr "Vennligst lag en konto." - -#~ msgid "_Account:" -#~ msgstr "_Konto:" - -#~ msgid "A_ccounts" -#~ msgstr "Kontoer" - -#, fuzzy -#~ msgid "P_references" -#~ msgstr "Innstillinger" - -#~ msgid "_Sign on" -#~ msgstr "Logg _på" - -#~ msgid "" -#~ "Gaim %s\n" -#~ "Usage: %s [OPTION]...\n" -#~ "\n" -#~ " -a, --acct display account editor window\n" -#~ " -w, --away[=MESG] make away on signon (optional argument MESG " -#~ "specifies\n" -#~ " name of away message to use)\n" -#~ " -l, --login[=NAME] automatically login (optional argument NAME " -#~ "specifies\n" -#~ " account(s) to use, seperated by commas)\n" -#~ " -n, --loginwin don't automatically login; show login window\n" -#~ " -u, --user=NAME use account NAME\n" -#~ " -c, --config=DIR use DIR for config files\n" -#~ " -d, --debug print debugging messages to stdout\n" -#~ " -v, --version display the current version and exit\n" -#~ " -h, --help display this help and exit\n" -#~ msgstr "" -#~ "Gaim %s\n" -#~ "Bruksmåte: %s [BRUKERVALG]...\n" -#~ "\n" -#~ " -a, --acct vis redigeringsvindu for kontoer\n" -#~ " -w, --away[=MESG] marker som borte ved pålogging (valgfri MESG er " -#~ "navnet\n" -#~ " på bortebeskjeden du vil bruke)\n" -#~ " -l, --login[=NAME] logg inn automatisk (valgfri NAME er navnet på\n" -#~ " konto(er) du vil bruke, atskilt av komma)\n" -#~ " -n, --loginwin ikke logg inn automatisk, men vis påloggingsvindu\n" -#~ " -u, --user=NAME bruk kontoen NAME\n" -#~ " -f, --file=FILE bruk filen FILE som konfigurasjonsfil\n" -#~ " -d, --debug skriv avlusningsinfo til stdout\n" -#~ " -v, --version vis versjonsinformasjon og avslutt\n" -#~ " -h, --help vis denne hjelpeteksten og avslutt\n" - -#~ msgid "Unable to load preferences" -#~ msgstr "Kunne ikke åpne innstillinger" - -#~ msgid "" -#~ "Gaim was not able to load your preferences because they are stored in an " -#~ "old format that is no longer used. Please reconfigure your settings " -#~ "using the Preferences window." -#~ msgstr "" -#~ "Gaim kunne ikke åpne dine instillinger, da de er lagret i et gammelt " -#~ "format som ikke lenger er i bruk. Vennligst rekonfigurer dine " -#~ "instillinger ved hjelp av innstillingsvinduet" - -#~ msgid "Slightly less boring default" -#~ msgstr "kjedelig standardsvar" - -#~ msgid "Available for friends only" -#~ msgstr "Tilgjengelig bare for venner" - -#~ msgid "Away for friends only" -#~ msgstr "Borte bare for venner" - -#~ msgid "Invisible for friends only" -#~ msgstr "Usynlig bare for venner" - -#~ msgid "Error while writing to socket." -#~ msgstr "Feil under skriving til socket." - -#~ msgid "Authentication failed." -#~ msgstr "Autentisering feilet." - -#~ msgid "Unknown Error Code." -#~ msgstr "Ukjent feilkode." - -#~ msgid "Balancer handshake" -#~ msgstr "Finner ledig tjener" - -#~ msgid "Reading server key" -#~ msgstr "Leser tjenernøkkel" - -#~ msgid "Exchanging key hash" -#~ msgstr "Utveksler nøkkel-hash" - -#~ msgid "Critical error in GG library\n" -#~ msgstr "Kritisk feil i GG-biblioteket\n" - -#~ msgid "Unable to ping server" -#~ msgstr "Kunne ikke pinge tjener" - -#~ msgid "Send as message" -#~ msgstr "Send som beskjed" - -#~ msgid "Looking up GG server" -#~ msgstr "Søker etter GG-tjener" - -#~ msgid "Invalid Gadu-Gadu UIN specified" -#~ msgstr "Ugyldig Gadu-Gadu UIN oppgitt" - -#~ msgid "You are trying to send a message to an invalid Gadu-Gadu UIN." -#~ msgstr "Du prøver å sende en beskjed til et ugyldig Gadu-Gadu UIN." - -#~ msgid "Couldn't get search results" -#~ msgstr "Kunne ikke laste ned søkeresultater" - -#~ msgid "Sex" -#~ msgstr "Kjønn" - -#~ msgid "Couldn't Import Buddy List from Server" -#~ msgstr "Kunne ikke importere kontaktliste fra tjeneren" - -#~ msgid "Buddy List successfully transferred to Gadu-Gadu server" -#~ msgstr "Kontaktlisten ble overført til Gadu-Gadu-tjeneren" - -#~ msgid "Couldn't transfer Buddy List to Gadu-Gadu server" -#~ msgstr "Kunne ikke overføre kontaktlisten til Gadu-Gadu-tjeneren" - -#~ msgid "Buddy List successfully deleted from Gadu-Gadu server" -#~ msgstr "Kontaktlisten ble slettet fra Gadu-Gadu-tjeneren" - -#~ msgid "Couldn't delete Buddy List from Gadu-Gadu server" -#~ msgstr "Kunne ikke slette kontaktlisten fra Gadu-Gadu-tjeneren" - -#~ msgid "Password couldn't be changed" -#~ msgstr "Passordet kunne ikke endres" - -#~ msgid "Error communicating with Gadu-Gadu server" -#~ msgstr "Feil i kommunikasjonen med Gadu-Gadu-tjeneren" - -#~ msgid "" -#~ "Gaim was unable to complete your request due to a problem communicating " -#~ "with the Gadu-Gadu HTTP server. Please try again later." -#~ msgstr "" -#~ "Gaim kunne ikke fullføre oppgaven på grunn av kommunikasjonsproblemer med " -#~ "Gadu-Gadu-HTTP-tjeneren. Vennligst forsøk igjen senere." - -#~ msgid "Unable to import Gadu-Gadu buddy list" -#~ msgstr "Kunne ikke importere Gadu-Gadu-kontaktliste" - -#~ msgid "" -#~ "Gaim was unable to connect to the Gadu-Gadu buddy list server. Please " -#~ "try again later." -#~ msgstr "" -#~ "Gaim kunne ikke koble til kontaktliste-tjeneren for Gadu-Gadu. Vennligst " -#~ "forsøk igjen senere." - -#~ msgid "" -#~ "Gaim was unable to connect to the buddy list server. Please try again " -#~ "later." -#~ msgstr "" -#~ "Gaim kunne ikke koble til kontaktliste-tjeneren. Vennligst forsøk igjen " -#~ "senere." - -#~ msgid "Unable to delete Gadu-Gadu buddy list" -#~ msgstr "Kunne ikke slette kontaktliste for Gadu-Gadu" - -#~ msgid "Unable to access directory" -#~ msgstr "Fikk ikke tilgang til katalogen" - -#~ msgid "" -#~ "Gaim was unable to search the Directory because it was unable to connect " -#~ "to the directory server. Please try again later." -#~ msgstr "" -#~ "Gaim kunne ikke søke i katalogen fordi den ikke fikk kontakt med " -#~ "katalogtjeneren. Vennligst prøv igjen senere." - -#~ msgid "" -#~ "Gaim was unable to change your password due to an error connecting to the " -#~ "Gadu-Gadu server. Please try again later." -#~ msgstr "" -#~ "Gaim fikk ikke kontakt med Gadu-Gadu-tjeneren og kunne ikke endre " -#~ "passordet ditt. Vennligst forsøk igjen senere." - -#~ msgid "Directory Search" -#~ msgstr "Katalogsøk" - -#~ msgid "Unable to access user profile." -#~ msgstr "Fikk ikke tilgang til brukerprofilen." - -#~ msgid "" -#~ "Gaim was unable to access this user's profile due to an error connecting " -#~ "to the directory server. Please try again later." -#~ msgstr "" -#~ "Gaim kunne ikke lese brukerprofilen på grunn av tilkoblingsproblemer mot " -#~ "katalogtjeneren. Vennligst forsøk igjen senere." - -#~ msgid "Gaim encountered an error communicating with the ICQ server." -#~ msgstr "Det oppstod en feil i kommunikasjonen med ICQ-tjeneren." - -#~ msgid "The user %s (%s%s%s%s%s) wants you to authorize them." -#~ msgstr "Brukeren %s (%s%s%s%s%s) ønsker å bli godkjent av deg." - -#~ msgid "Send message through server" -#~ msgstr "Send beskjed gjennom tjener" - -#~ msgid "Nick:" -#~ msgstr "Kallenavn:" - -#~ msgid "Gaim User" -#~ msgstr "Gaim-bruker" - -#~ msgid "File Transfer Aborted" -#~ msgstr "Filoverføring avbrutt" - -#~ msgid "Buddy Information for %s" -#~ msgstr "Kontaktinformasjon for %s" - -#~ msgid "Invalid nickname '%s'" -#~ msgstr "Ugyldig brukernavn '%s'" - -#~ msgid "Jabber Profile" -#~ msgstr "Jabber-profil" - -# -#~ msgid "Roomlist Error" -#~ msgstr "Feil ved liste over rom" - -#~ msgid "The user %s wants to add you to their buddy list." -#~ msgstr "Brukeren %s vil legge deg til i sin kontaktliste." - -#~ msgid "Display conversation closed notices" -#~ msgstr "Vis advasler om at samtalen har blitt lukket" - -#~ msgid "The conversation has become inactive and timed out." -#~ msgstr "Samtalen har blitt avsluttet pga. inaktivitet." - -#~ msgid "" -#~ "You were disconnected from the server, because you logged on from a " -#~ "different location" -#~ msgstr "Du ble logget av fordi du har logget på et annet sted." - -#, fuzzy -#~ msgid "User Properties" -#~ msgstr "Brukervalg" - -#, fuzzy -#~ msgid "Transfer of file %s timed out." -#~ msgstr "Overføring av filen %s er ferdig." - -#~ msgid "" -#~ "You have been disconnected because you have signed on with this screen " -#~ "name at another location." -#~ msgstr "" -#~ "Du ble logget av fordi du har logget på med dette skjermnavnet et annet " -#~ "sted." - -# Gammel "uventet", kansje bedre? -#, fuzzy -#~ msgid "Not specified" -#~ msgstr "Ikke spesifisert" - -#~ msgid "ICQ Info for %s" -#~ msgstr "ICQ-info for %s" - -#~ msgid "" -#~ "Error 0x%04x: Unable to format screen name because the requested screen " -#~ "name ends in a space." -#~ msgstr "" -#~ "Feil 0x%04x: Kunne ikke formatere skjermnavnet fordi det forespurte " -#~ "skjermnavnet slutter med et mellomrom." - -#~ msgid "I'm doing work and hoping for a distraction--IM me!" -#~ msgstr "Jeg jobber og håper at noen skal forstyrre - send meg en beskjed!" - -#~ msgid "Set Available Message..." -#~ msgstr "Sett tilstedebeskjed..." - -#~ msgid "Failed to leave channel" -#~ msgstr "Kunne ikke forlate kanalen" - -#~ msgid "Basic Profile" -#~ msgstr "Grunnleggende profil" - -#~ msgid "AIM" -#~ msgstr "AIM" - -#~ msgid "ICQ UIN" -#~ msgstr "ICQ UIN" - -#~ msgid "MSN" -#~ msgstr "MSN" - -#~ msgid "Yahoo" -#~ msgstr "Yahoo" - -#~ msgid "I'm From" -#~ msgstr "Jeg er fra" - -#~ msgid "Set your Trepia profile data." -#~ msgstr "Skriv inn data i din Trepia-profil." - -#~ msgid "Visit Homepage" -#~ msgstr "Besøk hjemmeside" - -#~ msgid "Local Users" -#~ msgstr "Lokale brukere" - -#~ msgid "Trepia Protocol Plugin" -#~ msgstr "Trepia-protokolltillegg" - -#~ msgid "" -#~ "You have been logged off as you have logged in on a different machine or " -#~ "device." -#~ msgstr "Du har blitt logget av, da du har logget inn et annet sted" - -#~ msgid "Please enter your password" -#~ msgstr "Skriv inn passord" - -#~ msgid "%s logged in." -#~ msgstr "%s logget inn." - -#~ msgid "%s logged out." -#~ msgstr "%s logget ut." - -#~ msgid "" -#~ "%s has just been warned by %s.\n" -#~ "Your new warning level is %d%%" -#~ msgstr "" -#~ "%s har blitt advart av %s.\n" -#~ "Ditt nye advarselsnivå er %d%%" - -#~ msgid "an anonymous person" -#~ msgstr "en anonym person" - -#~ msgid "" -#~ "%s has invited %s to the chat room %s:\n" -#~ "%s" -#~ msgstr "" -#~ "Brukeren '%s' inviterer %s til samtalerom: '%s'\n" -#~ "%s" - -#~ msgid "Sorry, I ran out for a bit!" -#~ msgstr "Borte litt, tilbake om en stund!" - -#~ msgid "" -#~ "Unable to guess the image type based on the file extension supplied. " -#~ "Defaulting to PNG." -#~ msgstr "" -#~ "Gaim kunne ikke gjette bildetypen ut fra filtypen (siste del av " -#~ "filnavnet). Antar PNG-format." - -#~ msgid "SILC Public Key" -#~ msgstr "SILC offentlig nøkkel" - -#~ msgid "SILC Private Key" -#~ msgstr "SILC privat nøkkel" +msgstr "Dette tillegget er kjekt å ha for debugging av XMPP servere og klienter." + diff -r f182cf94145c -r 00eaff9396ec po/stats.pl --- a/po/stats.pl Sun Jan 13 00:29:56 2008 +0000 +++ b/po/stats.pl Wed Feb 06 03:35:04 2008 +0000 @@ -1,4 +1,4 @@ -#!/usr/bin/perl +#!/usr/bin/env perl # Copyright 2003-2005 Nathan Walp #