First commit
This commit is contained in:
1
clickable_nicknames/__init__.py
Normal file
1
clickable_nicknames/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
from clickable_nicknames import ClickableNicknames
|
||||||
137
clickable_nicknames/clickable_nicknames.py
Normal file
137
clickable_nicknames/clickable_nicknames.py
Normal file
@@ -0,0 +1,137 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import gtk
|
||||||
|
from string import rstrip
|
||||||
|
from string import lstrip
|
||||||
|
|
||||||
|
from common import gajim
|
||||||
|
from plugins import GajimPlugin
|
||||||
|
from plugins.helpers import log_calls, log
|
||||||
|
|
||||||
|
|
||||||
|
class ClickableNicknames(GajimPlugin):
|
||||||
|
name = u'Clickable Nicknames'
|
||||||
|
short_name = u'clickable_nicknames'
|
||||||
|
version = u'0.1'
|
||||||
|
description = _(u'''Clickable nicknames in the conversation textview.''')
|
||||||
|
authors = [u'Denis Fomin <fominde@gmail.com>']
|
||||||
|
|
||||||
|
homepage = u'http://bitbucket.org/dicson12/plugins/src/tip/clickable_nicknames/'
|
||||||
|
|
||||||
|
@log_calls('ClickableNicknamesPlugin')
|
||||||
|
def init(self):
|
||||||
|
self.config_dialog = None#ClickableNicknamesPluginConfigDialog(self)
|
||||||
|
self.gui_extension_points = {
|
||||||
|
'chat_control_base' : (self.connect_with_chat_control,
|
||||||
|
self.disconnect_from_chat_control)}
|
||||||
|
|
||||||
|
self.is_active = None
|
||||||
|
self.gc_controls = {}
|
||||||
|
|
||||||
|
self.tag_names = []
|
||||||
|
colors = gajim.config.get('gc_nicknames_colors')
|
||||||
|
colors = colors.split(':')
|
||||||
|
for i, color in enumerate(colors):
|
||||||
|
tagname = 'gc_nickname_color_' + str(i)
|
||||||
|
self.tag_names.append(tagname)
|
||||||
|
|
||||||
|
@log_calls('ClickableNicknamesPlugin')
|
||||||
|
def activate(self):
|
||||||
|
for gc_control in gajim.interface.msg_win_mgr.get_controls('gc'):
|
||||||
|
# TODO support minimized groupchat
|
||||||
|
if gc_control not in self.gc_controls.keys():
|
||||||
|
control = Base(self, gc_control)
|
||||||
|
self.gc_controls[gc_control] = control
|
||||||
|
else:
|
||||||
|
self.gc_controls[gc_control].connect_signals()
|
||||||
|
self.is_active = True
|
||||||
|
|
||||||
|
@log_calls('ClickableNicknamesPlugin')
|
||||||
|
def deactivate(self):
|
||||||
|
for control in self.gc_controls.keys():
|
||||||
|
self.gc_controls[control].disconnect_from_chat_control()
|
||||||
|
self.gc_controls.clear()
|
||||||
|
self.is_active = None
|
||||||
|
|
||||||
|
@log_calls('ClickableNicknamesPlugin')
|
||||||
|
def connect_with_chat_control(self, chat_control):
|
||||||
|
if chat_control.widget_name != 'groupchat_control':
|
||||||
|
return
|
||||||
|
if self.is_active:
|
||||||
|
control = Base(self, chat_control)
|
||||||
|
self.gc_controls[chat_control] = control
|
||||||
|
|
||||||
|
@log_calls('ClickableNicknamesPlugin')
|
||||||
|
def disconnect_from_chat_control(self, chat_control):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class Base(object):
|
||||||
|
def __init__(self, plugin, chat_control):
|
||||||
|
self.plugin = plugin
|
||||||
|
self.chat_control = chat_control
|
||||||
|
self.textview = self.chat_control.conv_textview
|
||||||
|
self.tags_id = []
|
||||||
|
self.change_cursor = False
|
||||||
|
self.connect_signals()
|
||||||
|
|
||||||
|
def connect_signals(self):
|
||||||
|
# connect signals with textbuffer tags
|
||||||
|
self.tag_names = self.plugin.tag_names
|
||||||
|
tag_table = self.textview.tv.get_buffer().get_tag_table()
|
||||||
|
for name in self.tag_names:
|
||||||
|
tag = tag_table.lookup(name)
|
||||||
|
if tag:
|
||||||
|
id_ = tag.connect('event', self.insert_nick, name)
|
||||||
|
self.chat_control.handlers[id_] = tag
|
||||||
|
self.tags_id.append((id_, tag))
|
||||||
|
|
||||||
|
self.id_ = self.textview.tv.connect('motion_notify_event',
|
||||||
|
self.on_textview_motion_notify_event)
|
||||||
|
self.chat_control.handlers[self.id_] = self.textview.tv
|
||||||
|
|
||||||
|
def on_textview_motion_notify_event(self, widget, event):
|
||||||
|
# change cursor on the nicks
|
||||||
|
pointer_x, pointer_y = self.textview.tv.window.get_pointer()[0:2]
|
||||||
|
x, y = self.textview.tv.window_to_buffer_coords(gtk.TEXT_WINDOW_TEXT,
|
||||||
|
pointer_x, pointer_y)
|
||||||
|
tags = self.textview.tv.get_iter_at_location(x, y).get_tags()
|
||||||
|
tag_table = self.textview.tv.get_buffer().get_tag_table()
|
||||||
|
if self.change_cursor:
|
||||||
|
self.textview.tv.get_window(gtk.TEXT_WINDOW_TEXT).set_cursor(
|
||||||
|
gtk.gdk.Cursor(gtk.gdk.XTERM))
|
||||||
|
self.change_cursor = False
|
||||||
|
for tag in tags:
|
||||||
|
if tag in [x[1] for x in self.tags_id]:
|
||||||
|
self.textview.tv.get_window(gtk.TEXT_WINDOW_TEXT).set_cursor(
|
||||||
|
gtk.gdk.Cursor(gtk.gdk.HAND2))
|
||||||
|
self.change_cursor = True
|
||||||
|
self.textview.on_textview_motion_notify_event(widget, event)
|
||||||
|
|
||||||
|
def insert_nick(self, texttag, widget, event, iter_, kind):
|
||||||
|
# insert nickname to message buffer
|
||||||
|
if event.type == gtk.gdk.BUTTON_PRESS and event.button == 1:
|
||||||
|
# left mouse button clicked
|
||||||
|
begin_iter = iter_.copy()
|
||||||
|
# we get the begining of the tag
|
||||||
|
while not begin_iter.begins_tag(texttag):
|
||||||
|
begin_iter.backward_char()
|
||||||
|
end_iter = iter_.copy()
|
||||||
|
# we get the end of the tag
|
||||||
|
while not end_iter.ends_tag(texttag):
|
||||||
|
end_iter.forward_char()
|
||||||
|
buffer_ = self.textview.tv.get_buffer()
|
||||||
|
word = buffer_.get_text(begin_iter, end_iter).decode('utf-8')
|
||||||
|
nick = word.rstrip().rstrip(gajim.config.get('after_nickname'))
|
||||||
|
nick = nick.lstrip(gajim.config.get('before_nickname'))
|
||||||
|
nick = nick + gajim.config.get('gc_refer_to_nick_char') + ' '
|
||||||
|
message_buffer = self.chat_control.msg_textview.get_buffer()
|
||||||
|
message_buffer.insert_at_cursor(nick)
|
||||||
|
self.chat_control.msg_textview.grab_focus()
|
||||||
|
|
||||||
|
def disconnect_from_chat_control(self):
|
||||||
|
# disconnect signals from textbuffer tags
|
||||||
|
for item in self.tags_id:
|
||||||
|
if item[1].handler_is_connected(item[0]):
|
||||||
|
item[1].disconnect(item[0])
|
||||||
|
if self.textview.tv.handler_is_connected(self.id_):
|
||||||
|
self.textview.tv.disconnect(self.id_)
|
||||||
1
juick/__init__.py
Normal file
1
juick/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
from plugin import JuickPlugin
|
||||||
504
juick/config_dialog.ui
Normal file
504
juick/config_dialog.ui
Normal file
@@ -0,0 +1,504 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<interface>
|
||||||
|
<requires lib="gtk+" version="2.16"/>
|
||||||
|
<!-- interface-naming-policy toplevel-contextual -->
|
||||||
|
<object class="GtkWindow" id="window1">
|
||||||
|
<child>
|
||||||
|
<object class="GtkVBox" id="vbox1">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="orientation">vertical</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkCheckButton" id="checkbutton">
|
||||||
|
<property name="label" translatable="yes">Show avatars in messages</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="receives_default">False</property>
|
||||||
|
<property name="draw_indicator">True</property>
|
||||||
|
<signal name="toggled" handler="on_checkbutton_toggled"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">False</property>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkVBox" id="vbox3">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="orientation">vertical</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkCheckButton" id="only_author_avatar">
|
||||||
|
<property name="label" translatable="yes">Show avatar of post author only</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="receives_default">False</property>
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
<property name="draw_indicator">True</property>
|
||||||
|
<signal name="toggled" handler="on_only_author_ava_toggled"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">False</property>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkHBox" id="hbox1">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="avatar_size_lebel">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="xalign">0.029999999329447746</property>
|
||||||
|
<property name="label" translatable="yes">Avatar size</property>
|
||||||
|
<property name="ellipsize">start</property>
|
||||||
|
<property name="track_visited_links">False</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkSpinButton" id="avatar_size">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<property name="width_chars">6</property>
|
||||||
|
<property name="snap_to_ticks">True</property>
|
||||||
|
<property name="numeric">True</property>
|
||||||
|
<signal name="value_changed" handler="avatar_size_value_changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">False</property>
|
||||||
|
<property name="position">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">False</property>
|
||||||
|
<property name="position">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="position">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkCheckButton" id="show_pic">
|
||||||
|
<property name="label" translatable="yes">Show juick picture preview</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="receives_default">False</property>
|
||||||
|
<property name="draw_indicator">True</property>
|
||||||
|
<signal name="toggled" handler="on_show_pic_toggled"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">False</property>
|
||||||
|
<property name="position">2</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkHBox" id="hbox2">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="preview_size_lebel">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="xalign">0.029999999329447746</property>
|
||||||
|
<property name="label" translatable="yes">Preview size</property>
|
||||||
|
<property name="ellipsize">start</property>
|
||||||
|
<property name="track_visited_links">False</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkSpinButton" id="preview_size">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="has_tooltip">True</property>
|
||||||
|
<property name="tooltip_text" translatable="yes">Preview size(10-512)</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<property name="width_chars">6</property>
|
||||||
|
<property name="snap_to_ticks">True</property>
|
||||||
|
<property name="numeric">True</property>
|
||||||
|
<signal name="value_changed" handler="preview_size_value_changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">False</property>
|
||||||
|
<property name="position">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">False</property>
|
||||||
|
<property name="position">3</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkHBox" id="hbox3">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="label1">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="xalign">0.029999999329447746</property>
|
||||||
|
<property name="label" translatable="yes">Juick link color</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkColorButton" id="link_colorbutton">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="receives_default">True</property>
|
||||||
|
<property name="has_tooltip">True</property>
|
||||||
|
<property name="tooltip_text" translatable="yes">Juick link color</property>
|
||||||
|
<property name="color">#000000000000</property>
|
||||||
|
<signal name="color_set" handler="on_link_colorbutton_color_set"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">False</property>
|
||||||
|
<property name="pack_type">end</property>
|
||||||
|
<property name="position">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">False</property>
|
||||||
|
<property name="position">4</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkTable" id="table1">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="border_width">1</property>
|
||||||
|
<property name="n_rows">13</property>
|
||||||
|
<property name="n_columns">2</property>
|
||||||
|
<property name="column_spacing">2</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="menuitem1">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="menuitem_changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="top_attach">3</property>
|
||||||
|
<property name="bottom_attach">4</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkCheckButton" id="show_tag_button">
|
||||||
|
<property name="label" translatable="yes">Show juick tag button</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="receives_default">False</property>
|
||||||
|
<property name="draw_indicator">True</property>
|
||||||
|
<signal name="toggled" handler="on_show_tag_button_toggled"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="right_attach">2</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="label2">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
<property name="label" translatable="yes">menuitem name:</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="top_attach">2</property>
|
||||||
|
<property name="bottom_attach">3</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="label3">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
<property name="label" translatable="yes">text will be inserted:</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">1</property>
|
||||||
|
<property name="right_attach">2</property>
|
||||||
|
<property name="top_attach">2</property>
|
||||||
|
<property name="bottom_attach">3</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="menuitem_text1">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="menuitem_changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">1</property>
|
||||||
|
<property name="right_attach">2</property>
|
||||||
|
<property name="top_attach">3</property>
|
||||||
|
<property name="bottom_attach">4</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="label4">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="label" translatable="yes">Juick tag button menu options:</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="right_attach">2</property>
|
||||||
|
<property name="top_attach">1</property>
|
||||||
|
<property name="bottom_attach">2</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="menuitem2">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="menuitem_changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="top_attach">4</property>
|
||||||
|
<property name="bottom_attach">5</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="menuitem3">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="menuitem_changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="top_attach">5</property>
|
||||||
|
<property name="bottom_attach">6</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="menuitem4">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="menuitem_changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="top_attach">6</property>
|
||||||
|
<property name="bottom_attach">7</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="menuitem5">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="menuitem_changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="top_attach">7</property>
|
||||||
|
<property name="bottom_attach">8</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="menuitem6">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="menuitem_changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="top_attach">8</property>
|
||||||
|
<property name="bottom_attach">9</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="menuitem7">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="menuitem_changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="top_attach">9</property>
|
||||||
|
<property name="bottom_attach">10</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="menuitem8">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="menuitem_changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="top_attach">10</property>
|
||||||
|
<property name="bottom_attach">11</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="menuitem9">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="menuitem_changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="top_attach">11</property>
|
||||||
|
<property name="bottom_attach">12</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="menuitem10">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="menuitem_changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="top_attach">12</property>
|
||||||
|
<property name="bottom_attach">13</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="menuitem_text2">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="menuitem_changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">1</property>
|
||||||
|
<property name="right_attach">2</property>
|
||||||
|
<property name="top_attach">4</property>
|
||||||
|
<property name="bottom_attach">5</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="menuitem_text3">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="menuitem_changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">1</property>
|
||||||
|
<property name="right_attach">2</property>
|
||||||
|
<property name="top_attach">5</property>
|
||||||
|
<property name="bottom_attach">6</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="menuitem_text4">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="menuitem_changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">1</property>
|
||||||
|
<property name="right_attach">2</property>
|
||||||
|
<property name="top_attach">6</property>
|
||||||
|
<property name="bottom_attach">7</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="menuitem_text5">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="menuitem_changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">1</property>
|
||||||
|
<property name="right_attach">2</property>
|
||||||
|
<property name="top_attach">7</property>
|
||||||
|
<property name="bottom_attach">8</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="menuitem_text6">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="menuitem_changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">1</property>
|
||||||
|
<property name="right_attach">2</property>
|
||||||
|
<property name="top_attach">8</property>
|
||||||
|
<property name="bottom_attach">9</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="menuitem_text7">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="menuitem_changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">1</property>
|
||||||
|
<property name="right_attach">2</property>
|
||||||
|
<property name="top_attach">9</property>
|
||||||
|
<property name="bottom_attach">10</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="menuitem_text8">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="menuitem_changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">1</property>
|
||||||
|
<property name="right_attach">2</property>
|
||||||
|
<property name="top_attach">10</property>
|
||||||
|
<property name="bottom_attach">11</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="menuitem_text9">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="menuitem_changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">1</property>
|
||||||
|
<property name="right_attach">2</property>
|
||||||
|
<property name="top_attach">11</property>
|
||||||
|
<property name="bottom_attach">12</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="menuitem_text10">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="menuitem_changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">1</property>
|
||||||
|
<property name="right_attach">2</property>
|
||||||
|
<property name="top_attach">12</property>
|
||||||
|
<property name="bottom_attach">13</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="padding">6</property>
|
||||||
|
<property name="position">5</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</interface>
|
||||||
BIN
juick/favicon.png
Normal file
BIN
juick/favicon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 641 B |
BIN
juick/juick_tag_button.png
Normal file
BIN
juick/juick_tag_button.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 723 B |
BIN
juick/locales/ru/LC_MESSAGES/JuickPlugin.mo
Normal file
BIN
juick/locales/ru/LC_MESSAGES/JuickPlugin.mo
Normal file
Binary file not shown.
637
juick/plugin.py
Normal file
637
juick/plugin.py
Normal file
@@ -0,0 +1,637 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import gtk
|
||||||
|
import pango
|
||||||
|
import re
|
||||||
|
import os
|
||||||
|
import time
|
||||||
|
import gettext
|
||||||
|
import locale
|
||||||
|
import urllib
|
||||||
|
from string import upper
|
||||||
|
from string import rstrip
|
||||||
|
|
||||||
|
from common import helpers
|
||||||
|
from common import gajim
|
||||||
|
from plugins import GajimPlugin
|
||||||
|
from plugins.helpers import log_calls, log
|
||||||
|
from plugins.gui import GajimPluginConfigDialog
|
||||||
|
from conversation_textview import TextViewImage
|
||||||
|
import gtkgui_helpers
|
||||||
|
import common.xmpp
|
||||||
|
|
||||||
|
locale_path = os.path.join(os.path.dirname(__file__), 'locales')
|
||||||
|
if os.name != 'nt':
|
||||||
|
locale.bindtextdomain('JuickPlugin', locale_path)
|
||||||
|
|
||||||
|
try:
|
||||||
|
gett = gettext.Catalog('JuickPlugin', locale_path)
|
||||||
|
_ = gett.gettext
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
class JuickPlugin(GajimPlugin):
|
||||||
|
name = u'Juick'
|
||||||
|
short_name = u'Juick'
|
||||||
|
version = u'0.2'
|
||||||
|
description = _(u'''Clickable juick links , juick nics, preview juick picturs.
|
||||||
|
The key combination alt + up in the textbox allow insert the number of last message (comment or topic).''')
|
||||||
|
authors = [u'Denis Fomin <fominde@gmail.com>', u'evgen <drujebober@gmail.com>']
|
||||||
|
|
||||||
|
homepage = u'http://bitbucket.org/dicson12/plugins/src/tip/juick/'
|
||||||
|
|
||||||
|
@log_calls('JuickPlugin')
|
||||||
|
def init(self):
|
||||||
|
self.config_dialog = JuickPluginConfigDialog(self)
|
||||||
|
self.gui_extension_points = {
|
||||||
|
'chat_control_base' : (self.connect_with_chat_control,
|
||||||
|
self.disconnect_from_chat_control)
|
||||||
|
}
|
||||||
|
self.config_default_values = {'SHOW_AVATARS': (False,''),
|
||||||
|
'AVATAR_SIZE': (20, _('Avatar size(10-32)')),
|
||||||
|
'SHOW_PREVIEW': (False,''),
|
||||||
|
'PREVIEW_SIZE': (150, _('Preview size(10-512)')),
|
||||||
|
'LINK_COLOR' : ('#B8833E', _('Juick link color')),
|
||||||
|
'SHOW_TAG_BUTTON': (True,''),
|
||||||
|
'ONLY_AUTHOR_AVATAR':(True,''),
|
||||||
|
'MENUITEM1': ('tune',''), 'MENUITEM_TEXT1': ('*tune',''),
|
||||||
|
'MENUITEM2': ('geo',''), 'MENUITEM_TEXT2': ('*geo',''),
|
||||||
|
'MENUITEM3': ('gajim',''), 'MENUITEM_TEXT3': ('*gajim',''),
|
||||||
|
'MENUITEM4': ('me',''), 'MENUITEM_TEXT4': ('/me',''),
|
||||||
|
'MENUITEM5': ('',''), 'MENUITEM_TEXT5': ('',''),
|
||||||
|
'MENUITEM6': ('',''), 'MENUITEM_TEXT6': ('',''),
|
||||||
|
'MENUITEM7': ('',''), 'MENUITEM_TEXT7': ('',''),
|
||||||
|
'MENUITEM8': ('',''), 'MENUITEM_TEXT8': ('',''),
|
||||||
|
'MENUITEM9': ('',''), 'MENUITEM_TEXT9': ('',''),
|
||||||
|
'MENUITEM10': ('',''), 'MENUITEM_TEXT10': ('',''),}
|
||||||
|
self.chat_control = None
|
||||||
|
self.controls = []
|
||||||
|
self.cache_path = os.path.join(gajim.AVATAR_PATH, 'juick')
|
||||||
|
if not os.path.isdir(self.cache_path):
|
||||||
|
os.makedirs(self.cache_path)
|
||||||
|
|
||||||
|
@log_calls('JuickPlugin')
|
||||||
|
def activate(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@log_calls('JuickPlugin')
|
||||||
|
def deactivate(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@log_calls('JuickPlugin')
|
||||||
|
def connect_with_chat_control(self, chat_control):
|
||||||
|
if chat_control.contact.jid != 'juick@juick.com':
|
||||||
|
return
|
||||||
|
|
||||||
|
self.chat_control = chat_control
|
||||||
|
control = Base(self, self.chat_control)
|
||||||
|
self.controls.append(control)
|
||||||
|
|
||||||
|
@log_calls('JuickPlugin')
|
||||||
|
def disconnect_from_chat_control(self, chat_control):
|
||||||
|
for control in self.controls:
|
||||||
|
control.disconnect_from_chat_control()
|
||||||
|
self.controls = []
|
||||||
|
|
||||||
|
|
||||||
|
class Base(object):
|
||||||
|
def __init__(self, plugin, chat_control):
|
||||||
|
self.last_juick_num = ''
|
||||||
|
self.plugin = plugin
|
||||||
|
self.chat_control = chat_control
|
||||||
|
self.textview = self.chat_control.conv_textview
|
||||||
|
self.change_cursor = False
|
||||||
|
|
||||||
|
id_ = self.textview.tv.connect('button_press_event',
|
||||||
|
self.on_textview_button_press_event, self.textview)
|
||||||
|
chat_control.handlers[id_] = self.textview.tv
|
||||||
|
|
||||||
|
id_ = self.chat_control.msg_textview.connect('key_press_event',
|
||||||
|
self.mykeypress_event)
|
||||||
|
chat_control.handlers[id_] = self.chat_control.msg_textview
|
||||||
|
|
||||||
|
self.id_ = self.textview.tv.connect('motion_notify_event',
|
||||||
|
self.on_textview_motion_notify_event)
|
||||||
|
self.chat_control.handlers[self.id_] = self.textview.tv
|
||||||
|
|
||||||
|
# new buffer tags
|
||||||
|
color = self.plugin.config['LINK_COLOR']
|
||||||
|
buffer_ = self.textview.tv.get_buffer()
|
||||||
|
self.textview.tagSharpSlash = buffer_.create_tag('sharp_slash')
|
||||||
|
self.textview.tagSharpSlash.set_property('foreground', color)
|
||||||
|
self.textview.tagSharpSlash.set_property('underline',
|
||||||
|
pango.UNDERLINE_SINGLE)
|
||||||
|
id_ = self.textview.tagSharpSlash.connect('event',
|
||||||
|
self.juick_hyperlink_handler, 'sharp_slash')
|
||||||
|
chat_control.handlers[id_] = self.textview.tagSharpSlash
|
||||||
|
|
||||||
|
self.textview.tagJuickNick = buffer_.create_tag('juick_nick')
|
||||||
|
self.textview.tagJuickNick.set_property('foreground', color)
|
||||||
|
self.textview.tagJuickNick.set_property('underline',
|
||||||
|
pango.UNDERLINE_SINGLE)
|
||||||
|
id_ = self.textview.tagJuickNick.connect('event',
|
||||||
|
self.juick_hyperlink_handler, 'juick_nick')
|
||||||
|
chat_control.handlers[id_] = self.textview.tagJuickNick
|
||||||
|
self.textview.tagJuickPic = buffer_.create_tag('juick_pic')
|
||||||
|
|
||||||
|
self.create_patterns()
|
||||||
|
self.create_link_menu()
|
||||||
|
self.create_tag_menu()
|
||||||
|
self.create_buttons()
|
||||||
|
|
||||||
|
self.old_print_special_text = self.textview.print_special_text
|
||||||
|
self.textview.print_special_text = self.print_special_text
|
||||||
|
|
||||||
|
def create_patterns(self):
|
||||||
|
self.juick_post_uid = self.juick_nick = ''
|
||||||
|
self.juick_post_re = re.compile(r'#(\d+)')
|
||||||
|
self.juick_post_comment_re = re.compile(r'#(\d+)/(\d+)')
|
||||||
|
sharp_slash = r'#\d+(\/\d+)?'
|
||||||
|
if self.plugin.config['ONLY_AUTHOR_AVATAR']:
|
||||||
|
juick_nick = r'@[a-zA-Z0-9_@\.-]+:'
|
||||||
|
else:
|
||||||
|
juick_nick = r'@[a-zA-Z0-9_@:\.-]+'
|
||||||
|
juick_pic = r'http://i\.juick\.com/p/\d+\.jpg|http://i\.juick\.com/p/\d+\.JPG'
|
||||||
|
interface = gajim.interface
|
||||||
|
interface.sharp_slash_re = re.compile(sharp_slash)
|
||||||
|
self.juick_nick_re = interface.juick_nick_re = re.compile(juick_nick)
|
||||||
|
self.juick_pic_re = interface.juick_pic_re = re.compile(juick_pic)
|
||||||
|
juick_pattern = '|' + sharp_slash + '|' + juick_nick + '|' + juick_pic
|
||||||
|
interface.basic_pattern = interface.basic_pattern + juick_pattern
|
||||||
|
interface.emot_and_basic = interface.emot_and_basic + juick_pattern
|
||||||
|
interface._basic_pattern_re = re.compile(interface.basic_pattern,
|
||||||
|
re.IGNORECASE)
|
||||||
|
interface._emot_and_basic_re = re.compile(interface.emot_and_basic,
|
||||||
|
re.IGNORECASE + re.UNICODE)
|
||||||
|
|
||||||
|
def create_buttons(self):
|
||||||
|
# create juick button
|
||||||
|
actions_hbox = self.chat_control.xml.get_object('actions_hbox')
|
||||||
|
self.button = gtk.Button(label=None, stock=None, use_underline=True)
|
||||||
|
self.button.set_property('relief', gtk.RELIEF_NONE)
|
||||||
|
self.button.set_property('can-focus', False)
|
||||||
|
img = gtk.Image()
|
||||||
|
img_path = self.plugin.local_file_path('favicon.png')
|
||||||
|
pixbuf = gtk.gdk.pixbuf_new_from_file(img_path)
|
||||||
|
iconset = gtk.IconSet(pixbuf=pixbuf)
|
||||||
|
factory = gtk.IconFactory()
|
||||||
|
factory.add('juick', iconset)
|
||||||
|
factory.add_default()
|
||||||
|
img.set_from_stock('juick', gtk.ICON_SIZE_BUTTON)
|
||||||
|
self.button.set_image(img)
|
||||||
|
send_button = self.chat_control.xml.get_object('send_button')
|
||||||
|
send_button_pos = actions_hbox.child_get_property(send_button, 'position')
|
||||||
|
actions_hbox.add_with_properties(self.button, 'position',
|
||||||
|
send_button_pos - 1, 'expand', False)
|
||||||
|
id_ = self.button.connect('clicked', self.on_juick_button_clicked)
|
||||||
|
self.chat_control.handlers[id_] = self.button
|
||||||
|
self.button.show()
|
||||||
|
# create juick tag button
|
||||||
|
self.tag_button = gtk.Button(label=None, stock=None, use_underline=True)
|
||||||
|
self.tag_button.set_property('relief', gtk.RELIEF_NONE)
|
||||||
|
self.tag_button.set_property('can-focus', False)
|
||||||
|
img = gtk.Image()
|
||||||
|
img_path = self.plugin.local_file_path('juick_tag_button.png')
|
||||||
|
pixbuf = gtk.gdk.pixbuf_new_from_file(img_path)
|
||||||
|
iconset = gtk.IconSet(pixbuf=pixbuf)
|
||||||
|
factory.add('juick_tag', iconset)
|
||||||
|
factory.add_default()
|
||||||
|
img.set_from_stock('juick_tag', gtk.ICON_SIZE_BUTTON)
|
||||||
|
self.tag_button.set_image(img)
|
||||||
|
actions_hbox.add_with_properties(self.tag_button, 'position',
|
||||||
|
send_button_pos - 1, 'expand', False)
|
||||||
|
id_ = self.tag_button.connect('clicked', self.on_juick_tag_button_clicked)
|
||||||
|
self.chat_control.handlers[id_] = self.tag_button
|
||||||
|
self.tag_button.set_no_show_all(True)
|
||||||
|
self.tag_button.set_property('visible',
|
||||||
|
self.plugin.config['SHOW_TAG_BUTTON'])
|
||||||
|
|
||||||
|
def create_link_menu(self):
|
||||||
|
"""
|
||||||
|
Create juick link context menu
|
||||||
|
"""
|
||||||
|
self.juick_link_menu = gtk.Menu()
|
||||||
|
|
||||||
|
item = gtk.MenuItem(_('Reply to message'))
|
||||||
|
item.connect('activate', self.on_reply)
|
||||||
|
self.juick_link_menu.append(item)
|
||||||
|
|
||||||
|
menuitems = ((_('Unsubscribe from comments'), 'U #WORD'),
|
||||||
|
(_('Subscribe to message replies'), 'S #WORD'),
|
||||||
|
(_('Recommend post'), '! #WORD'),
|
||||||
|
(_('Show message with replies'), '#WORD+'),
|
||||||
|
(_('Delete post'), 'D #WORD'),)
|
||||||
|
for menuitem in menuitems:
|
||||||
|
item = gtk.MenuItem(menuitem[0])
|
||||||
|
item.connect('activate', self.send, menuitem[1])
|
||||||
|
self.juick_link_menu.append(item)
|
||||||
|
|
||||||
|
item = gtk.MenuItem(_('Open in browser'))
|
||||||
|
item.connect('activate', self.open_in_browser)
|
||||||
|
self.juick_link_menu.append(item)
|
||||||
|
|
||||||
|
menuitems = ((_('Show user\'s info'), 'NICK'),
|
||||||
|
(_('Show user\'s info and last 10 messages'), 'NICK+'),
|
||||||
|
(_('Subscribe to user\'s blog'), 'S NICK'),
|
||||||
|
(_('Unsubscribe from user\'s blog'), 'U NICK'),
|
||||||
|
(_('Add/delete user to/from your blacklist'), 'BL NICK'),)
|
||||||
|
for menuitem in menuitems:
|
||||||
|
item = gtk.MenuItem(menuitem[0])
|
||||||
|
item.connect('activate', self.send, menuitem[1])
|
||||||
|
self.juick_link_menu.append(item)
|
||||||
|
|
||||||
|
item = gtk.MenuItem(_('Send personal message'))
|
||||||
|
item.connect('activate', self.on_pm)
|
||||||
|
self.juick_link_menu.append(item)
|
||||||
|
|
||||||
|
def create_tag_menu(self):
|
||||||
|
"""
|
||||||
|
Create juick tag button menu
|
||||||
|
"""
|
||||||
|
self.menu = gtk.Menu()
|
||||||
|
for num in xrange(1,11):
|
||||||
|
menuitem = self.plugin.config['MENUITEM' + str(num)]
|
||||||
|
text = self.plugin.config['MENUITEM_TEXT' + str(num)]
|
||||||
|
if menuitem == '' or text == '':
|
||||||
|
continue
|
||||||
|
item = gtk.MenuItem(menuitem)
|
||||||
|
item.connect('activate', self.on_insert, text)
|
||||||
|
self.menu.append(item)
|
||||||
|
self.menu.show_all()
|
||||||
|
|
||||||
|
def juick_hyperlink_handler(self, texttag, widget, event, iter_, kind):
|
||||||
|
# handle message links( #12345 or #12345/6) and juick nicks
|
||||||
|
if event.type == gtk.gdk.BUTTON_PRESS and event.button == 3:
|
||||||
|
# show popup menu (right mouse button clicked)
|
||||||
|
begin_iter = iter_.copy()
|
||||||
|
# we get the begining of the tag
|
||||||
|
while not begin_iter.begins_tag(texttag):
|
||||||
|
begin_iter.backward_char()
|
||||||
|
end_iter = iter_.copy()
|
||||||
|
# we get the end of the tag
|
||||||
|
while not end_iter.ends_tag(texttag):
|
||||||
|
end_iter.forward_char()
|
||||||
|
|
||||||
|
buffer_ = self.textview.tv.get_buffer()
|
||||||
|
word = buffer_.get_text(begin_iter, end_iter).decode('utf-8')
|
||||||
|
self.juick_post = word
|
||||||
|
|
||||||
|
post = self.juick_post_re.search(word)
|
||||||
|
nick = self.juick_nick_re.search(word)
|
||||||
|
if post is None and nick is None:
|
||||||
|
return
|
||||||
|
childs = self.juick_link_menu.get_children()
|
||||||
|
if post:
|
||||||
|
self.juick_post_full = gajim.interface.sharp_slash_re\
|
||||||
|
.search(word).group(0)
|
||||||
|
self.juick_post_uid = post.group(1)
|
||||||
|
for menuitem in xrange(7):
|
||||||
|
childs[menuitem].show()
|
||||||
|
for menuitem in xrange(7, 13):
|
||||||
|
childs[menuitem].hide()
|
||||||
|
if nick:
|
||||||
|
self.juick_nick = nick.group(0)
|
||||||
|
for menuitem in xrange(7):
|
||||||
|
childs[menuitem].hide()
|
||||||
|
for menuitem in xrange(7, 13):
|
||||||
|
childs[menuitem].show()
|
||||||
|
self.juick_link_menu.popup(None, None, None, event.button,
|
||||||
|
event.time)
|
||||||
|
if event.type == gtk.gdk.BUTTON_PRESS and event.button == 1:
|
||||||
|
# insert message num or nick (left mouse button clicked)
|
||||||
|
begin_iter = iter_.copy()
|
||||||
|
# we get the begining of the tag
|
||||||
|
while not begin_iter.begins_tag(texttag):
|
||||||
|
begin_iter.backward_char()
|
||||||
|
end_iter = iter_.copy()
|
||||||
|
# we get the end of the tag
|
||||||
|
while not end_iter.ends_tag(texttag):
|
||||||
|
end_iter.forward_char()
|
||||||
|
buffer_ = self.textview.tv.get_buffer()
|
||||||
|
word = buffer_.get_text(begin_iter, end_iter).decode('utf-8')
|
||||||
|
if kind == 'sharp_slash':
|
||||||
|
self.on_insert(widget, word)
|
||||||
|
if kind == 'juick_nick':
|
||||||
|
self.on_insert(widget, 'PM %s' % word.rstrip(':'))
|
||||||
|
|
||||||
|
def print_special_text(self, special_text, other_tags, graphics=True):
|
||||||
|
if gajim.interface.sharp_slash_re.match(special_text):
|
||||||
|
# insert post num #123456//
|
||||||
|
buffer_, iter_, tag = self.get_iter_and_tag('sharp_slash')
|
||||||
|
buffer_.insert_with_tags(iter_, special_text, tag)
|
||||||
|
self.last_juick_num = special_text
|
||||||
|
return
|
||||||
|
if gajim.interface.juick_nick_re.match(special_text):
|
||||||
|
# insert juick nick @nickname////
|
||||||
|
buffer_, iter_, tag = self.get_iter_and_tag('juick_nick')
|
||||||
|
mark = buffer_.create_mark(None, iter_, True)
|
||||||
|
# insert juick nick
|
||||||
|
buffer_.insert_with_tags(iter_, special_text, tag)
|
||||||
|
if not self.plugin.config['SHOW_AVATARS']:
|
||||||
|
return
|
||||||
|
# insert avatars
|
||||||
|
conn = gajim.connections[self.chat_control.account]
|
||||||
|
id_ = conn.connection.getAnID()
|
||||||
|
to = 'juick@juick.com'
|
||||||
|
iq = common.xmpp.Iq('get', to=to)
|
||||||
|
a = iq.addChild(name = 'query',
|
||||||
|
namespace = 'http://juick.com/query#users')
|
||||||
|
special_text1 = special_text[1:].rstrip(':')
|
||||||
|
a.addChild(name='user', namespace = 'http://juick.com/user',
|
||||||
|
attrs={'uname': special_text1})
|
||||||
|
iq.setID(id_)
|
||||||
|
conn.connection.SendAndCallForResponse(iq, self._on_response,
|
||||||
|
{'mark':mark, 'special_text':special_text})
|
||||||
|
return
|
||||||
|
if gajim.interface.juick_pic_re.match(special_text) and \
|
||||||
|
self.plugin.config['SHOW_PREVIEW']:
|
||||||
|
# show pics preview
|
||||||
|
buffer_, iter_, tag = self.get_iter_and_tag('url')
|
||||||
|
mark = buffer_.create_mark(None, iter_, True)
|
||||||
|
buffer_.insert_with_tags(iter_, special_text, tag)
|
||||||
|
uid = special_text.split('p/')[1]
|
||||||
|
url = "http://i.juick.com/photos-512/%s" % uid
|
||||||
|
pixbuf = self.get_pixbuf_from_url(
|
||||||
|
url, self.plugin.config['PREVIEW_SIZE'])
|
||||||
|
if pixbuf:
|
||||||
|
# insert image
|
||||||
|
buffer_ = mark.get_buffer()
|
||||||
|
end_iter = buffer_.get_iter_at_mark(mark)
|
||||||
|
anchor = buffer_.create_child_anchor(end_iter)
|
||||||
|
img = TextViewImage(anchor, special_text)
|
||||||
|
img.set_from_pixbuf(pixbuf)
|
||||||
|
img.show()
|
||||||
|
self.textview.tv.add_child_at_anchor(img, anchor)
|
||||||
|
else:
|
||||||
|
self.old_print_special_text(special_text, other_tags, graphics)
|
||||||
|
|
||||||
|
def get_iter_and_tag(self, tag_name):
|
||||||
|
buffer_ = self.textview.tv.get_buffer()
|
||||||
|
ttable = buffer_.get_tag_table()
|
||||||
|
tag = ttable.lookup(tag_name)
|
||||||
|
return buffer_, buffer_.get_end_iter(), tag
|
||||||
|
|
||||||
|
|
||||||
|
def _on_response(self, a, resp, **kwargs):
|
||||||
|
# insert avatar to text mark
|
||||||
|
mark = kwargs['mark']
|
||||||
|
buffer_ = mark.get_buffer()
|
||||||
|
end_iter = buffer_.get_iter_at_mark(mark)
|
||||||
|
tags = resp.getTag('query')
|
||||||
|
if tags:
|
||||||
|
user = tags.getTag('user')
|
||||||
|
if not user:
|
||||||
|
return
|
||||||
|
uid = user.getAttr('uid')
|
||||||
|
pixbuf = self.get_avatar(uid)
|
||||||
|
if pixbuf:
|
||||||
|
anchor = buffer_.create_child_anchor(end_iter)
|
||||||
|
tooltype_text = kwargs['special_text'][1:].rstrip(':')
|
||||||
|
img = TextViewImage(anchor, tooltype_text)
|
||||||
|
img.set_from_pixbuf(pixbuf)
|
||||||
|
img.show()
|
||||||
|
self.textview.tv.add_child_at_anchor(img, anchor)
|
||||||
|
|
||||||
|
def get_avatar(self, uid):
|
||||||
|
# search avatar in cache or download from juick.com
|
||||||
|
pic = uid + '.png'
|
||||||
|
pic_path = os.path.join(self.plugin.cache_path, pic)
|
||||||
|
pic_path = pic_path.decode(locale.getpreferredencoding())
|
||||||
|
if os.path.isfile(pic_path):
|
||||||
|
pixbuf = gtk.gdk.pixbuf_new_from_file(pic_path)
|
||||||
|
if (time.time() - os.stat(pic_path).st_mtime) < 2419200:
|
||||||
|
return pixbuf
|
||||||
|
url = 'http://i.juick.com/as/%s.png' % uid
|
||||||
|
pixbuf = self.get_pixbuf_from_url(
|
||||||
|
url, self.plugin.config['AVATAR_SIZE'])
|
||||||
|
if pixbuf:
|
||||||
|
# save to cache
|
||||||
|
pixbuf.save(pic_path, 'png')
|
||||||
|
return pixbuf
|
||||||
|
|
||||||
|
def get_pixbuf_from_url(self, url, size):
|
||||||
|
# download avatar and resize him
|
||||||
|
# Returns pixbuf or False if broken image or not connected
|
||||||
|
try:
|
||||||
|
data = urllib.urlopen(url).read()
|
||||||
|
pix = gtk.gdk.PixbufLoader()
|
||||||
|
pix.write(data)
|
||||||
|
pix.close()
|
||||||
|
pixbuf = pix.get_pixbuf()
|
||||||
|
pixbuf, w, h = self.get_pixbuf_of_size(pixbuf, size)
|
||||||
|
except:
|
||||||
|
return False
|
||||||
|
return pixbuf
|
||||||
|
|
||||||
|
def get_pixbuf_of_size(self, pixbuf, size):
|
||||||
|
# Creates a pixbuf that fits in the specified square of sizexsize
|
||||||
|
# while preserving the aspect ratio
|
||||||
|
# Returns tuple: (scaled_pixbuf, actual_width, actual_height)
|
||||||
|
image_width = pixbuf.get_width()
|
||||||
|
image_height = pixbuf.get_height()
|
||||||
|
|
||||||
|
if image_width > image_height:
|
||||||
|
if image_width > size:
|
||||||
|
image_height = int(size/float(image_width)*image_height)
|
||||||
|
image_width =int(size)
|
||||||
|
else:
|
||||||
|
if image_height > size:
|
||||||
|
image_width = int(size/float(image_height)*image_width)
|
||||||
|
image_height = int(size)
|
||||||
|
|
||||||
|
crop_pixbuf = pixbuf.scale_simple(image_width, image_height,
|
||||||
|
gtk.gdk.INTERP_BILINEAR)
|
||||||
|
return (crop_pixbuf, image_width, image_height)
|
||||||
|
|
||||||
|
def on_textview_button_press_event(self, widget, event, obj):
|
||||||
|
obj.selected_phrase = ''
|
||||||
|
|
||||||
|
if event.button != 3:
|
||||||
|
return False
|
||||||
|
|
||||||
|
x, y = obj.tv.window_to_buffer_coords(gtk.TEXT_WINDOW_TEXT,
|
||||||
|
int(event.x), int(event.y))
|
||||||
|
iter_ = obj.tv.get_iter_at_location(x, y)
|
||||||
|
tags = iter_.get_tags()
|
||||||
|
|
||||||
|
if tags:
|
||||||
|
for tag in tags:
|
||||||
|
tag_name = tag.get_property('name')
|
||||||
|
if tag_name in ('juick_nick', 'sharp_slash'):
|
||||||
|
return True
|
||||||
|
|
||||||
|
self.textview.on_textview_button_press_event(widget, event)
|
||||||
|
|
||||||
|
def on_textview_motion_notify_event(self, widget, event):
|
||||||
|
# Change the cursor to a hand when we are over a nicks or an post nums
|
||||||
|
pointer_x, pointer_y = self.textview.tv.window.get_pointer()[0:2]
|
||||||
|
x, y = self.textview.tv.window_to_buffer_coords(gtk.TEXT_WINDOW_TEXT,
|
||||||
|
pointer_x, pointer_y)
|
||||||
|
tags = self.textview.tv.get_iter_at_location(x, y).get_tags()
|
||||||
|
tag_table = self.textview.tv.get_buffer().get_tag_table()
|
||||||
|
if self.change_cursor:
|
||||||
|
self.textview.tv.get_window(gtk.TEXT_WINDOW_TEXT).set_cursor(
|
||||||
|
gtk.gdk.Cursor(gtk.gdk.XTERM))
|
||||||
|
self.change_cursor = False
|
||||||
|
for tag in tags:
|
||||||
|
if tag in (self.textview.tagSharpSlash, self.textview.tagJuickNick):
|
||||||
|
self.textview.tv.get_window(gtk.TEXT_WINDOW_TEXT).set_cursor(
|
||||||
|
gtk.gdk.Cursor(gtk.gdk.HAND2))
|
||||||
|
self.change_cursor = True
|
||||||
|
self.textview.on_textview_motion_notify_event(widget, event)
|
||||||
|
|
||||||
|
def on_juick_button_clicked(self, widget):
|
||||||
|
"""
|
||||||
|
Popup juick menu
|
||||||
|
"""
|
||||||
|
menu = gtk.Menu()
|
||||||
|
menuitems = ((_('Show last messages from public timeline'), '#+'),
|
||||||
|
(_('Show last messages from your feed'), '#'),
|
||||||
|
(_('Show popular personal blogs'), '@'),
|
||||||
|
(_('Show popular tags'), '*'),
|
||||||
|
(_('Show your subscriptions'), 'S'),
|
||||||
|
(_('Delete last message'), 'D LAST'),
|
||||||
|
(_('Enable subscriptions delivery'), 'ON'),
|
||||||
|
(_('Disable subscriptions delivery'), 'OFF'),
|
||||||
|
(_('Show your blacklist'), 'BL'),
|
||||||
|
(_('Update "About" info from Jabber vCard'), 'VCARD'),
|
||||||
|
(_('Ping'), 'PING'),
|
||||||
|
(_('Login'), 'LOGIN'),
|
||||||
|
(_('HELP'), 'HELP'),)
|
||||||
|
for menuitem in menuitems:
|
||||||
|
item = gtk.MenuItem(menuitem[0])
|
||||||
|
item.connect('activate', self.send, menuitem[1])
|
||||||
|
menu.append(item)
|
||||||
|
|
||||||
|
menu.show_all()
|
||||||
|
gtkgui_helpers.popup_emoticons_under_button(menu, widget,
|
||||||
|
self.chat_control.parent_win)
|
||||||
|
|
||||||
|
def on_juick_tag_button_clicked(self, widget):
|
||||||
|
gtkgui_helpers.popup_emoticons_under_button(self.menu, widget,
|
||||||
|
self.chat_control.parent_win)
|
||||||
|
|
||||||
|
def send(self, widget, text):
|
||||||
|
msg = text.replace('WORD', self.juick_post_uid).replace(
|
||||||
|
'NICK',self.juick_nick.rstrip(':'))
|
||||||
|
self.chat_control.send_message(msg)
|
||||||
|
self.chat_control.msg_textview.grab_focus()
|
||||||
|
|
||||||
|
def on_insert(self, widget, text):
|
||||||
|
"""
|
||||||
|
Insert text to conversation input box, at cursor position
|
||||||
|
"""
|
||||||
|
text = text.rstrip() + ' '
|
||||||
|
message_buffer = self.chat_control.msg_textview.get_buffer()
|
||||||
|
message_buffer.insert_at_cursor(text)
|
||||||
|
self.chat_control.msg_textview.grab_focus()
|
||||||
|
|
||||||
|
def on_reply(self, widget):
|
||||||
|
self.on_insert(widget, self.juick_post_full)
|
||||||
|
|
||||||
|
def on_pm(self, widget):
|
||||||
|
self.on_insert(widget, 'PM %s' % self.juick_nick.rstrip(':'))
|
||||||
|
|
||||||
|
def open_in_browser(self, widget):
|
||||||
|
post = self.juick_post_comment_re.search(self.juick_post)
|
||||||
|
url = None
|
||||||
|
if post is not None:
|
||||||
|
url = 'http://juick.com/%s#%s' % (post.group(1), post.group(2))
|
||||||
|
else:
|
||||||
|
post = self.juick_post_re.search(self.juick_post)
|
||||||
|
if post is not None:
|
||||||
|
url = 'http://juick.com/%s' % post.group(1)
|
||||||
|
if url is not None:
|
||||||
|
helpers.launch_browser_mailer('url', url)
|
||||||
|
|
||||||
|
def disconnect_from_chat_control(self):
|
||||||
|
self.textview.print_special_text = self.old_print_special_text
|
||||||
|
buffer_ = self.textview.tv.get_buffer()
|
||||||
|
tag_table = buffer_.get_tag_table()
|
||||||
|
if tag_table.lookup('sharp_slash'):
|
||||||
|
tag_table.remove(self.textview.tagSharpSlash)
|
||||||
|
tag_table.remove(self.textview.tagJuickNick)
|
||||||
|
tag_table.remove(self.textview.tagJuickPic)
|
||||||
|
actions_hbox = self.chat_control.xml.get_object('actions_hbox')
|
||||||
|
actions_hbox.remove(self.button)
|
||||||
|
actions_hbox.remove(self.tag_button)
|
||||||
|
|
||||||
|
def mykeypress_event(self, widget, event):
|
||||||
|
if event.keyval == gtk.keysyms.Up:
|
||||||
|
if event.state & gtk.gdk.MOD1_MASK: # Alt+UP
|
||||||
|
self.on_insert(widget, self.last_juick_num)
|
||||||
|
return True
|
||||||
|
|
||||||
|
class JuickPluginConfigDialog(GajimPluginConfigDialog):
|
||||||
|
def init(self):
|
||||||
|
self.GTK_BUILDER_FILE_PATH = self.plugin.local_file_path(
|
||||||
|
'config_dialog.ui')
|
||||||
|
self.xml = gtk.Builder()
|
||||||
|
self.xml.set_translation_domain('JuickPlugin')
|
||||||
|
self.xml.add_objects_from_file(self.GTK_BUILDER_FILE_PATH,
|
||||||
|
['vbox1'])
|
||||||
|
self.checkbutton = self.xml.get_object('checkbutton')
|
||||||
|
self.avatar_size_spinbutton = self.xml.get_object('avatar_size')
|
||||||
|
self.avatar_size_spinbutton.get_adjustment().set_all(
|
||||||
|
20, 10, 32, 1, 10, 0)
|
||||||
|
self.show_pic = self.xml.get_object('show_pic')
|
||||||
|
self.preview_size_spinbutton = self.xml.get_object('preview_size')
|
||||||
|
self.preview_size_spinbutton.get_adjustment().set_all(
|
||||||
|
20, 10, 512, 1, 10, 0)
|
||||||
|
self.link_colorbutton = self.xml.get_object('link_colorbutton')
|
||||||
|
vbox = self.xml.get_object('vbox1')
|
||||||
|
self.child.pack_start(vbox)
|
||||||
|
|
||||||
|
self.xml.connect_signals(self)
|
||||||
|
|
||||||
|
def on_run(self):
|
||||||
|
self.checkbutton.set_active(self.plugin.config['SHOW_AVATARS'])
|
||||||
|
self.xml.get_object('only_author_avatar').set_active(
|
||||||
|
self.plugin.config['ONLY_AUTHOR_AVATAR'])
|
||||||
|
self.avatar_size_spinbutton.set_value(self.plugin.config['AVATAR_SIZE'])
|
||||||
|
self.show_pic.set_active(self.plugin.config['SHOW_PREVIEW'])
|
||||||
|
self.preview_size_spinbutton.set_value(
|
||||||
|
self.plugin.config['PREVIEW_SIZE'])
|
||||||
|
self.link_colorbutton.set_color(gtk.gdk.color_parse(
|
||||||
|
self.plugin.config['LINK_COLOR']))
|
||||||
|
self.xml.get_object('show_tag_button').set_active(
|
||||||
|
self.plugin.config['SHOW_TAG_BUTTON'])
|
||||||
|
for num in xrange(1,11):
|
||||||
|
self.xml.get_object('menuitem' + str(num)).set_text(
|
||||||
|
self.plugin.config['MENUITEM' + str(num)])
|
||||||
|
self.xml.get_object('menuitem_text' + str(num)).set_text(
|
||||||
|
self.plugin.config['MENUITEM_TEXT' + str(num)])
|
||||||
|
|
||||||
|
def on_checkbutton_toggled(self, checkbutton):
|
||||||
|
self.plugin.config['SHOW_AVATARS'] = checkbutton.get_active()
|
||||||
|
|
||||||
|
def on_only_author_ava_toggled(self, checkbutton):
|
||||||
|
self.plugin.config['ONLY_AUTHOR_AVATAR'] = checkbutton.get_active()
|
||||||
|
for control in self.plugin.controls:
|
||||||
|
control.create_patterns()
|
||||||
|
|
||||||
|
def avatar_size_value_changed(self, spinbutton):
|
||||||
|
self.plugin.config['AVATAR_SIZE'] = spinbutton.get_value()
|
||||||
|
|
||||||
|
def on_show_pic_toggled(self, checkbutton):
|
||||||
|
self.plugin.config['SHOW_PREVIEW'] = checkbutton.get_active()
|
||||||
|
|
||||||
|
def on_show_tag_button_toggled(self, checkbutton):
|
||||||
|
self.plugin.config['SHOW_TAG_BUTTON'] = checkbutton.get_active()
|
||||||
|
for control in self.plugin.controls:
|
||||||
|
control.tag_button.set_property('visible', checkbutton.get_active())
|
||||||
|
|
||||||
|
def preview_size_value_changed(self, spinbutton):
|
||||||
|
self.plugin.config['PREVIEW_SIZE'] = spinbutton.get_value()
|
||||||
|
|
||||||
|
def on_link_colorbutton_color_set(self, colorbutton):
|
||||||
|
color = colorbutton.get_color().to_string()
|
||||||
|
self.plugin.config['LINK_COLOR'] = color
|
||||||
|
for control in self.plugin.controls:
|
||||||
|
control.textview.tagSharpSlash.set_property('foreground', color)
|
||||||
|
control.textview.tagJuickNick.set_property('foreground', color)
|
||||||
|
def menuitem_changed(self, widget):
|
||||||
|
name = upper(gtk.Buildable.get_name(widget))
|
||||||
|
self.plugin.config[name] = widget.get_text()
|
||||||
|
for control in self.plugin.controls:
|
||||||
|
control.create_tag_menu()
|
||||||
179
juick/po/JuickPlugin.po
Normal file
179
juick/po/JuickPlugin.po
Normal file
@@ -0,0 +1,179 @@
|
|||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: JuickPlugin\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2010-09-08 21:59+0400\n"
|
||||||
|
"PO-Revision-Date: \n"
|
||||||
|
"Last-Translator: Fomin Denis <fominde@mail.ru>\n"
|
||||||
|
"Language-Team: \n"
|
||||||
|
"Language: \n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"X-Poedit-Language: Russian\n"
|
||||||
|
|
||||||
|
#: ../plugin.py:37
|
||||||
|
msgid ""
|
||||||
|
"Clickable juick links , juick nics, preview juick picturs.\n"
|
||||||
|
"The key combination alt + up in the textbox allow insert the number of last message (comment or topic)."
|
||||||
|
msgstr ""
|
||||||
|
"Кликабельные Juick ссылки, ники, аватары и картинки.\n"
|
||||||
|
"Комбинация клавиш alt+up позволяет в поле ввода вставить номер последнего сообщения(комментария или топика)."
|
||||||
|
|
||||||
|
#: ../plugin.py:51
|
||||||
|
msgid "Avatar size(10-32)"
|
||||||
|
msgstr "Размер аватара(10-32)"
|
||||||
|
|
||||||
|
#: ../plugin.py:53
|
||||||
|
#: ../config_dialog.ui.h:5
|
||||||
|
msgid "Preview size(10-512)"
|
||||||
|
msgstr "Размер картинок(10-512)"
|
||||||
|
|
||||||
|
#: ../plugin.py:54
|
||||||
|
#: ../config_dialog.ui.h:2
|
||||||
|
msgid "Juick link color"
|
||||||
|
msgstr "Цвет Juick ссылок"
|
||||||
|
|
||||||
|
#: ../plugin.py:220
|
||||||
|
msgid "Reply to message"
|
||||||
|
msgstr "Ответить на сообщение"
|
||||||
|
|
||||||
|
#: ../plugin.py:224
|
||||||
|
msgid "Unsubscribe from comments"
|
||||||
|
msgstr "Отписаться от поста"
|
||||||
|
|
||||||
|
#: ../plugin.py:225
|
||||||
|
msgid "Subscribe to message replies"
|
||||||
|
msgstr "Подписаться на пост"
|
||||||
|
|
||||||
|
#: ../plugin.py:226
|
||||||
|
msgid "Recommend post"
|
||||||
|
msgstr "Рекомендовать пост"
|
||||||
|
|
||||||
|
#: ../plugin.py:227
|
||||||
|
msgid "Show message with replies"
|
||||||
|
msgstr "Показать пост и ответы"
|
||||||
|
|
||||||
|
#: ../plugin.py:228
|
||||||
|
msgid "Delete post"
|
||||||
|
msgstr "Удалить пост"
|
||||||
|
|
||||||
|
#: ../plugin.py:234
|
||||||
|
msgid "Open in browser"
|
||||||
|
msgstr "Открыть в браузере"
|
||||||
|
|
||||||
|
#: ../plugin.py:238
|
||||||
|
msgid "Show user's info"
|
||||||
|
msgstr "Показать информацию о пользователе"
|
||||||
|
|
||||||
|
#: ../plugin.py:239
|
||||||
|
msgid "Show user's info and last 10 messages"
|
||||||
|
msgstr "Показать информацию о пользователе и последние 10 сообщений"
|
||||||
|
|
||||||
|
#: ../plugin.py:240
|
||||||
|
msgid "Subscribe to user's blog"
|
||||||
|
msgstr "Подписаться"
|
||||||
|
|
||||||
|
#: ../plugin.py:241
|
||||||
|
msgid "Unsubscribe from user's blog"
|
||||||
|
msgstr "Отписаться"
|
||||||
|
|
||||||
|
#: ../plugin.py:242
|
||||||
|
msgid "Add/delete user to/from your blacklist"
|
||||||
|
msgstr "Добавить/Удалить пользователя в/из «Черный список» "
|
||||||
|
|
||||||
|
#: ../plugin.py:248
|
||||||
|
msgid "Send personal message"
|
||||||
|
msgstr "Отослать пользователю личное сообщение"
|
||||||
|
|
||||||
|
#: ../plugin.py:471
|
||||||
|
msgid "Show last messages from public timeline"
|
||||||
|
msgstr "Показать последние сообщения из общей ленты"
|
||||||
|
|
||||||
|
#: ../plugin.py:472
|
||||||
|
msgid "Show last messages from your feed"
|
||||||
|
msgstr "Показать последние сообщения из вашей ленты"
|
||||||
|
|
||||||
|
#: ../plugin.py:473
|
||||||
|
msgid "Show popular personal blogs"
|
||||||
|
msgstr "Показать популярные блоги"
|
||||||
|
|
||||||
|
#: ../plugin.py:474
|
||||||
|
msgid "Show popular tags"
|
||||||
|
msgstr "Показать популярные теги"
|
||||||
|
|
||||||
|
#: ../plugin.py:475
|
||||||
|
msgid "Show your subscriptions"
|
||||||
|
msgstr "Показать список всех блогов, на которые вы подписаны"
|
||||||
|
|
||||||
|
#: ../plugin.py:476
|
||||||
|
msgid "Delete last message"
|
||||||
|
msgstr "Удалить вашу последнюю запись"
|
||||||
|
|
||||||
|
#: ../plugin.py:477
|
||||||
|
msgid "Enable subscriptions delivery"
|
||||||
|
msgstr "Включить доставку сообщений"
|
||||||
|
|
||||||
|
#: ../plugin.py:478
|
||||||
|
msgid "Disable subscriptions delivery"
|
||||||
|
msgstr "Отключить доставку сообщений"
|
||||||
|
|
||||||
|
#: ../plugin.py:479
|
||||||
|
msgid "Show your blacklist"
|
||||||
|
msgstr "Показать «Черный список»"
|
||||||
|
|
||||||
|
#: ../plugin.py:480
|
||||||
|
msgid "Update \"About\" info from Jabber vCard"
|
||||||
|
msgstr "Обновить \"About\" из vCard"
|
||||||
|
|
||||||
|
#: ../plugin.py:481
|
||||||
|
msgid "Ping"
|
||||||
|
msgstr "Пинг"
|
||||||
|
|
||||||
|
#: ../plugin.py:482
|
||||||
|
msgid "Login"
|
||||||
|
msgstr "Получить уникальную ссылку для авторизации на сайте"
|
||||||
|
|
||||||
|
#: ../plugin.py:483
|
||||||
|
msgid "HELP"
|
||||||
|
msgstr "Показать краткую справку по командам"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:1
|
||||||
|
msgid "Avatar size"
|
||||||
|
msgstr "Размер аватара"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:3
|
||||||
|
msgid "Juick tag button menu options:"
|
||||||
|
msgstr "Опции кнопки для ввода тегов:"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:4
|
||||||
|
msgid "Preview size"
|
||||||
|
msgstr "Размер картинок"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:6
|
||||||
|
msgid "Show avatar of post author only"
|
||||||
|
msgstr "Показывать аватар только автора поста"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:7
|
||||||
|
msgid "Show avatars in messages"
|
||||||
|
msgstr "Показывать аватары в сообщениях"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:8
|
||||||
|
msgid "Show juick picture preview"
|
||||||
|
msgstr "Показывать картики в сообщениях"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:9
|
||||||
|
msgid "Show juick tag button"
|
||||||
|
msgstr "Отображать кнопку для ввода тегов"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:10
|
||||||
|
msgid "menuitem name:"
|
||||||
|
msgstr "название пункта меню:"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:11
|
||||||
|
msgid "text will be inserted:"
|
||||||
|
msgstr "текст для вставки:"
|
||||||
|
|
||||||
|
#~ msgid "Clickable juick links , juick nics, preview juick picturs"
|
||||||
|
#~ msgstr "Кликабельные Juick ссылки, ники, аватары и картинки"
|
||||||
|
|
||||||
177
juick/po/JuickPlugin.pot
Normal file
177
juick/po/JuickPlugin.pot
Normal file
@@ -0,0 +1,177 @@
|
|||||||
|
# SOME DESCRIPTIVE TITLE.
|
||||||
|
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||||
|
# This file is distributed under the same license as the PACKAGE package.
|
||||||
|
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||||
|
#
|
||||||
|
#, fuzzy
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2010-09-08 21:59+0400\n"
|
||||||
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
"Language: \n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=CHARSET\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
|
||||||
|
#: ../plugin.py:37
|
||||||
|
msgid ""
|
||||||
|
"Clickable juick links , juick nics, preview juick picturs.\n"
|
||||||
|
"The key combination alt + up in the textbox allow insert the number of last "
|
||||||
|
"message (comment or topic)."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../plugin.py:51
|
||||||
|
msgid "Avatar size(10-32)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../plugin.py:53 ../config_dialog.ui.h:5
|
||||||
|
msgid "Preview size(10-512)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../plugin.py:54 ../config_dialog.ui.h:2
|
||||||
|
msgid "Juick link color"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../plugin.py:220
|
||||||
|
msgid "Reply to message"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../plugin.py:224
|
||||||
|
msgid "Unsubscribe from comments"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../plugin.py:225
|
||||||
|
msgid "Subscribe to message replies"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../plugin.py:226
|
||||||
|
msgid "Recommend post"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../plugin.py:227
|
||||||
|
msgid "Show message with replies"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../plugin.py:228
|
||||||
|
msgid "Delete post"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../plugin.py:234
|
||||||
|
msgid "Open in browser"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../plugin.py:238
|
||||||
|
msgid "Show user's info"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../plugin.py:239
|
||||||
|
msgid "Show user's info and last 10 messages"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../plugin.py:240
|
||||||
|
msgid "Subscribe to user's blog"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../plugin.py:241
|
||||||
|
msgid "Unsubscribe from user's blog"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../plugin.py:242
|
||||||
|
msgid "Add/delete user to/from your blacklist"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../plugin.py:248
|
||||||
|
msgid "Send personal message"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../plugin.py:471
|
||||||
|
msgid "Show last messages from public timeline"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../plugin.py:472
|
||||||
|
msgid "Show last messages from your feed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../plugin.py:473
|
||||||
|
msgid "Show popular personal blogs"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../plugin.py:474
|
||||||
|
msgid "Show popular tags"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../plugin.py:475
|
||||||
|
msgid "Show your subscriptions"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../plugin.py:476
|
||||||
|
msgid "Delete last message"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../plugin.py:477
|
||||||
|
msgid "Enable subscriptions delivery"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../plugin.py:478
|
||||||
|
msgid "Disable subscriptions delivery"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../plugin.py:479
|
||||||
|
msgid "Show your blacklist"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../plugin.py:480
|
||||||
|
msgid "Update \"About\" info from Jabber vCard"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../plugin.py:481
|
||||||
|
msgid "Ping"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../plugin.py:482
|
||||||
|
msgid "Login"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../plugin.py:483
|
||||||
|
msgid "HELP"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:1
|
||||||
|
msgid "Avatar size"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:3
|
||||||
|
msgid "Juick tag button menu options:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:4
|
||||||
|
msgid "Preview size"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:6
|
||||||
|
msgid "Show avatar of post author only"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:7
|
||||||
|
msgid "Show avatars in messages"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:8
|
||||||
|
msgid "Show juick picture preview"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:9
|
||||||
|
msgid "Show juick tag button"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:10
|
||||||
|
msgid "menuitem name:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:11
|
||||||
|
msgid "text will be inserted:"
|
||||||
|
msgstr ""
|
||||||
34
juick/po/Makefile
Normal file
34
juick/po/Makefile
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
PYFILES = $(shell find ../ -type f -name "*.py")
|
||||||
|
GLADEFILES = $(wildcard ../*.ui)
|
||||||
|
POFILES = $(wildcard *.po)
|
||||||
|
|
||||||
|
GLADEHFILES := $(GLADEFILES:.ui=.ui.h)
|
||||||
|
|
||||||
|
help:
|
||||||
|
@echo "USAGE:"
|
||||||
|
@echo "make update - updates messages.pot and .po files"
|
||||||
|
@echo "make sr.po - updates sr.po file OR creates new one"
|
||||||
|
@echo " (replace 'sr' with your language code)"
|
||||||
|
|
||||||
|
%.h: %
|
||||||
|
intltool-extract --type="gettext/glade" $*
|
||||||
|
|
||||||
|
|
||||||
|
messages.pot: $(GLADEHFILES) $(PYFILES)
|
||||||
|
xgettext -k_ -kN_ -o JuickPlugin.pot $(PYFILES) $(GLADEHFILES) --from-code=utf-8
|
||||||
|
|
||||||
|
%.po: messages.pot
|
||||||
|
@if test -f $@; then \
|
||||||
|
echo -n "Updating '$*' language ";\
|
||||||
|
msgmerge -U $@ JuickPlugin.pot;\
|
||||||
|
else \
|
||||||
|
msginit -l $*.UTF8 -o $@; \
|
||||||
|
fi
|
||||||
|
$(RM) $(GLADEHFILES)
|
||||||
|
|
||||||
|
update: $(POFILES)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$(RM) $(GLADEHFILES)
|
||||||
|
|
||||||
|
.PHONY: update
|
||||||
1
set_location/__init__.py
Normal file
1
set_location/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
from set_location import SetLocationPlugin
|
||||||
487
set_location/config_dialog.ui
Normal file
487
set_location/config_dialog.ui
Normal file
@@ -0,0 +1,487 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<interface>
|
||||||
|
<requires lib="gtk+" version="2.16"/>
|
||||||
|
<!-- interface-naming-policy toplevel-contextual -->
|
||||||
|
<object class="GtkWindow" id="window1">
|
||||||
|
<child>
|
||||||
|
<object class="GtkTable" id="config_table">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="border_width">6</property>
|
||||||
|
<property name="n_rows">17</property>
|
||||||
|
<property name="n_columns">2</property>
|
||||||
|
<property name="column_spacing">7</property>
|
||||||
|
<property name="row_spacing">5</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="label1">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
<property name="label" translatable="yes">alt:</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="x_options">GTK_FILL</property>
|
||||||
|
<property name="y_options">GTK_FILL</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="label2">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
<property name="label" translatable="yes">area:</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="top_attach">1</property>
|
||||||
|
<property name="bottom_attach">2</property>
|
||||||
|
<property name="x_options">GTK_FILL</property>
|
||||||
|
<property name="y_options">GTK_FILL</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="label3">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
<property name="label" translatable="yes">building:</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="top_attach">2</property>
|
||||||
|
<property name="bottom_attach">3</property>
|
||||||
|
<property name="x_options">GTK_FILL</property>
|
||||||
|
<property name="y_options">GTK_FILL</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="label4">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
<property name="label" translatable="yes">country:</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="top_attach">3</property>
|
||||||
|
<property name="bottom_attach">4</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="label5">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
<property name="label" translatable="yes">countrycode:</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="top_attach">4</property>
|
||||||
|
<property name="bottom_attach">5</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="label6">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
<property name="label" translatable="yes">description:</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="top_attach">5</property>
|
||||||
|
<property name="bottom_attach">6</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="label7">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
<property name="label" translatable="yes">floor:</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="top_attach">6</property>
|
||||||
|
<property name="bottom_attach">7</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="label8">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
<property name="label" translatable="yes">locality:</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="top_attach">7</property>
|
||||||
|
<property name="bottom_attach">8</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="label9">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
<property name="label" translatable="yes">lat:</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="top_attach">8</property>
|
||||||
|
<property name="bottom_attach">9</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="label10">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
<property name="label" translatable="yes">lon:</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="top_attach">9</property>
|
||||||
|
<property name="bottom_attach">10</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="label11">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
<property name="label" translatable="yes">postalcode:</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="top_attach">10</property>
|
||||||
|
<property name="bottom_attach">11</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="label12">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
<property name="label" translatable="yes">region:</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="top_attach">11</property>
|
||||||
|
<property name="bottom_attach">12</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="label13">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
<property name="label" translatable="yes">room:</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="top_attach">12</property>
|
||||||
|
<property name="bottom_attach">13</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="label14">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
<property name="label" translatable="yes">street:</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="top_attach">13</property>
|
||||||
|
<property name="bottom_attach">14</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="label15">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
<property name="label" translatable="yes">text:</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="top_attach">14</property>
|
||||||
|
<property name="bottom_attach">15</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="label16">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
<property name="label" translatable="yes">uri:</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="top_attach">15</property>
|
||||||
|
<property name="bottom_attach">16</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="alt">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="tooltip_text" translatable="yes">Altitude in meters above or below sea level</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">1</property>
|
||||||
|
<property name="right_attach">2</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="area">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="tooltip_text" translatable="yes">A named area such as a campus or neighborhood</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">1</property>
|
||||||
|
<property name="right_attach">2</property>
|
||||||
|
<property name="top_attach">1</property>
|
||||||
|
<property name="bottom_attach">2</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="building">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="tooltip_text" translatable="yes">A specific building on a street or in an area</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">1</property>
|
||||||
|
<property name="right_attach">2</property>
|
||||||
|
<property name="top_attach">2</property>
|
||||||
|
<property name="bottom_attach">3</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="country">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="tooltip_text" translatable="yes">The nation where the user is located</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">1</property>
|
||||||
|
<property name="right_attach">2</property>
|
||||||
|
<property name="top_attach">3</property>
|
||||||
|
<property name="bottom_attach">4</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="countrycode">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="tooltip_text" translatable="yes">The ISO 3166 two-letter country code</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">1</property>
|
||||||
|
<property name="right_attach">2</property>
|
||||||
|
<property name="top_attach">4</property>
|
||||||
|
<property name="bottom_attach">5</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="description">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="tooltip_text" translatable="yes">A natural-language name for or description of the location</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">1</property>
|
||||||
|
<property name="right_attach">2</property>
|
||||||
|
<property name="top_attach">5</property>
|
||||||
|
<property name="bottom_attach">6</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="floor">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="tooltip_text" translatable="yes">A particular floor in a building</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">1</property>
|
||||||
|
<property name="right_attach">2</property>
|
||||||
|
<property name="top_attach">6</property>
|
||||||
|
<property name="bottom_attach">7</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="locality">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="tooltip_text" translatable="yes">A locality within the administrative region, such as a town or city</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">1</property>
|
||||||
|
<property name="right_attach">2</property>
|
||||||
|
<property name="top_attach">7</property>
|
||||||
|
<property name="bottom_attach">8</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="lat">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="tooltip_text" translatable="yes">Latitude in decimal degrees North</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">1</property>
|
||||||
|
<property name="right_attach">2</property>
|
||||||
|
<property name="top_attach">8</property>
|
||||||
|
<property name="bottom_attach">9</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="lon">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="tooltip_text" translatable="yes">Longitude in decimal degrees East</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">1</property>
|
||||||
|
<property name="right_attach">2</property>
|
||||||
|
<property name="top_attach">9</property>
|
||||||
|
<property name="bottom_attach">10</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="postalcode">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="tooltip_text" translatable="yes">A code used for postal delivery</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">1</property>
|
||||||
|
<property name="right_attach">2</property>
|
||||||
|
<property name="top_attach">10</property>
|
||||||
|
<property name="bottom_attach">11</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="region">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="tooltip_text" translatable="yes">An administrative region of the nation, such as a state or province</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">1</property>
|
||||||
|
<property name="right_attach">2</property>
|
||||||
|
<property name="top_attach">11</property>
|
||||||
|
<property name="bottom_attach">12</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="room">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="tooltip_text" translatable="yes">A particular room in a building</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">1</property>
|
||||||
|
<property name="right_attach">2</property>
|
||||||
|
<property name="top_attach">12</property>
|
||||||
|
<property name="bottom_attach">13</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="street">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="tooltip_text" translatable="yes">A thoroughfare within the locality, or a crossing of two thoroughfares</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">1</property>
|
||||||
|
<property name="right_attach">2</property>
|
||||||
|
<property name="top_attach">13</property>
|
||||||
|
<property name="bottom_attach">14</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="text">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="tooltip_text" translatable="yes">A catch-all element that captures any other information about the location</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">1</property>
|
||||||
|
<property name="right_attach">2</property>
|
||||||
|
<property name="top_attach">14</property>
|
||||||
|
<property name="bottom_attach">15</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="uri">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="tooltip_text" translatable="yes">A URI or URL pointing to information about the location</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="changed" handler="changed"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">1</property>
|
||||||
|
<property name="right_attach">2</property>
|
||||||
|
<property name="top_attach">15</property>
|
||||||
|
<property name="bottom_attach">16</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkAspectFrame" id="aspectframe2">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="label_xalign">0</property>
|
||||||
|
<property name="shadow_type">none</property>
|
||||||
|
<property name="xalign">1</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkButton" id="apply">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="receives_default">True</property>
|
||||||
|
<property name="focus_on_click">False</property>
|
||||||
|
<property name="xalign">1</property>
|
||||||
|
<signal name="clicked" handler="on_apply_clicked"/>
|
||||||
|
<child>
|
||||||
|
<object class="GtkHBox" id="hbox1">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkImage" id="image1">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="stock">gtk-apply</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="label17">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="label" translatable="yes">Apply</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="position">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">1</property>
|
||||||
|
<property name="right_attach">2</property>
|
||||||
|
<property name="top_attach">16</property>
|
||||||
|
<property name="bottom_attach">17</property>
|
||||||
|
<property name="x_options">GTK_FILL</property>
|
||||||
|
<property name="y_options"></property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<placeholder/>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</interface>
|
||||||
BIN
set_location/locales/ru/LC_MESSAGES/setlocation.mo
Normal file
BIN
set_location/locales/ru/LC_MESSAGES/setlocation.mo
Normal file
Binary file not shown.
34
set_location/po/Makefile
Normal file
34
set_location/po/Makefile
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
PYFILES = $(shell find ../ -type f -name "*.py")
|
||||||
|
GLADEFILES = $(wildcard ../*.ui)
|
||||||
|
POFILES = $(wildcard *.po)
|
||||||
|
|
||||||
|
GLADEHFILES := $(GLADEFILES:.ui=.ui.h)
|
||||||
|
|
||||||
|
help:
|
||||||
|
@echo "USAGE:"
|
||||||
|
@echo "make update - updates messages.pot and .po files"
|
||||||
|
@echo "make sr.po - updates sr.po file OR creates new one"
|
||||||
|
@echo " (replace 'sr' with your language code)"
|
||||||
|
|
||||||
|
%.h: %
|
||||||
|
intltool-extract --type="gettext/glade" $*
|
||||||
|
|
||||||
|
|
||||||
|
messages.pot: $(GLADEHFILES) $(PYFILES)
|
||||||
|
xgettext -k_ -kN_ -o setlocation.pot $(PYFILES) $(GLADEHFILES) --from-code=utf-8
|
||||||
|
|
||||||
|
%.po: messages.pot
|
||||||
|
@if test -f $@; then \
|
||||||
|
echo -n "Updating '$*' language ";\
|
||||||
|
msgmerge -U $@ setlocation.pot;\
|
||||||
|
else \
|
||||||
|
msginit -l $*.UTF8 -o $@; \
|
||||||
|
fi
|
||||||
|
$(RM) $(GLADEHFILES)
|
||||||
|
|
||||||
|
update: $(POFILES)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$(RM) $(GLADEHFILES)
|
||||||
|
|
||||||
|
.PHONY: update
|
||||||
154
set_location/po/setlocation.po
Normal file
154
set_location/po/setlocation.po
Normal file
@@ -0,0 +1,154 @@
|
|||||||
|
# Language setlocation translations for PACKAGE package.
|
||||||
|
# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
|
||||||
|
# This file is distributed under the same license as the PACKAGE package.
|
||||||
|
# test <fominde@gmail.com>, 2010.
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: setlocation\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2010-09-05 22:11+0400\n"
|
||||||
|
"PO-Revision-Date: 2010-09-05 22:54+0300\n"
|
||||||
|
"Last-Translator: Fomin Denis <fominde@mail.ru>\n"
|
||||||
|
"Language-Team: ru\n"
|
||||||
|
"Language: setlocation\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=utf-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
|
||||||
|
#: ../set_location.py:29
|
||||||
|
msgid "Set information about the current geographical or physical location."
|
||||||
|
msgstr "Позволяет установить текущее местоположение."
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:1
|
||||||
|
msgid "A URI or URL pointing to information about the location"
|
||||||
|
msgstr "URI или URL, указывающих на информации о местонахождении"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:2
|
||||||
|
msgid "A catch-all element that captures any other information about the location"
|
||||||
|
msgstr "Всеобъемлющий элемент, который фиксирует любую другую информацию о местонахождении"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:3
|
||||||
|
msgid "A code used for postal delivery"
|
||||||
|
msgstr "Код, используемый для почтовых отправлений"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:4
|
||||||
|
msgid "A locality within the administrative region, such as a town or city"
|
||||||
|
msgstr "Населенный пункт в пределах административного района, например, деревни или города"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:5
|
||||||
|
msgid "A named area such as a campus or neighborhood"
|
||||||
|
msgstr "Именованый участок как студенческий городок или окресности"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:6
|
||||||
|
msgid "A natural-language name for or description of the location"
|
||||||
|
msgstr "Описание местоположения на родном языке"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:7
|
||||||
|
msgid "A particular floor in a building"
|
||||||
|
msgstr "Этаж в здании"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:8
|
||||||
|
msgid "A particular room in a building"
|
||||||
|
msgstr "Номер комнаты в здании"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:9
|
||||||
|
msgid "A specific building on a street or in an area"
|
||||||
|
msgstr "Конкретные здания на улице или в районе"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:10
|
||||||
|
msgid "A thoroughfare within the locality, or a crossing of two thoroughfares"
|
||||||
|
msgstr "Проезд в пределах местности, или пересечение двух улиц"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:11
|
||||||
|
msgid "Altitude in meters above or below sea level"
|
||||||
|
msgstr "Высота в метрах выше или ниже уровня моря"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:12
|
||||||
|
msgid "An administrative region of the nation, such as a state or province"
|
||||||
|
msgstr "Административный район страны, такой, как штат или область"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:13
|
||||||
|
msgid "Apply"
|
||||||
|
msgstr "Применить"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:14
|
||||||
|
msgid "Latitude in decimal degrees North"
|
||||||
|
msgstr "Широта в десятичных градусах"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:15
|
||||||
|
msgid "Longitude in decimal degrees East"
|
||||||
|
msgstr "Долгота в десятичных градусах"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:16
|
||||||
|
msgid "The ISO 3166 two-letter country code"
|
||||||
|
msgstr "ISO 3166 2-буквенный код страны"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:17
|
||||||
|
msgid "The nation where the user is located"
|
||||||
|
msgstr "Страна, в которой находится пользователь"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:18
|
||||||
|
msgid "alt:"
|
||||||
|
msgstr "высота:"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:19
|
||||||
|
msgid "area:"
|
||||||
|
msgstr "район:"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:20
|
||||||
|
msgid "building:"
|
||||||
|
msgstr "строение:"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:21
|
||||||
|
msgid "country:"
|
||||||
|
msgstr "страна:"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:22
|
||||||
|
msgid "countrycode:"
|
||||||
|
msgstr "код страны:"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:23
|
||||||
|
msgid "description:"
|
||||||
|
msgstr "описание:"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:24
|
||||||
|
msgid "floor:"
|
||||||
|
msgstr "этаж:"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:25
|
||||||
|
msgid "lat:"
|
||||||
|
msgstr "широта:"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:26
|
||||||
|
msgid "locality:"
|
||||||
|
msgstr "населенный пункт:"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:27
|
||||||
|
msgid "lon:"
|
||||||
|
msgstr "долгота:"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:28
|
||||||
|
msgid "postalcode:"
|
||||||
|
msgstr "индекс:"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:29
|
||||||
|
msgid "region:"
|
||||||
|
msgstr "область:"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:30
|
||||||
|
msgid "room:"
|
||||||
|
msgstr "комната(номер квартиры):"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:31
|
||||||
|
msgid "street:"
|
||||||
|
msgstr "улица:"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:32
|
||||||
|
msgid "text:"
|
||||||
|
msgstr "текст:"
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:33
|
||||||
|
msgid "uri:"
|
||||||
|
msgstr "uri:"
|
||||||
|
|
||||||
155
set_location/po/setlocation.pot
Normal file
155
set_location/po/setlocation.pot
Normal file
@@ -0,0 +1,155 @@
|
|||||||
|
# SOME DESCRIPTIVE TITLE.
|
||||||
|
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||||
|
# This file is distributed under the same license as the PACKAGE package.
|
||||||
|
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||||
|
#
|
||||||
|
#, fuzzy
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2010-09-05 22:11+0400\n"
|
||||||
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
"Language: \n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=CHARSET\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
|
||||||
|
#: ../set_location.py:29
|
||||||
|
msgid "Set information about the current geographical or physical location."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:1
|
||||||
|
msgid "A URI or URL pointing to information about the location"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:2
|
||||||
|
msgid ""
|
||||||
|
"A catch-all element that captures any other information about the location"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:3
|
||||||
|
msgid "A code used for postal delivery"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:4
|
||||||
|
msgid "A locality within the administrative region, such as a town or city"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:5
|
||||||
|
msgid "A named area such as a campus or neighborhood"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:6
|
||||||
|
msgid "A natural-language name for or description of the location"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:7
|
||||||
|
msgid "A particular floor in a building"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:8
|
||||||
|
msgid "A particular room in a building"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:9
|
||||||
|
msgid "A specific building on a street or in an area"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:10
|
||||||
|
msgid "A thoroughfare within the locality, or a crossing of two thoroughfares"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:11
|
||||||
|
msgid "Altitude in meters above or below sea level"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:12
|
||||||
|
msgid "An administrative region of the nation, such as a state or province"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:13
|
||||||
|
msgid "Apply"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:14
|
||||||
|
msgid "Latitude in decimal degrees North"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:15
|
||||||
|
msgid "Longitude in decimal degrees East"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:16
|
||||||
|
msgid "The ISO 3166 two-letter country code"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:17
|
||||||
|
msgid "The nation where the user is located"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:18
|
||||||
|
msgid "alt:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:19
|
||||||
|
msgid "area:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:20
|
||||||
|
msgid "building:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:21
|
||||||
|
msgid "country:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:22
|
||||||
|
msgid "countrycode:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:23
|
||||||
|
msgid "description:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:24
|
||||||
|
msgid "floor:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:25
|
||||||
|
msgid "lat:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:26
|
||||||
|
msgid "locality:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:27
|
||||||
|
msgid "lon:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:28
|
||||||
|
msgid "postalcode:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:29
|
||||||
|
msgid "region:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:30
|
||||||
|
msgid "room:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:31
|
||||||
|
msgid "street:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:32
|
||||||
|
msgid "text:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../config_dialog.ui.h:33
|
||||||
|
msgid "uri:"
|
||||||
|
msgstr ""
|
||||||
98
set_location/set_location.py
Normal file
98
set_location/set_location.py
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
##
|
||||||
|
|
||||||
|
from datetime import datetime
|
||||||
|
import time
|
||||||
|
import gtk
|
||||||
|
import os
|
||||||
|
import locale
|
||||||
|
import gettext
|
||||||
|
|
||||||
|
from plugins.gui import GajimPluginConfigDialog
|
||||||
|
from plugins import GajimPlugin
|
||||||
|
from plugins.helpers import log_calls, log
|
||||||
|
from common import gajim
|
||||||
|
|
||||||
|
locale_path = os.path.dirname(__file__) + '/locales'
|
||||||
|
locale.bindtextdomain('setlocation', locale_path)
|
||||||
|
try:
|
||||||
|
gett = gettext.Catalog('setlocation', locale_path)
|
||||||
|
_ = gett.gettext
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
class SetLocationPlugin(GajimPlugin):
|
||||||
|
name = u'Set Location'
|
||||||
|
short_name = u'set_location'
|
||||||
|
version = u'0.1'
|
||||||
|
description = _(
|
||||||
|
u'''Set information about the current geographical or physical location.''')
|
||||||
|
authors = [u'Denis Fomin <fominde@gmail.com>']
|
||||||
|
homepage = u'http://bitbucket.org/dicson12/plugins/src/tip/set_location/'
|
||||||
|
|
||||||
|
@log_calls('SetLocationPlugin')
|
||||||
|
def init(self):
|
||||||
|
self.config_dialog = SetLocationPluginConfigDialog(self)
|
||||||
|
self.config_default_values = {
|
||||||
|
'alt': (1609,''),
|
||||||
|
'area': ('Central Park', ''),
|
||||||
|
'building': ('The Empire State Building',''),
|
||||||
|
'country': ('United States', ''),
|
||||||
|
'countrycode' : ('US', ''),
|
||||||
|
'description' : ('Bill\'s house', ''),
|
||||||
|
'floor' : ('102', ''),
|
||||||
|
'lat' : (39.75, ''),
|
||||||
|
'locality' : ('New York City', ''),
|
||||||
|
'lon' : (-104.99, ''),
|
||||||
|
'postalcode' : ('10027', ''),
|
||||||
|
'region' : ('New York', ''),
|
||||||
|
'room' : ('Observatory', ''),
|
||||||
|
'street' : ('34th and Broadway', ''),
|
||||||
|
'text' : ('Northwest corner of the lobby', ''),
|
||||||
|
'uri' : ('http://beta.plazes.com/plazes/1940:jabber_inc', ''),}
|
||||||
|
|
||||||
|
@log_calls('SetLocationPlugin')
|
||||||
|
def activate(self):
|
||||||
|
self._data = {}
|
||||||
|
timestamp = time.time()
|
||||||
|
timestamp = datetime.utcfromtimestamp(timestamp)
|
||||||
|
timestamp = timestamp.strftime('%Y-%m-%dT%H:%MZ')
|
||||||
|
self._data['timestamp'] = timestamp
|
||||||
|
for name in self.config_default_values:
|
||||||
|
self._data[name] = self.config[name]
|
||||||
|
for acct in gajim.connections:
|
||||||
|
if gajim.connections[acct].connected == 0:
|
||||||
|
gajim.connections[acct].to_be_sent_location = self._data
|
||||||
|
else:
|
||||||
|
gajim.connections[acct].send_location(self._data)
|
||||||
|
|
||||||
|
@log_calls('SetLocationPlugin')
|
||||||
|
def deactivate(self):
|
||||||
|
self._data = {}
|
||||||
|
for acct in gajim.connections:
|
||||||
|
gajim.connections[acct].send_location(self._data)
|
||||||
|
|
||||||
|
|
||||||
|
class SetLocationPluginConfigDialog(GajimPluginConfigDialog):
|
||||||
|
def init(self):
|
||||||
|
self.GTK_BUILDER_FILE_PATH = self.plugin.local_file_path(
|
||||||
|
'config_dialog.ui')
|
||||||
|
self.xml = gtk.Builder()
|
||||||
|
self.xml.set_translation_domain('setlocation')
|
||||||
|
self.xml.add_objects_from_file(self.GTK_BUILDER_FILE_PATH,
|
||||||
|
['config_table'])
|
||||||
|
config_table = self.xml.get_object('config_table')
|
||||||
|
self.child.pack_start(config_table)
|
||||||
|
self.xml.connect_signals(self)
|
||||||
|
|
||||||
|
def on_run(self):
|
||||||
|
for name in self.plugin.config_default_values:
|
||||||
|
widget = self.xml.get_object(name)
|
||||||
|
widget.set_text(str(self.plugin.config[name]))
|
||||||
|
|
||||||
|
def changed(self, entry):
|
||||||
|
name = gtk.Buildable.get_name(entry)
|
||||||
|
self.plugin.config[name] = entry.get_text()
|
||||||
|
|
||||||
|
def on_apply_clicked(self, widget):
|
||||||
|
self.plugin.activate()
|
||||||
Reference in New Issue
Block a user