PK "hFHQ[ cmsplugin_googleplus/__init__.py__version__ = '0.6.0'
PK }G4~ cmsplugin_googleplus/models.pyfrom __future__ import unicode_literals
from cms.models.pluginmodel import CMSPlugin
from django.core.cache import cache
from django.core.exceptions import ValidationError
from django.core.validators import MaxValueValidator, MinValueValidator
from django.db import models
from django.utils.translation import ugettext_lazy as _
from .conf import GOOGLEPLUS_PLUGIN_TEMPLATES
from .globals import (
GOOGLEPLUS_PLUGIN_LANGUAGE_CHOICES, GOOGLEPLUS_PLUGIN_ORDER_BY_CHOICES,
RECENT)
class GooglePlusActivities(CMSPlugin):
"""
Plugin for including Google+ activities
"""
render_template = models.CharField(
_('template'), max_length=100, choices=GOOGLEPLUS_PLUGIN_TEMPLATES)
items = models.SmallIntegerField(
_('item'), default=5,
validators=[MaxValueValidator(20), MinValueValidator(1)],
help_text=_("Number of Google Plus activities to return. "
"From 1 to 100. Default is 10."),)
truncate_chars = models.PositiveIntegerField(
_('truncate chars'), default=150,
help_text=_('Truncates the content, annotation and attachment after a '
'certain number of characters.'))
google_user = models.CharField(
_('Google+ User Id'), blank=True,
help_text=_('The ID of the user to get activities for'),
max_length=75)
query = models.CharField(
_('search query'), max_length=250, blank=True,
help_text=_('Full-text search query string.'))
preferred_language = models.CharField(
_('preferred language'), blank=True,
max_length=10, choices=GOOGLEPLUS_PLUGIN_LANGUAGE_CHOICES,
help_text=_('Optional. Specify the preferred language to search with.')
)
order_by = models.CharField(
_('order by'),
max_length=20, choices=GOOGLEPLUS_PLUGIN_ORDER_BY_CHOICES,
default=RECENT, blank=True,
help_text=_("Optional. Specifies how to order search results. 'best': "
"Sort activities by relevance to the user, most relevant "
"first, 'recent': Sort activities by published date, most "
"recent first."))
google_api_key = models.CharField(
_('Google API key'),
help_text=_('To use the Google+ API, you must register your project '
'on the Google Developers Console and get a Google '
'API key.'),
max_length=75)
def __unicode__(self):
return ('Google User id: %s' % self.google_user) \
if self.google_user else ('Search Query: %s' % self.query)
def save(self, *args, **kwargs):
"""
Save and invalidate cached activities
"""
super(GooglePlusActivities, self).save(*args, **kwargs)
key = self.get_cache_key()
cache.delete(key)
def clean(self):
if not self.google_user and not self.query:
raise ValidationError(
_('"Google+ user id" or "Search query" must be provided'))
def get_cache_key(self, search=False):
if self.pk:
if self.google_user:
return 'google_plus_user_activities_%d' % self.pk
else:
return 'google_plus_search_activities_%d' % self.pk
return None
PK LU}G> " cmsplugin_googleplus/googleplus.pyfrom __future__ import unicode_literals
import logging
from django.conf import settings
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
logger = logging.getLogger(__name__)
class GooglePlusAPI(object):
"""
Simple wrapper for the Google Plus API.
The Google documentation is
`here `_.
"""
def __init__(self, developer_key):
"""
Builds a Google Plus service object.
:param developer_key: Key for controlling API usage, obtained from the
`API Console `_.
:type developer_key: str
"""
self.service = build(
serviceName='plus', version='v1', developerKey=developer_key)
def get_user_activity_list(self, user_id, collection='public', results=10):
"""
Get a list is activities from a Google Plus User. An activity is a note
that a user posts to their stream.
The Google documentation is
`here `_.
:param collection: The collection of activities to list
:param user_id: The ID of the user to get activities for
:param results: The number of activities to include in the response
for any response, the actual number returned might be less than the
specified results.
To keep the application simple acceptable values are 1 to 20,
inclusive. Default is 10.
:type collection: str
:type user_id: unicode or str
:type results: unsigned integer
:raises: TypeError, ValueError
:returns: The list of user activities
"""
if self.service:
try:
activities_resource = self.service.activities()
request = activities_resource.list(
userId=user_id, collection=collection,
maxResults=results, fields='items')
activities_document = request.execute()
if 'items' in activities_document:
return activities_document['items']
else:
return []
except HttpError as e:
logger.exception('Google Plus API error: % s' % e)
if not settings.DEBUG:
# fail silently if it's not possible to connect to
# the service
return []
else:
raise
def get_search_activity_list(self, query, preferred_language=None,
order_by=None, results=10):
"""
Get a list is activities from a Google Plus User. An activity is a note
that a user posts to their stream.
The Google documentation is
`here `_.
:param query: Full-text search query string.
:param preferred_language: Specify the preferred language to search
with.
See `search language codes
`_ for available
values.
:param order_by: Specifies how to order search results.
Acceptable values are:
"best": Sort activities by relevance to the user, most relevant
first.
"recent": Sort activities by published date, most recent first.
(default)
:param results: The number of activities to include in the response
for any response, the actual number returned might be less than the
specified results.
To keep the application simple acceptable values are 1 to 20,
inclusive. Default is 10.
:type query: unicode
:type preferred_language: str
:type order_by: str
:type results: unsigned integer
:returns: The list of activities, result of the search.
"""
if self.service:
try:
activities_resource = self.service.activities()
data = {
'query': query, 'maxResults': results, 'fields': 'items'}
if preferred_language:
data.update({'language': preferred_language})
if order_by:
data.update({'orderBy': order_by})
request = activities_resource.search(**data)
activities_document = request.execute()
if 'items' in activities_document:
return activities_document['items']
else:
return []
except HttpError as e:
logger.exception('Google Plus API error: % s' % e)
if not settings.DEBUG:
# fail silently if it's not possible to connect to the
# service
return []
else:
raise
PK }G6 # cmsplugin_googleplus/cms_plugins.pyfrom __future__ import unicode_literals
from cms.plugin_base import CMSPluginBase
from cms.plugin_pool import plugin_pool
from dateutil.parser import parse
from django.core.cache import cache
from django.utils.translation import ugettext_lazy as _
from .conf import GOOGLEPLUS_PLUGIN_CACHE_DURATION
from .googleplus import GooglePlusAPI
from .models import GooglePlusActivities
class GooglePlusActivitiesPlugin(CMSPluginBase):
"""
Plugin for including Google+ activities
"""
model = GooglePlusActivities
name = _("Google Plus Activity Feed")
render_template = False
fieldsets = (
(_('Settings'), {
'fields': ('google_api_key', )
}),
(_('Layout'), {
'fields': ('render_template', 'items', 'truncate_chars')
}),
(_('Activity List'), {
'description': _('List of the activities in the specified '
'collection for a particular user.'),
'fields': ('google_user',)
}),
(_('Activity Search'), {
'description': _('Search public activities. '
'These fields are ignored if the "Google+ '
'User Id" is filled.'),
'fields': ('query', 'preferred_language', 'order_by')
}),
)
def render(self, context, instance, placeholder):
context['instance'] = instance
activity_list = self.get_latest_activities(instance) \
if instance.google_user else self.get_search_activities(instance)
context['activity_list'] = self.parse_datetime(activity_list)
return context
def get_latest_activities(self, instance):
"""
:param instance: the GooglePlusActivities instance
:type instance: GooglePlusActivities
:returns: list of dictionaries -- the recent activities:
https://developers.google.com/+/api/latest/activities
Note: Activities are returned from the activities.list method in the
same order that they are displayed on the google+ page. This means that
while the first pages contain newer activities, older activities may
be bumped up. See `this open ticket
`_
"""
key_name = instance.get_cache_key(instance.pk)
activity_list = cache.get(key_name, None)
if not activity_list:
googleplus_api = GooglePlusAPI(
developer_key=instance.google_api_key)
activity_list = googleplus_api.get_user_activity_list(
user_id=instance.google_user, results=instance.items)
cache.set(key_name, activity_list,
GOOGLEPLUS_PLUGIN_CACHE_DURATION)
return activity_list
def get_search_activities(self, instance):
key_name = instance.get_cache_key(instance.pk)
activity_list = cache.get(key_name, None)
if not activity_list:
googleplus_api = GooglePlusAPI(
developer_key=instance.google_api_key)
activity_list = googleplus_api.get_search_activity_list(
query=instance.query,
preferred_language=instance.preferred_language,
order_by=instance.order_by,
results=instance.items)
cache.set(key_name, activity_list,
GOOGLEPLUS_PLUGIN_CACHE_DURATION)
return activity_list
def parse_datetime(self, activity_list):
"""
Cleans up the activities given by the api:
Google+ API uses RFC3339 format for dates like published date of an
activity.
We need to parse these dates so they will be displayed in a nicer way.
"""
parsed_activity_list = []
for activity in activity_list:
published = activity.get('published', None)
updated = activity.get('updated', None)
if published:
activity['published'] = parse(published)
if updated:
activity['updated'] = parse(updated)
parsed_activity_list.append(activity)
return parsed_activity_list
plugin_pool.register_plugin(GooglePlusActivitiesPlugin)
PK S}G간V
V
cmsplugin_googleplus/globals.pyfrom __future__ import unicode_literals
from django.utils.translation import ugettext_lazy as _
# The following language codes are available for search methods in people
# and activities resources
# https://developers.google.com/+/api/search#available-languages
AFRIKAANS = 'af'
AMHARIC = 'am'
ARABIC = 'ar'
BASQUE = 'eu'
BENGALI = 'bn'
BULGARIAN = 'bg'
CATALAN = 'ca'
CHINESE_HONG_KONG = 'zh-HK'
CHINESE_SIMPLIFIED = 'zh-CN'
CHINESE_TRADITIONAL = 'zh-TW'
CROATIAN = 'hr'
CZECH = 'cs'
DANISH = 'da'
DUTCH = 'nl'
ENGLISH_UK = 'en-GB'
ENGLISH_US = 'en-US'
ESTONIAN = 'et'
FILIPINO = 'fil'
FINNISH = 'fi'
FRENCH = 'fr'
FRENCH_CANADIAN = 'fr-CA'
GALICIAN = 'gl'
GERMAN = 'de'
GREEK = 'el'
GUJARATI = 'gu'
HEBREW = 'iw'
HINDI = 'hi'
HUNGARIAN = 'hu'
ICELANDIC = 'is'
INDONESIAN = 'id'
ITALIAN = 'it'
JAPANESE = 'ja'
KANNADA = 'kn'
KOREAN = 'ko'
LATVIAN = 'lv'
LITHUANIAN = 'lt'
MALAY = 'ms'
MALAYALAM = 'ml'
MARATHI = 'mr'
NORWEGIAN = 'no'
PERSIAN = 'fa'
POLISH = 'pl'
PORTUGUESE_BRAZIL = 'pt-BR'
PORTUGUESE_PORTUGAL = 'pt-PT'
ROMANIAN = 'ro'
RUSSIAN = 'ru'
SERBIAN = 'sr'
SLOVAK = 'sk'
SLOVENIAN = 'sl'
SPANISH = 'es'
SPANISH_LATIN_AMERICA = 'es-419'
SWAHILI = 'sw'
SWEDISH = 'sv'
TAMIL = 'ta'
TELUGU = 'te'
THAI = 'th'
TURKISH = 'tr'
UKRAINIAN = 'uk'
URDU = 'ur'
VIETNAMESE = 'vi'
ZULU = 'zu'
GOOGLEPLUS_PLUGIN_LANGUAGE_CHOICES = (
(AFRIKAANS, _('Afrikaans')),
(AMHARIC, _('Amharic')),
(ARABIC, _('Arabic')),
(BASQUE, _('Basque')),
(BENGALI, _('Bengali')),
(BULGARIAN, _('Bulgarian')),
(CATALAN, _('Catalan')),
(CHINESE_HONG_KONG, _('Chinese (Hong Kong)')),
(CHINESE_SIMPLIFIED, _('Chinese (Simplified)')),
(CHINESE_TRADITIONAL, _('Chinese (Traditional)')),
(CROATIAN, _('Croatian')),
(CZECH, _('Czech')),
(DANISH, _('Danish')),
(DUTCH, _('Dutch')),
(ENGLISH_UK, _('English (UK)')),
(ENGLISH_US, _('English (US)')),
(ESTONIAN, _('Estonian')),
(FILIPINO, _('Filipino')),
(FINNISH, _('Finnish')),
(FRENCH, _('French')),
(FRENCH_CANADIAN, _('French (Canadian)')),
(GALICIAN, _('Galician')),
(GERMAN, _('German')),
(GREEK, _('Greek')),
(GUJARATI, _('Gujarati')),
(HEBREW, _('Hebrew')),
(HINDI, _('Hindi')),
(HUNGARIAN, _('Hungarian')),
(ICELANDIC, _('Icelandic')),
(INDONESIAN, _('Indonesian')),
(ITALIAN, _('Italian')),
(JAPANESE, _('Japanese')),
(KANNADA, _('Kannada')),
(KOREAN, _('Korean')),
(LATVIAN, _('Latvian')),
(LITHUANIAN, _('Lithuanian')),
(MALAY, _('Malay')),
(MALAYALAM, _('Malayalam')),
(MARATHI, _('Marathi')),
(NORWEGIAN, _('Norwegian')),
(PERSIAN, _('Persian')),
(POLISH, _('Polish')),
(PORTUGUESE_BRAZIL, _('Portuguese (Brazil)')),
(PORTUGUESE_PORTUGAL, _('Portuguese (Portugal)')),
(ROMANIAN, _('Romanian')),
(RUSSIAN, _('Russian')),
(SERBIAN, _('Serbian')),
(SLOVAK, _('Slovak')),
(SLOVENIAN, _('Slovenian')),
(SPANISH, _('Spanish')),
(SPANISH_LATIN_AMERICA, _('Spanish (Latin America)')),
(SWAHILI, _('Swahili')),
(SWEDISH, _('Swedish')),
(TAMIL, _('Tamil')),
(TELUGU, _('Telugu')),
(THAI, _('Thai')),
(TURKISH, _('Turkish')),
(UKRAINIAN, _('Ukrainian')),
(URDU, _('Urdu')),
(VIETNAMESE, _('Vietnamese')),
(ZULU, _('Zulu')),
)
BEST = 'best'
RECENT = 'recent'
GOOGLEPLUS_PLUGIN_ORDER_BY_CHOICES = (
(BEST, _('best')),
(RECENT, _('recent'))
)
PK |}GB cmsplugin_googleplus/conf.pyfrom __future__ import unicode_literals
from django.conf import settings
from django.utils.translation import ugettext_lazy as _
DEFAULT_PLUGIN_TEMPLATES = (
('cmsplugin_googleplus/twitter_bootstrap.html',
_('Example Template using Twitter Bootstrap')),
)
GOOGLEPLUS_PLUGIN_CACHE_DURATION = getattr(
settings, 'GOOGLEPLUS_PLUGIN_CACHE_DURATION', 60*5)
GOOGLEPLUS_PLUGIN_TEMPLATES = getattr(
settings, 'GOOGLEPLUS_PLUGIN_TEMPLATES', DEFAULT_PLUGIN_TEMPLATES)
PK eFH^U_ _ 4 cmsplugin_googleplus/locale/pl/LC_MESSAGES/django.po# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Michał Fita , 2016
msgid ""
msgstr ""
"Project-Id-Version: cmsplugin-googleplus\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-11-29 17:50+0100\n"
"PO-Revision-Date: 2016-01-30 17:02+0000\n"
"Last-Translator: Michał Fita \n"
"Language-Team: Polish (http://www.transifex.com/itbabu/cmsplugin-googleplus/language/pl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pl\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: cms_plugins.py:19
msgid "Google Plus Activity Feed"
msgstr "Kanał aktywności Google Plus"
#: cms_plugins.py:22
msgid "Settings"
msgstr "Ustawienia"
#: cms_plugins.py:25
msgid "Layout"
msgstr "Układ"
#: cms_plugins.py:28
msgid "Activity List"
msgstr "Lista aktywności"
#: cms_plugins.py:29
msgid ""
"List of the activities in the specified collection for a particular user."
msgstr "Wykaz aktywności w określonej kolekcji dla danego użytkownika."
#: cms_plugins.py:33
msgid "Activity Search"
msgstr "Szukanie aktywności"
#: cms_plugins.py:34
msgid ""
"Search public activities. These fields are ignored if the \"Google+ User "
"Id\" is filled."
msgstr "Szukaj publicznej aktywności. Te pola są ignorowane, jeśli wypełnione jest \"Google+ id użytkownika\"."
#: conf.py:8
msgid "Example Template using Twitter Bootstrap"
msgstr "Przykładowy szablon używający Twitter Bootstrap"
#: globals.py:71
msgid "Afrikaans"
msgstr "Afrykanerski"
#: globals.py:72
msgid "Amharic"
msgstr "Amharski"
#: globals.py:73
msgid "Arabic"
msgstr "Arabski"
#: globals.py:74
msgid "Basque"
msgstr "Baskijski"
#: globals.py:75
msgid "Bengali"
msgstr "Bengalski"
#: globals.py:76
msgid "Bulgarian"
msgstr "Bułgarski"
#: globals.py:77
msgid "Catalan"
msgstr "Kataloński"
#: globals.py:78
msgid "Chinese (Hong Kong)"
msgstr "Chiński (Honk Kong)"
#: globals.py:79
msgid "Chinese (Simplified)"
msgstr "Chiński (Tradycyjny)"
#: globals.py:80
msgid "Chinese (Traditional)"
msgstr "Chiński (Uproszczony)"
#: globals.py:81
msgid "Croatian"
msgstr "Chorwacki"
#: globals.py:82
msgid "Czech"
msgstr "Czeski"
#: globals.py:83
msgid "Danish"
msgstr "Duński"
#: globals.py:84
msgid "Dutch"
msgstr "Holenderski"
#: globals.py:85
msgid "English (UK)"
msgstr "Angielski (Brytyjski)"
#: globals.py:86
msgid "English (US)"
msgstr "Angielski (Amerykański)"
#: globals.py:87
msgid "Estonian"
msgstr "Estoński"
#: globals.py:88
msgid "Filipino"
msgstr "Filipiński"
#: globals.py:89
msgid "Finnish"
msgstr "Fiński"
#: globals.py:90
msgid "French"
msgstr "Francuski"
#: globals.py:91
msgid "French (Canadian)"
msgstr "Francuski (Kanadyjski)"
#: globals.py:92
msgid "Galician"
msgstr "Galicyjski"
#: globals.py:93
msgid "German"
msgstr "Niemiecki"
#: globals.py:94
msgid "Greek"
msgstr "Grecki"
#: globals.py:95
msgid "Gujarati"
msgstr "Gudżarati"
#: globals.py:96
msgid "Hebrew"
msgstr "Hebrajski"
#: globals.py:97
msgid "Hindi"
msgstr "Hindi"
#: globals.py:98
msgid "Hungarian"
msgstr "Węgierski"
#: globals.py:99
msgid "Icelandic"
msgstr "Islandzki"
#: globals.py:100
msgid "Indonesian"
msgstr "Indonezyjski"
#: globals.py:101
msgid "Italian"
msgstr "Włoski"
#: globals.py:102
msgid "Japanese"
msgstr "Japoński"
#: globals.py:103
msgid "Kannada"
msgstr "Kannada"
#: globals.py:104
msgid "Korean"
msgstr "Koreański"
#: globals.py:105
msgid "Latvian"
msgstr "Łotewski"
#: globals.py:106
msgid "Lithuanian"
msgstr "Litewski"
#: globals.py:107
msgid "Malay"
msgstr "Malajski"
#: globals.py:108
msgid "Malayalam"
msgstr "Malajalam"
#: globals.py:109
msgid "Marathi"
msgstr "Marathi"
#: globals.py:110
msgid "Norwegian"
msgstr "Norweski"
#: globals.py:111
msgid "Persian"
msgstr "Perski"
#: globals.py:112
msgid "Polish"
msgstr "Polski"
#: globals.py:113
msgid "Portuguese (Brazil)"
msgstr "Portugalski (Brazylijski)"
#: globals.py:114
msgid "Portuguese (Portugal)"
msgstr "Portugalski"
#: globals.py:115
msgid "Romanian"
msgstr "Rumuński"
#: globals.py:116
msgid "Russian"
msgstr "Rosyjski"
#: globals.py:117
msgid "Serbian"
msgstr "Serbski"
#: globals.py:118
msgid "Slovak"
msgstr "Słowacki"
#: globals.py:119
msgid "Slovenian"
msgstr "Słoweński"
#: globals.py:120
msgid "Spanish"
msgstr "Hiszpański"
#: globals.py:121
msgid "Spanish (Latin America)"
msgstr "Hiszpański (Latynoamerykański)"
#: globals.py:122
msgid "Swahili"
msgstr "Suahili"
#: globals.py:123
msgid "Swedish"
msgstr "Szwedzki"
#: globals.py:124
msgid "Tamil"
msgstr "Tamilski"
#: globals.py:125
msgid "Telugu"
msgstr "Telugu"
#: globals.py:126
msgid "Thai"
msgstr "Tajski"
#: globals.py:127
msgid "Turkish"
msgstr "Turecki"
#: globals.py:128
msgid "Ukrainian"
msgstr "Ukraiński"
#: globals.py:129
msgid "Urdu"
msgstr "Urdu"
#: globals.py:130
msgid "Vietnamese"
msgstr "Wietnamski"
#: globals.py:131
msgid "Zulu"
msgstr "Zulu"
#: globals.py:139
msgid "best"
msgstr "najlepszy"
#: globals.py:140
msgid "recent"
msgstr "ostatni"
#: models.py:21
msgid "template"
msgstr "szablon"
#: models.py:23
msgid "item"
msgstr "element"
#: models.py:25
msgid ""
"Number of Google Plus activities to return. From 1 to 100. Default is 10."
msgstr "Ilość aktywności Google Plus do zwrócenia. Od 1 do 100. Domyślnie to 10."
#: models.py:28
msgid "truncate chars"
msgstr "obcinaj znaki"
#: models.py:29
msgid ""
"Truncates the content, annotation and attachment after a certain number of "
"characters."
msgstr "Obcina treści, adnotacji i załączniki po określonej liczbie znaków."
#: models.py:32
msgid "Google+ User Id"
msgstr "Id użytkownika Google+"
#: models.py:33
msgid "The ID of the user to get activities for"
msgstr "Identyfikator użytkownika dla którego pobierać aktywność"
#: models.py:36
msgid "search query"
msgstr "zapytanie"
#: models.py:37
msgid "Full-text search query string."
msgstr "Ciąg zapytania do wyszukiwania pełnotekstowego."
#: models.py:39
msgid "preferred language"
msgstr "preferowany język"
#: models.py:41
msgid "Optional. Specify the preferred language to search with."
msgstr "Opcjonalne. Określa preferowany język wyszukiwania."
#: models.py:44
msgid "order by"
msgstr "kolejność według"
#: models.py:47
msgid ""
"Optional. Specifies how to order search results. 'best': Sort activities by "
"relevance to the user, most relevant first, 'recent': Sort activities by "
"published date, most recent first."
msgstr "Opcjonalne. Określa, jak uporządkować wyniki wyszukiwania. 'najlepsze': sortowanie działań przez odpowiedniość do użytkownika, najbardziej odpowiednie pierwsze, 'najnowsze': kolejność aktywności według daty publikacji, najnowsze na początku."
#: models.py:52
msgid "Google API key"
msgstr "Klucz Google API"
#: models.py:53
msgid ""
"To use the Google+ API, you must register your project on the Google "
"Developers Console and get a Google API key."
msgstr "Aby korzystać z interfejsu API Google+, musisz zarejestrować swój projekt na Konsoli Programistów Google i otrzymać klucz Google API."
#: models.py:73
msgid "\"Google+ user id\" or \"Search query\" must be provided"
msgstr "\"Id użytkownika Google+\" lub \"Zapytanie\" musi być podane"
#: templates/cmsplugin_googleplus/twitter_bootstrap.html:14
msgid "Published"
msgstr "Opublikowane"
#: templates/cmsplugin_googleplus/twitter_bootstrap.html:55
#, python-format
msgid ""
"\n"
" Originally shared by %(shared_by)s\n"
" "
msgstr "\nPierwotnie udostępnione przez %(shared_by)s\n "
PK 8fFHU
4 cmsplugin_googleplus/locale/pl/LC_MESSAGES/django.mo Z T 4
C Q a k s z ( B K S Z l
(
/
7
I >
I
8 ) 3 < V D ( q (
V
" + > E R [ j / X :
' 3 H ^ u 2 $ 1 ;
m x
( 3 = A D M 5 6 = D ^ j w i
) J R [ d k = r H ;
R / L X 8 * H " - 9 N ? = P ( W Z . + <