sr0wx/lib/rozne/pl_google.py

518 wiersze
20 KiB
Python
Executable File

# -*- coding: utf-8 -*-
#
# Copyright 2009-2012 Michal Sadowski (sq6jnx at hamradio dot pl)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# *********
# pl_google/pl_google.py
# *********
#
# This file defines language dependent functions and variables. Probably
# this is the most important file in whole package.
#
# ============
# Requirements
# ============
#
# This package *may* import some other packages, it is up to you (and your
# needs).
#
# BUT: this packahe **must** define the following functions:
# * ``direction()`` which "translates" direction given by letters into
# its word representation
# * ``removeDiacritics()`` which removes diacritics
# * ``readISODT()`` "translates" date and time into its word representation
# * ``cardinal()`` which changes numbers into words (1 -> one)
#
# As you probably can see all of these functions are language-dependant.
#
# ======================
# Implementation example
# ======================
#
# Here is implementation example for Polish language. Polish is interresting
# because it uses diacritics and 7 (seven) gramatical cases[#]_ (among many
# other features ;)
#
# .. [*] http://pl.wikipedia.org/wiki/Przypadek#Przypadki_w_j.C4.99zyku_polskim
#
# There *may* be some issues with diacritics because there are many
# implementations [#]. For example, Windows uses its own coding system while
# Linux uses UTF-8 (I think). And, when moving files (which are named with
# diacritics) from one platform to another results may (will) be
# unexpectable.
#
# .. [#] http://pl.wikipedia.org/wiki/Kodowanie_polskich_znak%C3%B3w
#
# =====================
# Polish dictionary
# =====================
#
# Concept: to make things clear, easy to debug and to
# internationalize. Program *doesn't use words* but *filenames*.
# So, if somewhere in programme variable's value or function returnes
# ie. *windy* it should be regarded as a *filename*, ``windy.ogg``.
#
# Beware too short words, it will be like machine gun rapid fire or
# will sound like a cyborg from old, cheap sci-fi movie. IMO the good way
# is to record longer phrases, like *"the temperature is"*, save it as
# ``the_temperature_is.ogg`` and use it's filename (``the_temperature_is``)
# as a return value.
#
# This dictionary is used by all SR0WX modules.
fake_gettext = lambda(s): s
_ = fake_gettext
# Units and grammar cases
hrs = ["","godziny","godzin"]
hPa = ["hektopaskal", "hektopaskale", "hektopaskali"]
percent = [u"procent",u"procent",u"procent"]
mPs = ["metr_na_sekunde", "metry_na_sekunde", "metrow_na_sekunde"]
kmPh = ["kilometr_na_godzine", "kilometry_na_godzine", "kilometrow_na_godzine"]
MiPh = ["", "", ""] # miles per hour -- not used
windStrength = "sila_wiatru"
deg = [u"stopien","stopnie","stopni"]
C = ["stopien_celsjusza", "stopnie_celsjusza", "stopni_celsjusza"]
km = ["kilometr", "kilometry", u"kilometrow"]
mns = ["minuta","minuty","minut"]
tendention = ['tendencja_spadkowa','', 'tendencja_wzrostowa']
# We need also local names for directions to convert two- or three letters
# long wind direction into words (first is used as prefix, second as suffix):
directions = { "N": ("północno ", "północny"),
"E": ("wschodnio ", "wschodni"),
"W": ("zachodnio ", "zachodni"),
"S": ("południowo ", "południowy") }
# numbers
jednostkiM = [u""] + u"jeden dwa trzy cztery pięć sześć siedem osiem dziewięć".split()
jednostkiF = [u""] + u"jedną dwie trzy cztery pięć sześć siedem osiem dziewięć".split()
dziesiatki = [u""] + u"""dziesięć dwadzieścia trzydzieści czterdzieści
pięćdziesiąt sześćdziesiąt siedemdziesiąt osiemdziesiąt dziewięćdziesiąt""".split()
nastki = u"""dziesięć jedenaście dwanaście trzynaście czternaście piętnaście
szesnaście siedemnaście osiemnaście dziewiętnaście""".split()
setki = [u""]+ u"""sto dwieście trzysta czterysta pięćset sześćset siedemset osiemset
dziewięćset""".split()
ws=u"""x x x
tysiąc tysiące tysięcy
milion miliony milionów
miliard miliardy miliardów
bilion biliony bilionów"""
wielkie = [ l.split() for l in ws.split('\n') ]
##zlotowki=u"""złoty złote złotych""".split()
##grosze=u"""grosz grosze groszy""".split()
# There are also some functions, by dowgird, so I haven't even looked into
# them.
def _slownie3cyfry(liczba, plec='M'):
if plec=='M':
jednostki = jednostkiM
else:
jednostki = jednostkiF
je = liczba % 10
dz = (liczba//10) % 10
se = (liczba//100) % 10
slowa=[]
if se>0:
slowa.append(setki[se])
if dz==1:
slowa.append(nastki[je])
else:
if dz>0:
slowa.append(dziesiatki[dz])
if je>0:
slowa.append(jednostki[je])
retval = " ".join(slowa)
return retval
def _przypadek(liczba):
je = liczba % 10
dz = (liczba//10) % 10
if liczba == 1:
typ = 0 #jeden tysiąc"
elif dz==1 and je>1: # naście tysięcy
typ = 2
elif 2<=je<=4:
typ = 1 # [k-dziesiąt/set] [dwa/trzy/czery] tysiące
else:
typ = 2 # x tysięcy
return typ
def lslownie(liczba, plec='M'):
"""Liczba całkowita słownie"""
trojki = []
if liczba==0:
return u'zero'
while liczba>0:
trojki.append(liczba % 1000)
liczba = liczba // 1000
slowa = []
for i,n in enumerate(trojki):
if n>0:
if i>0:
p = _przypadek(n)
w = wielkie[i][p]
slowa.append(_slownie3cyfry(n, plec)+u" "+w)
else:
slowa.append(_slownie3cyfry(n, plec))
slowa.reverse()
return ' '.join(slowa)
def cosslownie(liczba,cos, plec='M'):
"""Słownie "ileś cosiów"
liczba - int
cos - tablica przypadków [coś, cosie, cosiów]"""
#print liczba
#print cos[_przypadek(liczba)]
return lslownie(liczba, plec)+" " + cos[_przypadek(liczba)]
##def kwotaslownie(liczba, format = 0):
## """Słownie złotych, groszy.
##
## liczba - float, liczba złotych z groszami po przecinku
## format - jesli 0, to grosze w postaci xx/100, słownie w p. przypadku
## """
## lzlotych = int(liczba)
## lgroszy = int (liczba * 100 + 0.5 ) % 100
## if format!=0:
## groszslownie = cosslownie(lgroszy, grosze)
## else:
## groszslownie = '%d/100' % lgroszy
## return cosslownie(lzlotych, przypzl) + u" " + groszslownie
##
# As you remember, ``cardinal()`` must be defined, this is the function which
# will be used by SR0WX modules. This functions was also written by dowgrid,
# modified by me. (Is function's name proper?)
def cardinal(no, units=[u"",u"",u""], gender='M'):
"""Zamienia liczbę zapisaną cyframi na zapis słowny, opcjonalnie z jednostkami
w odpowiednim przypadku. Obsługuje liczby ujemne."""
if no<0:
return (u"minus " + cosslownie(-no, units, plec=gender)).replace(u"jeden tysiąc", u"tysiąc",1).encode("utf-8")
else:
return cosslownie(no, units, plec=gender).replace(u"jeden tysiąc", u"tysiąc",1).encode("utf-8")
# This one tiny simply removes diactrics (lower case only). This function
# must be defined even if your language doesn't use diactrics (like English),
# for example as a simple ``return text``.
def removeDiacritics(text, remove_spaces=False):
rv= text.replace("ą","a").replace("ć","c").replace("ę","e").\
replace("ł","l").replace("ń","n").replace("ó","o").replace("ś","s").\
replace("ź","z").replace("ż","z")
if remove_spaces==False:
return rv
else:
return rv.replace(' ','_')
# The last one changes ISO structured date time into word representation.
# It doesn't return year value.
def readISODT(ISODT):
_rv=() # return value
y,m,d,hh,mm,ss= ( int(ISODT[0:4]), int(ISODT[5:7]), int(ISODT[8:10]),
int(ISODT[11:13]), int(ISODT[14:16]), int(ISODT[17:19]) )
# miesiąc
_M = ["","stycznia","lutego","marca","kwietnia","maja","czerwca","lipca",
"sierpnia","września","października","listopada","grudnia"]
Mslownie = _M[m]
# dzień
_j = ["","pierwszego","drugiego","trzeciego","czwartego","piątego","szóstego",
"siódmego","ósmego","dziewiątego","dziesiątego","jedenastego",
"dwunastego","trzynastego","czternastego","piętnastego","szesnastego",
"siedemnastego","osiemnastego","dziewiętnastego"]
_d = ["","","dwudziestego","trzydziestego"]
if d<20: Dslownie = _j[d]
else: Dslownie = " ".join( (_d[d/10], _j[d%10]) )
_j = ["zero","pierwsza","druga","trzecia","czwarta","piąta","szósta",
"siódma","ósma","dziewiąta","dziesiąta","jedenasta","dwunasta",
"trzynasta","czternasta","piętnasta","szesnasta","siedemnasta",
"osiemnasta","dziewiętnasta"]
if hh<20: HHslownie = _j[hh]
elif hh==20: HHslownie="dwudziesta"
else: HHslownie = " ".join( ("dwudziesta", _j[hh%10]) )
MMslownie = cardinal(mm).replace("zero","zero_zero")
#return " ".join( (Dslownie, Mslownie, "godzina", HHslownie, MMslownie) )
return " ".join( (Dslownie, Mslownie, "z_godziny", HHslownie, MMslownie) )
def readISODate(ISODate):
_rv=() # return value
y,m,d,hh,mm,ss= ( int(ISODate[0:4]), int(ISODate[5:7]), int(ISODate[8:10]),
int(ISODate[11:13]), int(ISODate[14:16]), int(ISODate[17:19]) )
# miesiąc
_M = ["","stycznia","lutego","marca","kwietnia","maja","czerwca","lipca",
"sierpnia","września","października","listopada","grudnia"]
Mslownie = _M[m]
# dzień
_j = ["","pierwszego","drugiego","trzeciego","czwartego","piątego","szóstego",
"siódmego","ósmego","dziewiątego","dziesiątego","jedenastego",
"dwunastego","trzynastego","czternastego","piętnastego","szesnastego",
"siedemnastego","osiemnastego","dziewiętnastego"]
_d = ["","","dwudziestego","trzydziestego"]
if d<20: Dslownie = _j[d]
else: Dslownie = " ".join( (_d[d/10], _j[d%10]) )
return " ".join( (Dslownie, Mslownie) )
def readHour(dt):
return removeDiacritics(readISODT('0000-00-00 '+str(dt.hour).rjust(2, '0')+':'+str(dt.minute).rjust(2, '0')+':00'))
def readHourLen(hour):
ss = hour.seconds
hh = ss/3600
mm = (ss-hh*3600)/60
return removeDiacritics(" ".join( (cardinal(hh, hrs, gender='F'), cardinal(mm, mns, gender='F')) ))
def readCallsign(call):
rv = ''
for c in call.lower():
if c in 'abcdefghijklmnopqrstuvwxyz':
rv=rv+c+' '
elif c in '0123456789':
rv=rv+removeDiacritics(cardinal(int(c)))+' '
elif c=='/':
rv=rv+'lamane '
return rv
def readFraction(number, precision):
try:
integer, fraction = str(round(number,precision)).split('.')
except TypeError:
return None
pass
rv= ' '.join( (cardinal(int(integer)), comma) )
while fraction[0]=='0':
rv=' '.join( (rv, cardinal(0)), )
fraction.pop(0)
rv=' '.join( (rv, cardinal(int(fraction)),) )
return rv
# ##########################################
#
# module dependant words
# #############################################
class m:
pass
y_weather = m()
y_weather.conditions = {
'0': 'tornado', # tornado
'1': 'burza tropikalna', # tropical storm
'2': 'huragan', # hurricane
'3': 'silne burze', # severe thunderstorms
'4': 'burza', # thunderstorms
'5': 'deszcz ze śniegiem', # mixed rain and snow
'6': 'deszcz i deszcz ze śniegiem', # mixed rain and sleet
'7': 'śnieg i deszcz ze śniegiem', # mixed snow and sleet
'8': 'marznąca mżawka', # freezing drizzle
'9': 'mżawka', # drizzle
'10': 'marznący deszcz', # freezing rain
'11': 'deszcz', # showers
'12': 'deszcz', # showers
'13': 'śnieg', # snow flurries
'14': 'słaby śnieg', # light snow showers
'15': 'zawieje śnieżne', # blowing snow
'16': 'śnieg', # snow
'17': 'grad', # hail
'18': 'deszcz ze śniegiem', # sleet
'19': 'pył', # dust
'20': 'zamglenia', # foggy
'21': 'mgła', # haze
'22': 'smog', # smoky
'23': 'silny wiatr', # blustery
'24': 'wietrznie', # windy
'25': 'przymrozki', # cold
'26': 'pochmurno', # cloudy
'27': 'pochmurno', # mostly cloudy (night)
'28': 'pochmurno', # mostly cloudy (day)
'29': 'częściowe zachmurzenie', # partly cloudy (night)
'30': 'częściowe zachmurzenie', # partly cloudy (day)
'31': 'bezchmurnie', # clear (night)
'32': 'bezchmurnie', # sunny
'33': 'słabe zachmurzenie', # fair (night)
'34': 'słabe zachmurzenie', # fair (day)
'35': 'deszcz i grad', # mixed rain and hail
'36': 'wysokie temperatury', # hot
'37': 'burza', # isolated thunderstorms
'38': 'burza', # scattered thunderstorms
'39': 'burza', # scattered thunderstorms
'40': 'przelotne opady', # scattered showers
'41': 'intensywne opady śniegu', # heavy snow
'42': 'przelotne opady śniegu', # scattered snow showers
'43': 'intensywne opady śniegu', # heavy snow
'44': 'częściowe zachmurzenie', # partly cloudy
'45': 'burza', # thundershowers
'46': 'śnieg', # snow showers
'47': 'burza', # isolated thundershowers
'3200': '', # not available
}
# These dictionaries are used by meteoalarm module.
meteoalarmAwarenesses = [
"",
"silny_wiatr",
"snieg_lub_oblodzenie",
"burze",
"mgly",
"wysokie_temperatury",
"niskie_temperatury",
"zjawiska_strefy_brzegowej",
"pozary_lasow",
"lawiny",
"intensywne_opady_deszczu",
"inne_zagrozenia"]
meteoalarmAwarenessLvl = [
"nieokreslony",
"",
"niski",
"sredni",
"wysoki"]
meteoalarmAwarenessLevel = "poziom_zagrozenia"
meteoalarmRegions = {
'PL001':"mazowieckiego",
'PL002':"lubuskiego",
'PL003':"zachodniopomorskiego",
'PL004':"pomorskiego",
'PL005':"dolnoslaskiego",
'PL006':"opolskiego",
'PL007':"śląskiego",
'PL008':"malopolskiego",
'PL009':"podkarpackiego",
'PL010':"świętokrzyskiego",
'PL011':"łódzkiego",
'PL012':"wielkopolskiego",
'PL013':"kujawsko_pomorskiego",
'PL014':"warminsko_mazurskiego",
'PL015':"lubelskiego",
'PL016':"podlaskiego",
'IE003':"dolnoslaskiego",
}
meteoalarmAwareness = "zagrozenia_meteorologiczne_dla_wojewodztwa"
today = "dzis"
tomorrow = "jutro"
# World Weather Online
wwo_weather_codes = {
'113':'bezchmurnie', # Clear/Sunny
'116':'częściowe zachmurzenie', # Partly Cloudy
'119':'pochmurno', # Cloudy
'122':'zachmurzenie całkowite', # Overcast
'143':'zamglenia', # Mist
'176':'lokalne przelotne opady deszczu', # Patchy rain nearby
'179':'śnieg', # Patchy snow nearby
'182':'śnieg z deszczem', # Patchy sleet nearby
'185':'lokalna przelotna marznąca mżawka', # Patchy freezing drizzle nearby
'200':'lokalne burze', # Thundery outbreaks in nearby
'227':'zamieć śnieżna', # Blowing snow
'230':'zamieć śnieżna', # Blizzard
'248':'mgła', # Fog
'260':'marznąca mgła', # Freezing fog
'263':'mżawka', # Patchy light drizzle
'266':'mżawka', # Light drizzle
'281':'marznąca mżawka', # Freezing drizzle
'284':'marznąca mżawka', # Heavy freezing drizzle
'293':'lokalny słaby deszcz', # Patchy light rain
'296':'słaby deszcz', # Light rain
'299':'przelotne opady deszczu', # Moderate rain at times
'302':'umiarkowane opady deszczu', # Moderate rain
'305':'przelotne ulewy', # Heavy rain at times
'308':'ulewy', # Heavy rain
'311':'słabe opady marznącego deszczu', # Light freezing rain
'314':'umiarkowane opady marznącego deszczu', # Moderate or Heavy freezing rain
'317':'słabe opady śniegu z deszczem', # Light sleet
'320':'umiarkowane lub ciężkie opady śniegu z deszczem', # Moderate or heavy sleet
'323':'słabe opady śniegu', # Patchy light snow
'326':'słabe opady śniegu', # Light snow
'329':'umiarkowane opady śniegu', # Patchy moderate snow
'332':'umiarkowane opady śniegu', # Moderate snow
'335':'opady śniegu', # Patchy heavy snow
'338':'intensywne_opady_sniegu', # Heavy snow
'350':'grad', # Ice pellets
'353':'słabe przelotne opady deszczu', # Light rain shower
'356':'przelotne opady deszczu', # Moderate or heavy rain shower
'359':'ulewny deszcz', # Torrential rain shower
'362':'słabe opady śniegu z deszczem', # Light sleet showers
'365':'umiarkowane opady śniegu z deszczem', # Moderate or heavy sleet showers
'368':'słabe opady śniegu', # Light snow showers
'371':'umiarkowane opady śniegu', # Moderate or heavy snow showers
'374':'słabe opady śniegu ziarnistego', # Light showers of ice pellets
'377':'umiarkowane opady śniegu ziarnistego', # Moderate or heavy showers of ice pellets
'386':'burza', # Patchy light rain in area with thunder
'389':'burza', # Moderate or heavy rain in area with thunder
'392':'burza śnieżna', # Patchy light snow in area with thunder
'395':'burza śnieżna', # Moderate or heavy snow in area with thunder
}
# HSCR_laviny
hscr_welcome = "komunikat_czeskiej_sluzby_ratownictwa_gorskiego"
hscr_region = {"K": "w_karkonoszach obowiazuje", "J": "w_jesionikach_i_masywie_snieznika obowiazuje"}
avalancheLevel = ['']+[i+' stopien_zagrozenia_lawinowego' for i in ['pierwszy', 'drugi', 'trzeci', 'czwarty', 'piaty_najwyzszy'] ]
hscr_tendention = ['', '', 'tendencja_spadkowa', 'tendencja_wzrostowa']
# GOPR_lawiny
gopr_welcome = 'komunikat_gorskiego_ochotniczego_pogotowia_ratunkowego'
gopr_region = ["", "w_karkonoszach obowiazuje", "", "w_regionie_babiej_gory obowiazuje", "w_pieninach obowiazuje", "w_bieszczadach obowiazuje"]
avalancheLevel = ['']+[i+' stopien_zagrozenia_lawinowego' for i in ['pierwszy', 'drugi', 'trzeci', 'czwarty', 'piaty najwyzszy'] ]
gopr_tendention = ['', '', 'tendencja_spadkowa', 'tendencja_wzrostowa']
# povodi_cz
# awareness levels for povodi_cz
povodi_cz_welcome = 'komunikat_czeskiego_instytutu_hydrometeorologicznego'
awalvls = ['',
'stopien_czuwania', # bdelosť State of Alert
'stopien_gotowosci', # pohotovosť State of Emergency
'stopien_zagrozenia', # ohrozenie State of Danger
'stopien_ekstremalnych_powodzi' # extrémna povodeň extreme flood
]
river = 'rzeka'
station = 'wodowskaz'
comma = 'przecinek'
uSiph = 'mikrosiwerta_na_godzine'
radiation_level = 'promieniowanie_tla'
radiation_levels = ['w_normie', 'podwyzszone', 'wysokie']
source='zrodlo'