lunedì 4 febbraio 2013

Python - Impostazioni locali

La prima idea è stata di titolare questo post internazionalizzazione. Ma è davvero orribile, secondo me. E allora ho ripiegato su quello attuale che mi sembra più tranquillo: niente panico!

Intanto con il metacommento magico # -*- coding: utf-8 -*- risolviamo parecchie cose, cioè possiamo usare tutto l'unicode e scrivere cose come queste:


#!/usr/bin/python
# -*- coding: utf-8 -*-

it = "Buongiorno"
ru = "доброе утро"
ar = "صباح الخير"
eb = "הבוקר טוב"
ko = "좋은 아침"
zh = "早安"
gr = "καλημέρα"
hi = "गुड मॉर्निंग"

print "il nostro {0} diventa:\n{1} in russo,".format(it, ru)
print "{0} in arabo,\n{1} in ebraico,\n {2} in coreano,".format(ar, eb, ko)
print "{0} in cinese,\n{1} in greco,\n {2} in hindi.\n".format(zh, gr, hi)



Va quasi bene, in hindi se lo reindirizzate su file con python unicode.py > ut.txt lo vedete così:
il nostro Buongiorno diventa:
доброе утро in russo,
صباح الخير in arabo,
הבוקר טוב in ebraico,
 좋은 아침 in coreano,
早安 in cinese,
καλημέρα in greco,
गुड मॉर्निंग in hindi.
Sì, per l'arabo e l'ebraico c'è il problema della direzione.
Tutto questo sempre che Google Translate funzioni, se del caso prendetevela con lui.

Tutto questo per dire che il testo che seguiamo per questo corso, questo qui è in parte superato.

Ma si possono fare cose come quest'orologio universale, valido per tutti i posti dove abbiamo amici che non vogliamo disturbare nelle ore notturne (ora.py):


#!/usr/bin/python
# -*- coding: utf-8 -*-

import wx
import time

class WorldTime(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, size=(270, 280))

        self.panel = wx.Panel(self, -1)
        self.panel.SetBackgroundColour('#000000')
        font = wx.Font(12, wx.FONTFAMILY_DEFAULT, 
                wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, False, 'Georgia')
        verde = '#23f002'
        self.dt = wx.DateTime()

        self.tokyo = wx.StaticText(self.panel, -1, 
                self.dt.FormatTime() , (20, 20))
        self.tokyo.SetForegroundColour(verde)
        self.tokyo.SetFont(font)

        self.moscow = wx.StaticText(self.panel, -1,  
                self.dt.FormatTime() , (20, 70))
        self.moscow.SetForegroundColour(verde)
        self.moscow.SetFont(font)

        self.rome = wx.StaticText(self.panel, -1,  
                self.dt.FormatTime() , (20, 120))
        self.rome.SetForegroundColour(verde)
        self.rome.SetFont(font)

        self.london = wx.StaticText(self.panel, -1,  
                self.dt.FormatTime() , (20, 170))
        self.london.SetForegroundColour(verde)
        self.london.SetFont(font)

        self.newyork = wx.StaticText(self.panel, -1,  
                self.dt.FormatTime() , (20, 220))
        self.newyork.SetForegroundColour(verde)
        self.newyork.SetFont(font)

        self.OnTimer(None)

        self.timer = wx.Timer(self)
        self.timer.Start(1000)
        self.Bind(wx.EVT_TIMER, self.OnTimer)

        self.Centre()
        self.Show(True)

    def OnTimer(self, evt):
        now = self.dt.Now()
        self.tokyo.SetLabel('Tokyo: ' + str(now.Format(('%a %T'), 
                wx.DateTime.GMT9)))
        self.moscow.SetLabel('Moscow: ' + str(now.Format(('%a %T'), 
                wx.DateTime.MSK)))
        self.rome.SetLabel('Rome: ' +  str(now.Format(('%a %T'), 
                wx.DateTime.CET)))
        self.london.SetLabel('London: ' + str(now.Format(('%a %T'), 
                wx.DateTime.WET)))
        self.newyork.SetLabel('New York: ' + str(now.Format(('%a %T'), 
                wx.DateTime.EDT)))

app = wx.App()
WorldTime(None, -1, 'World Time')
app.MainLoop()


Però attenzione: lo script (ho modificato quello proposto nel sito di ZetCode) è fatto nell'ipotesi che non sia attiva l'ora legale. È vero che è possibile sapere se questa è attiva o no:


come vedete adesso non è attiva, se lo fosse tm_isdst varrebbe 1. Quindi tutto OK? NO! per niente:

DST is Daylight Saving Time, an adjustment of the timezone by (usually) one hour during part of the year. DST rules are magic (determined by local law) and can change from year to year. The C library has a table containing the local rules (often it is read from a system file for flexibility) and is the only source of True Wisdom in this respect.

Il nostro orologio universale avrà bisogno di aggiustre l'ora di tanto in tanto, proprio come quelli normali.

OK, per oggi basta così, nell'attesa che ritorni Bit3Lux vi ricordo che l'indice del corso lo trovate qui.

Nessun commento:

Posta un commento