diff --git a/src/gettext_windows.py b/src/gettext_windows.py deleted file mode 100644 index 762d8180..00000000 --- a/src/gettext_windows.py +++ /dev/null @@ -1,105 +0,0 @@ -# Copyright (c) 2006, 2007, 2010 Alexander Belchenko -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -"""Helper for standard gettext.py on Windows. - -Module obtains user language code on Windows to use with standard -Python gettext.py library. - -The module provides 2 functions: setup_env and get_language. - -You may use setup_env before initializing gettext functions. - -Or you can use get_language to get the list of language codes suitable -to pass them to gettext.find or gettext.translation function. - -Usage example #1: - -import gettext, gettext_windows -gettext_windows.setup_env() -gettext.install('myapp') - -Usage example #2: - -import gettext, gettext_windows -lang = gettext_windows.get_language() -translation = gettext.translation('myapp', languages=lang) -_ = translation.gettext -""" - -import locale -import os -import sys - -OS_WINDOWS = (sys.platform == 'win32') - - -def setup_env_windows(system_lang=True): - """Check environment variables used by gettext - and setup LANG if there is none. - """ - if _get_lang_env_var() is not None: - return - lang = get_language_windows(system_lang) - if lang: - os.environ['LANGUAGE'] = ':'.join(lang) - -def get_language_windows(system_lang=True): - """Get language code based on current Windows settings. - @return: list of languages. - """ - try: - import ctypes - except ImportError: - return [locale.getdefaultlocale()[0]] - # get all locales using windows API - lcid_user = ctypes.windll.kernel32.GetUserDefaultLCID() - lcid_system = ctypes.windll.kernel32.GetSystemDefaultLCID() - if system_lang and lcid_user != lcid_system: - lcids = [lcid_user, lcid_system] - else: - lcids = [lcid_user] - return filter(None, [locale.windows_locale.get(i) for i in lcids]) or None - - -def setup_env_other(system_lang=True): - pass - -def get_language_other(system_lang=True): - lang = _get_lang_env_var() - if lang is not None: - return lang.split(':') - return None - - -def _get_lang_env_var(): - for i in ('LANGUAGE','LC_ALL','LC_MESSAGES','LANG'): - lang = os.environ.get(i) - if lang: - return lang - return None - - -if OS_WINDOWS: - setup_env = setup_env_windows - get_language = get_language_windows -else: - setup_env = setup_env_other - get_language = get_language_other diff --git a/src/gui/buffers/base.py b/src/gui/buffers/base.py index c8160920..df8a225e 100644 --- a/src/gui/buffers/base.py +++ b/src/gui/buffers/base.py @@ -18,6 +18,8 @@ ############################################################ import wx import gui.dialogs +import arrow +import languageHandler import twitter import webbrowser import config @@ -28,7 +30,6 @@ import output import platform import datetime import menus -from twitter import prettydate from multiplatform_widgets import widgets from mysc import event from mysc.thread_utils import call_threaded @@ -150,9 +151,12 @@ class basePanel(wx.Panel): if config.main["general"]["relative_times"] == True: # On windows we need only put the new date on the column, but under linux and mac it isn't possible. if self.system == "Windows": - original_date = datetime.datetime.strptime(self.db.settings[self.name_buffer][self.list.get_selected()]["created_at"], "%a %b %d %H:%M:%S +0000 %Y") - date = original_date-datetime.timedelta(seconds=-self.db.settings["utc_offset"]) - ts = prettydate(original_date) +# self.db.settings[self.name_buffer][self.list.get_selected()]["created_at"] = tweet["created_at"].replace("+0000 ", "") + original_date = arrow.get(self.db.settings[self.name_buffer][self.list.get_selected()]["created_at"], "ddd MMM D H:m:s Z YYYY", locale="en") +# original_date = datetime.datetime.strptime(self.db.settings[self.name_buffer][self.list.get_selected()]["created_at"], "%a %b %d %H:%M:%S +0000 %Y") +# date = original_date-datetime.timedelta(seconds=-self.db.settings["utc_offset"]) + ts = original_date.humanize(locale=languageHandler.getLanguage()) +# prettydate(original_date) self.list.list.SetStringItem(self.list.get_selected(), 2, ts) else: self.list.list.SetString(self.list.get_selected(), " ".join(self.compose_function(self.db.settings[self.name_buffer][self.list.get_selected()], self.db))) diff --git a/src/gui/main.py b/src/gui/main.py index f8b3f939..e7f8ae71 100644 --- a/src/gui/main.py +++ b/src/gui/main.py @@ -350,7 +350,7 @@ class mainFrame(wx.Frame): if i == self.nb.GetPageCount() and deleted > 0: i = i-1 deleted = deleted-1 - log.debug("Starting stream for %s..." % self.nb.GetPage(i).name_buffer) +# log.debug(u"Starting stream for %s..." % self.nb.GetPage(i).name_buffer) info_event = event.infoEvent(event.EVT_STARTED, 1) try: if self.nb.GetPage(i).type == "search": diff --git a/src/languageHandler.py b/src/languageHandler.py index 3af9c6b3..171c53d8 100644 --- a/src/languageHandler.py +++ b/src/languageHandler.py @@ -126,23 +126,27 @@ def setLanguage(lang): elif system == "Darwin": import Foundation localeName = Foundation.NSLocale.currentLocale().identifier() -# trans=gettext.translation('twblue', localedir=paths.locale_path(), languages=[localeName]) -# curLang=localeName - else: - localeName=locale.getdefaultlocale()[0] trans=gettext.translation('twblue', localedir=paths.locale_path(), languages=[localeName]) curLang=localeName +# else: +# localeName=locale.getdefaultlocale()[0] +# trans=gettext.translation('twblue', localedir=paths.locale_path(), languages=[localeName]) +# curLang=localeName else: trans=gettext.translation("twblue", localedir=paths.locale_path(), languages=[lang]) curLang=lang localeChanged=False #Try setting Python's locale to lang - try: +# try: + if system == "Windows": + locale.setlocale(locale.LC_ALL, langToWindowsLocale(lang)) + localeChanged=True + else: locale.setlocale(locale.LC_ALL, lang) localeChanged=True - except: - pass +# except: +# pass if not localeChanged and '_' in lang: #Python couldn'tsupport the language_country locale, just try language. try: @@ -158,7 +162,7 @@ def setLanguage(lang): curLang="en" trans.install(unicode=True) # Install our pgettext function. - __builtin__.__dict__["pgettext"] = makePgettext(trans) +# __builtin__.__dict__["pgettext"] = makePgettext(trans) def getLanguage(): return curLang @@ -178,3 +182,20 @@ def normalizeLanguage(lang): ld[1]=ld[1].upper() return "_".join(ld) +def langToWindowsLocale(lang): + languages = {"en": "eng", + "ar": "ara", + "ca": "cat", + "es": "esp", + "fi": "fin", + "fr": "fre_FRA", + "gl": "glc", + "eu": "euq", + "hu": "hun", + "it": "ita", + "pl": "plk", + "pt": "ptb", + "ru": "rus", + "tr": "trk" + } + return languages[lang] \ No newline at end of file diff --git a/src/locales/es/LC_MESSAGES/twblue.mo b/src/locales/es/LC_MESSAGES/twblue.mo index 016d660c..1ddaed8f 100644 Binary files a/src/locales/es/LC_MESSAGES/twblue.mo and b/src/locales/es/LC_MESSAGES/twblue.mo differ diff --git a/src/locales/es/LC_MESSAGES/twblue.po b/src/locales/es/LC_MESSAGES/twblue.po index 414f3469..34781bd6 100644 --- a/src/locales/es/LC_MESSAGES/twblue.po +++ b/src/locales/es/LC_MESSAGES/twblue.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: TW Blue 0.44\n" "POT-Creation-Date: 2014-12-10 23:20+Hora estándar central (México)\n" -"PO-Revision-Date: 2014-12-10 23:36-0600\n" +"PO-Revision-Date: 2014-12-21 07:01-0600\n" "Last-Translator: Manuel Cortéz \n" "Language-Team: Manuel Cortez \n" "Language: es\n" @@ -2655,7 +2655,7 @@ msgstr "feb" #: ../src\twitter\compose.py:87 msgid "mar" -msgstr "marAmárico" +msgstr "mar" #: ../src\twitter\compose.py:88 msgid "apr" @@ -2663,7 +2663,7 @@ msgstr "abr" #: ../src\twitter\compose.py:89 msgid "may" -msgstr "mayMayo" +msgstr "may" #: ../src\twitter\compose.py:90 msgid "jun" diff --git a/src/locales/es/LC_MESSAGES/wxstd.mo b/src/locales/es/LC_MESSAGES/wxstd.mo new file mode 100644 index 00000000..55076909 Binary files /dev/null and b/src/locales/es/LC_MESSAGES/wxstd.mo differ diff --git a/src/main.py b/src/main.py index f2f7f8e7..31413513 100644 --- a/src/main.py +++ b/src/main.py @@ -22,20 +22,21 @@ A twitter accessible, easy of use and cross platform application.""" import sys from StringIO import StringIO #redirect the original stdout and stderr -stdout=sys.stdout -stderr=sys.stderr +#stdout=sys.stdout +#stderr=sys.stderr # Set a StringIO object as stdout and stderr to avoid problems using the installed version. -sys.stdout = StringIO() -sys.stderr = StringIO() +#sys.stdout = StringIO() +#sys.stderr = StringIO() import wx import os ssmg = None import gui +import wxLangs import paths import config import commandline import platform -from logger import logger as logging +#from logger import logger as logging from sessionmanager import manager from sessionmanager import gui as smGUI manager.setup() @@ -44,15 +45,15 @@ import output import sound import languageHandler #close the memory buffers for stdout and stderr -sys.stdout.close() -sys.stderr.close() +#sys.stdout.close() +#sys.stderr.close() #if it's a binary version -if hasattr(sys, 'frozen'): - sys.stderr = open(paths.logs_path("stderr.log"), 'w') - sys.stdout = open(paths.logs_path("stdout.log"), 'w') -else: - sys.stdout=stdout - sys.stderr=stderr +#if hasattr(sys, 'frozen'): +# sys.stderr = open(paths.logs_path("stderr.log"), 'w') +# sys.stdout = open(paths.logs_path("stdout.log"), 'w') +#else: +# sys.stdout=stdout +# sys.stderr=stderr app = wx.App() #app = wx.App(redirect=True, useBestVisual=True, filename=paths.logs_path('tracebacks.log')) @@ -83,9 +84,11 @@ else: app.Exit() ### I should uncomment this #if platform.system() != "Windows": -# local = wx.Locale(wx.LANGUAGE_DEFAULT) -# local.AddCatalogLookupPathPrefix(paths.locale_path()) -# local.AddCatalog("twblue") +if languageHandler.getLanguage() != "en": + local = wx.Locale(wxLangs.getLanguage()) + local.AddCatalogLookupPathPrefix(paths.locale_path()) + local.AddCatalog("twblue") +#languageHandler.setLanguage(lang) #ap = app(redirect=True, useBestVisual=True, filename=paths.logs_path('tracebacks.log')) #wx.CallLater(10, start) app.MainLoop() diff --git a/src/mysc/localization.py b/src/mysc/localization.py index c308af24..cf4fe839 100644 --- a/src/mysc/localization.py +++ b/src/mysc/localization.py @@ -1,7 +1,12 @@ -import gettext_windows, os +import os +import languageHandler def get(rootFolder): - defaultLocale = gettext_windows.get_language()[0][:2] +# defaultLocale = gettext_windows.get_language()[0][:2] + defaultLocale = languageHandler.curLang + if len(defaultLocale) > 2: + defaultLocale = defaultLocale[:2] + print defaultLocale if os.path.exists(rootFolder+"/"+defaultLocale): return defaultLocale else: diff --git a/src/twitter/__init__.py b/src/twitter/__init__.py index c31a81fe..2093f5f5 100644 --- a/src/twitter/__init__.py +++ b/src/twitter/__init__.py @@ -1,2 +1 @@ -import buffers, utils, compose, starting, twitter -from compose import prettydate \ No newline at end of file +import utils, buffers, starting, twitter \ No newline at end of file diff --git a/src/twitter/buffers/stream.py b/src/twitter/buffers/stream.py index 3dc8664c..81700f6d 100644 --- a/src/twitter/buffers/stream.py +++ b/src/twitter/buffers/stream.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- -from twitter import compose, utils +from twitter.compose import compose_event +from twitter import utils from twython import TwythonStreamer import sound from mysc import event @@ -157,7 +158,7 @@ class streamer(TwythonStreamer): if list != None: self.db.settings["lists"].pop(list) self.parent.remove_list(data["target_object"]["id"]) if config.main["other_buffers"]["show_events"] == True: - evento = compose.compose_event(data, self.db.settings["user_name"]) + evento = compose_event(data, self.db.settings["user_name"]) tweet_event = event.event(event.EVT_OBJECT, 1) tweet_event.SetItem(evento) text = evento[1] diff --git a/src/twitter/compose.py b/src/twitter/compose.py index d2d17aaa..7cfc21de 100644 --- a/src/twitter/compose.py +++ b/src/twitter/compose.py @@ -2,100 +2,17 @@ import utils import re import htmlentitydefs -import datetime -import time import output -import gettext, paths, locale, gettext_windows -import config, languageHandler -if config.main != None: - languageHandler.setLanguage(config.main["general"]["language"]) -else: +import paths +import config, languageHandler, locale +if config.main == None: languageHandler.setLanguage("system") import platform system = platform.system() import logging as original_logger log = original_logger.getLogger("events") - -def prettydate(d): - """ Converts a string to the relative time.""" - diff = datetime.datetime.utcnow() - d - s = diff.seconds - if diff.days > 7 and diff.days < 14: - return _(u"About a week ago") - elif diff.days > 14 and diff.days < 31: - return _(u"About {} weeks ago").format(diff.days/7) - elif diff.days > 31 and diff.days <= 62: - return _(u"A month ago") - elif diff.days >62 and diff.days <= 365: - return _(u"About {} months ago").format(diff.days/30) - elif diff.days > 365 and diff.days <= 730: - return _(u"About a year ago") - elif diff.days > 730: - return _(u"About {} years ago").format(diff.days/365) - elif diff.days == 1: - return _(u"About 1 day ago") - elif diff.days > 1: - return _(u"About {} days ago").format(diff.days) - elif s <= 1: - return _(u"just now") - elif s < 60: - return _(u"{} seconds ago").format(s) - elif s < 120: - return _(u"1 minute ago") - elif s < 3600: - return _(u"{} minutes ago").format(s/60) - elif s < 7200: - return _(u"About 1 hour ago") - else: - return _(u"About {} hours ago").format(s/3600) - -# Months, days, short_months and short_days are used to translate the string that Twitter gives to us with the date and time. -months = { -"January": _(u"January"), -"February": _(u"February"), -"March": _(u"March"), -"April": _(u"April"), -"May": _(u"May"), -"June": _(u"June"), -"July": _(u"July"), -"August": _(u"August"), -"September": _(u"September"), -"October": _(u"October"), -"November": _(u"November"), -"December": _(u"December"), -} - -days = {"Sunday": _(u"Sunday"), -"Monday": _(u"Monday"), -"Tuesday": _(u"Tuesday"), -"Wednesday": _(u"Wednesday"), -"Thursday": _(u"Thursday"), -"Friday": _(u"Friday"), -"Saturday": _(u"Saturday")} - -short_days = { - "Sun": _(u"sun"), - "Mon": _(u"mon"), - "Tue": _(u"tue"), - "Wed": _(u"wed"), - "Thu": _(u"thu"), - "Fri": _(u"fri"), - "Sat": _(u"sat") - } - -short_months = { - "Jan": _(u"jan"), - "Feb": _(u"feb"), - "Mar": _(u"mar"), - "Apr": _(u"apr"), - "May": _(u"may"), - "Jun": _(u"jun"), - "Jul": _(u"jul"), - "Aug": _(u"aug"), - "Sep": _(u"sep"), - "Oct": _(u"oct"), - "Nov": _(u"nov"), - "Dec": _(u"dec")} +import time +import arrow def StripChars(s): """Converts any html entities in s to their unicode-decoded equivalents and returns a string.""" @@ -110,44 +27,15 @@ def StripChars(s): return replacement.decode('iso-8859-1') return unicode(entity_re.sub(matchFunc, s)) -def translate(string): - """ Changes the days in English for the current language. Needed for Windows.""" - if system != "Windows": return string - else: - global months, days - for d in months: - string = string.replace(d, months[d]) - for d in days: - string = string.replace(d, days[d]) - return string - -def translate_short(string): - """ Changes the English date from Twitter to a local date and time. Needed for datetime on Linux.""" - if system != "Linux": return string - else: -# if 1 == 1: - global short_months, short_days - for d in short_months: - string = string.replace(d, short_months[d]) - for d in short_days: - string = string.replace(d, short_days[d]) - return string - chars = "abcdefghijklmnopqrstuvwxyz" def compose_tweet(tweet, db): """ It receives a tweet and returns a list with the user, text for the tweet or message, date and the client where user is.""" -# original_date = datetime.datetime.strptime(translate_short(tweet["created_at"]).encode("utf-8"), "%a %b %d %H:%M:%S +0000 %Y") - original_date = datetime.datetime.strptime(tweet["created_at"], "%a %b %d %H:%M:%S +0000 %Y") -# else: -# original_date = datetime.datetime.strptime(tweet["created_at"], '%a %b %d %H:%M:%S +0000 %Y') - date = original_date-datetime.timedelta(seconds=-db.settings["utc_offset"]) + original_date = arrow.get(tweet["created_at"], "ddd MMM D H:m:s Z YYYY", locale="en") if config.main["general"]["relative_times"] == True: - ts = prettydate(original_date) + ts = original_date.humanize(locale=languageHandler.getLanguage()) else: -# ts = translate(datetime.datetime.strftime(date, _("%A, %B %d, %Y at %I:%M:%S %p".encode("utf-8"))).decode("utf-8")) - ts = translate(datetime.datetime.strftime(date, _("%A, %B %d, %Y at %I:%M:%S %p"))) -# ts = tweet["created_at"] + ts = original_date.replace(seconds=db.settings["utc_offset"]).format(_(u"dddd, MMMM D, YYYY H:m:s"), locale=languageHandler.getLanguage()) text = StripChars(tweet["text"]) if tweet.has_key("sender"): source = "DM" @@ -167,23 +55,18 @@ def compose_tweet(tweet, db): return [user+", ", tweet["text"], ts+", ", source] def compose_followers_list(tweet, db): -# original_date = datetime.datetime.strptime(translate_short(tweet["created_at"]).encode("utf-8"), '%a %b %d %H:%M:%S +0000 %Y') - original_date = datetime.datetime.strptime(tweet["created_at"], '%a %b %d %H:%M:%S +0000 %Y') - date = original_date-datetime.timedelta(seconds=-db.settings["utc_offset"]) + original_date = arrow.get(tweet["created_at"], "ddd MMM D H:m:s Z YYYY", locale="en") if config.main["general"]["relative_times"] == True: - ts = prettydate(original_date) + ts = original_date.humanize(locale=languageHandler.getLanguage()) else: - ts = translate(datetime.datetime.strftime(date, _(u"%A, %B %d, %Y at %I:%M:%S %p"))) -# ts = tweet["created_at"] + ts = original_date.replace(seconds=db.settings["utc_offset"]).format(_(u"dddd, MMMM D, YYYY H:m:s"), locale=languageHandler.getLanguage()) if tweet.has_key("status"): if len(tweet["status"]) > 4: -# original_date2 = datetime.datetime.strptime(translate_short(tweet["status"]["created_at"]).encode("utf-8"), '%a %b %d %H:%M:%S +0000 %Y') - original_date2 = datetime.datetime.strptime(tweet["status"]["created_at"], '%a %b %d %H:%M:%S +0000 %Y') - date2 = original_date2-datetime.timedelta(seconds=-db.settings["utc_offset"]) + original_date2 = arrow.get(tweet["status"]["created_at"], "ddd MMM D H:m:s Z YYYY", locale="en") if config.main["general"]["relative_times"]: - ts2 = prettydate(original_date2) + ts2 = original_date2.humanize(locale=languageHandler.getLanguage()) else: - ts2 = translate(datetime.datetime.strftime(date2, _(u"%A, %B %d, %Y at %I:%M:%S %p"))) + ts2 = original_date2.replace(seconds=db.settings["utc_offset"]).format(_(u"dddd, MMMM D, YYYY H:m:s"), locale=languageHandler.getLanguage()) else: ts2 = _("Unavailable") return [_(u"%s (@%s). %s followers, %s friends, %s tweets. Last tweet on %s. Joined Twitter on %s") % (tweet["name"], tweet["screen_name"], tweet["followers_count"], tweet["friends_count"], tweet["statuses_count"], ts2, ts)] @@ -229,7 +112,6 @@ def compose_event(data, username): else: log.error("event: %s\n target: %s\n source: %s\n" % (data["event"], data["target"], data["source"])) event = _("Unknown") -# output.speak(event) return [time.strftime("%I:%M %p"), event] def compose_list(list): diff --git a/src/wxLangs.py b/src/wxLangs.py new file mode 100644 index 00000000..bea2515c --- /dev/null +++ b/src/wxLangs.py @@ -0,0 +1,21 @@ +import wx +import languageHandler + +def getLanguage(): + lang = languageHandler.getLanguage() + languages = {"ar": wx.LANGUAGE_ARABIC, + "ca": wx.LANGUAGE_CATALAN, + "en": wx.LANGUAGE_ENGLISH, + "es": wx.LANGUAGE_SPANISH, + "eu": wx.LANGUAGE_BASQUE, + "fr": wx.LANGUAGE_FRENCH, + "fi": wx.LANGUAGE_FINNISH, + "gl": wx.LANGUAGE_GALICIAN, + "hu": wx.LANGUAGE_HUNGARIAN, + "it": wx.LANGUAGE_ITALIAN, + "pl": wx.LANGUAGE_POLISH, + "pt": wx.LANGUAGE_PORTUGUESE, + "ru": wx.LANGUAGE_RUSSIAN, + "tr": wx.LANGUAGE_TURKISH, + } + return languages[lang] \ No newline at end of file