Merge github.com:web2py/web2py
This commit is contained in:
@@ -29,7 +29,7 @@ update:
|
||||
wget -O gluon/contrib/simplejsonrpc.py http://rad2py.googlecode.com/hg/ide2py/simplejsonrpc.py
|
||||
echo "remember that pymysql was tweaked"
|
||||
src:
|
||||
echo 'Version 2.0.8 ('`date +%Y-%m-%d\ %H:%M:%S`') stable' > VERSION
|
||||
echo 'Version 2.0.9 ('`date +%Y-%m-%d\ %H:%M:%S`') stable' > VERSION
|
||||
### rm -f all junk files
|
||||
make clean
|
||||
### clean up baisc apps
|
||||
|
||||
@@ -1 +1 @@
|
||||
Version 2.0.8 (2012-09-10 11:34:33) stable
|
||||
Version 2.0.9 (2012-09-18 13:39:12) stable
|
||||
|
||||
@@ -15,17 +15,15 @@ from gluon.utils import web2py_uuid
|
||||
from glob import glob
|
||||
import shutil
|
||||
import platform
|
||||
try:
|
||||
from git import *
|
||||
try:
|
||||
from git import *
|
||||
have_git = True
|
||||
except ImportError:
|
||||
except ImportError:
|
||||
have_git = False
|
||||
GIT_MISSING = 'requires python-git module, but not installed or incompatible version'
|
||||
GIT_MISSING = 'requires gitpython module, but not installed or incompatible version'
|
||||
|
||||
from gluon.languages import (regex_language, read_possible_languages,
|
||||
lang_sampling,
|
||||
read_dict, write_dict, read_plural_dict,
|
||||
write_plural_dict, PLURAL_RULES)
|
||||
from gluon.languages import (read_possible_languages, read_dict, write_dict,
|
||||
read_plural_dict, write_plural_dict)
|
||||
|
||||
|
||||
if DEMO_MODE and request.function in ['change_password','pack','pack_plugin','upgrade_web2py','uninstall','cleanup','compile_app','remove_compiled_app','delete','delete_plugin','create_file','upload_file','update_languages','reload_routes','git_push','git_pull']:
|
||||
@@ -368,10 +366,15 @@ def uninstall():
|
||||
else:
|
||||
session.flash = T('no permission to uninstall "%s"', app)
|
||||
redirect(URL('site'))
|
||||
if app_uninstall(app, request):
|
||||
session.flash = T('application "%s" uninstalled', app)
|
||||
else:
|
||||
try:
|
||||
filename = app_pack(app, request, raise_ex=True)
|
||||
except:
|
||||
session.flash = T('unable to uninstall "%s"', app)
|
||||
else:
|
||||
if app_uninstall(app, request):
|
||||
session.flash = T('application "%s" uninstalled', app)
|
||||
else:
|
||||
session.flash = T('unable to uninstall "%s"', app)
|
||||
redirect(URL('site'))
|
||||
return dict(app=app, dialog=dialog)
|
||||
|
||||
@@ -812,7 +815,6 @@ def edit_language():
|
||||
|
||||
def edit_plurals():
|
||||
""" Edit plurals file """
|
||||
#import ipdb; ipdb.set_trace()
|
||||
app = get_app()
|
||||
filename = '/'.join(request.args)
|
||||
plurals = read_plural_dict(apath(filename, r=request)) # plural forms dictionary
|
||||
@@ -949,30 +951,11 @@ def design():
|
||||
statics.sort()
|
||||
|
||||
# Get all languages
|
||||
all_languages=dict([(lang+'.py',info[0]) for lang,info
|
||||
in read_possible_languages(apath(app, r=request)).iteritems()
|
||||
if info[2]!=0]) # info[2] is langfile_mtime:
|
||||
# get only existed files
|
||||
languages = sorted(all_languages)
|
||||
|
||||
plural_rules = {}
|
||||
all_plurals = PLURAL_RULES
|
||||
for langfile,lang in all_languages.iteritems():
|
||||
lang=lang.strip()
|
||||
match_language = regex_language.match(lang)
|
||||
if match_language:
|
||||
match_language = tuple(part
|
||||
for part in match_language.groups()
|
||||
if part)
|
||||
plang = lang_sampling(match_language, all_plurals.keys())
|
||||
if plang:
|
||||
plural=all_plurals[plang]
|
||||
plural_rules[langfile]=(plural[0],plang,plural[4],plural[3])
|
||||
else:
|
||||
plural_rules[langfile]=(0,lang,'plural_rules-%s.py'%lang,'')
|
||||
|
||||
plurals = listdir(apath('%s/languages/' % app, r=request),
|
||||
'^plural-[\w-]+\.py$')
|
||||
languages=dict([(lang,info) for lang,info
|
||||
in read_possible_languages(
|
||||
apath(app, r=request)).iteritems()
|
||||
if info[2]!=0]) # info[2] is langfile_mtime:
|
||||
# get only existed files
|
||||
|
||||
#Get crontab
|
||||
cronfolder = apath('%s/cron' % app, r=request)
|
||||
@@ -1000,8 +983,6 @@ def design():
|
||||
privates=filter_plugins(privates,plugins),
|
||||
statics=filter_plugins(statics,plugins),
|
||||
languages=languages,
|
||||
plurals=plurals,
|
||||
plural_rules=plural_rules,
|
||||
crontab=crontab,
|
||||
plugins=plugins)
|
||||
|
||||
|
||||
+183
-125
@@ -3,143 +3,26 @@
|
||||
'!langcode!': 'it',
|
||||
'!langname!': 'Italiano',
|
||||
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"update" è un\'espressione opzionale come "campo1=\'nuovo valore\'". Non si può fare "update" o "delete" dei risultati di un JOIN ',
|
||||
'%Y-%m-%d': '%d/%m/%Y',
|
||||
'%Y-%m-%d %H:%M:%S': '%d/%m/%Y %H:%M:%S',
|
||||
'%s %%{row} deleted': '%s righe ("record") cancellate',
|
||||
'%s %%{row} updated': '%s righe ("record") modificate',
|
||||
'%Y-%m-%d': '%d/%m/%Y',
|
||||
'%Y-%m-%d %H:%M:%S': '%d/%m/%Y %H:%M:%S',
|
||||
'(requires internet access)': '(requires internet access)',
|
||||
'(something like "it-it")': '(qualcosa simile a "it-it")',
|
||||
'@markmin\x01(file **gluon/contrib/plural_rules/%s.py** is not found)': '(file **gluon/contrib/plural_rules/%s.py** is not found)',
|
||||
'@markmin\x01Searching: **%s** %%{file}': 'Searching: **%s** files',
|
||||
'A new version of web2py is available: %s': 'È disponibile una nuova versione di web2py: %s',
|
||||
'ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.': "ATTENZIONE: L'accesso richiede una connessione sicura (HTTPS) o l'esecuzione di web2py in locale (connessione su localhost)",
|
||||
'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.': 'ATTENTZIONE: NON ESEGUIRE PIÙ TEST IN PARALLELO (I TEST NON SONO "THREAD SAFE")',
|
||||
'ATTENTION: you cannot edit the running application!': "ATTENZIONE: non puoi modificare l'applicazione correntemente in uso ",
|
||||
'About': 'informazioni',
|
||||
'About application': "Informazioni sull'applicazione",
|
||||
'Admin is disabled because insecure channel': 'amministrazione disabilitata: comunicazione non sicura',
|
||||
'Admin language': 'Admin language',
|
||||
'Administrator Password:': 'Password Amministratore:',
|
||||
'Application name:': 'Application name:',
|
||||
'Are you sure you want to delete file "%s"?': 'Confermi di voler cancellare il file "%s"?',
|
||||
'Are you sure you want to delete plugin "%s"?': 'Confermi di voler cancellare il plugin "%s"?',
|
||||
'Are you sure you want to uninstall application "%s"?': 'Confermi di voler disinstallare l\'applicazione "%s"?',
|
||||
'Are you sure you want to upgrade web2py now?': 'Confermi di voler aggiornare web2py ora?',
|
||||
'Available databases and tables': 'Database e tabelle disponibili',
|
||||
'Cannot be empty': 'Non può essere vuoto',
|
||||
'Cannot compile: there are errors in your app:': "Compilazione fallita: ci sono errori nell'applicazione.",
|
||||
'Change admin password': 'change admin password',
|
||||
'Check for upgrades': 'check for upgrades',
|
||||
'Check to delete': 'Seleziona per cancellare',
|
||||
'Checking for upgrades...': 'Controllo aggiornamenti in corso...',
|
||||
'Clean': 'pulisci',
|
||||
'Compile': 'compila',
|
||||
'Controller': 'Controller',
|
||||
'Controllers': 'Controllers',
|
||||
'Copyright': 'Copyright',
|
||||
'Create': 'crea',
|
||||
'Create new simple application': 'Crea nuova applicazione',
|
||||
'Current request': 'Richiesta (request) corrente',
|
||||
'Current response': 'Risposta (response) corrente',
|
||||
'Current session': 'Sessione (session) corrente',
|
||||
'DB Model': 'Modello di DB',
|
||||
'Database': 'Database',
|
||||
'Date and Time': 'Data and Ora',
|
||||
'Delete': 'Cancella',
|
||||
'Delete:': 'Cancella:',
|
||||
'Deploy': 'deploy',
|
||||
'Deploy on Google App Engine': 'Installa su Google App Engine',
|
||||
'EDIT': 'MODIFICA',
|
||||
'Edit': 'modifica',
|
||||
'Edit This App': 'Modifica questa applicazione',
|
||||
'Edit application': 'Modifica applicazione',
|
||||
'Edit current record': 'Modifica record corrente',
|
||||
'Editing Language file': 'Modifica file linguaggio',
|
||||
'Editing file "%s"': 'Modifica del file "%s"',
|
||||
'Enterprise Web Framework': 'Enterprise Web Framework',
|
||||
'Error logs for "%(app)s"': 'Log degli errori per "%(app)s"',
|
||||
'Errors': 'errori',
|
||||
'Exception instance attributes': 'Exception instance attributes',
|
||||
'Functions with no doctests will result in [passed] tests.': 'I test delle funzioni senza "doctests" risulteranno sempre [passed].',
|
||||
'Hello World': 'Salve Mondo',
|
||||
'Help': 'aiuto',
|
||||
'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.': 'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.',
|
||||
'Import/Export': 'Importa/Esporta',
|
||||
'Index': 'Indice',
|
||||
'Install': 'installa',
|
||||
'Installed applications': 'Applicazioni installate',
|
||||
'Internal State': 'Stato interno',
|
||||
'Invalid Query': 'Richiesta (query) non valida',
|
||||
'Invalid action': 'Azione non valida',
|
||||
'Language files (static strings) updated': 'Linguaggi (documenti con stringhe statiche) aggiornati',
|
||||
'Languages': 'Linguaggi',
|
||||
'Last saved on:': 'Ultimo salvataggio:',
|
||||
'Layout': 'Layout',
|
||||
'License for': 'Licenza relativa a',
|
||||
'Login': 'Accesso',
|
||||
'Login to the Administrative Interface': "Accesso all'interfaccia amministrativa",
|
||||
'Logout': 'uscita',
|
||||
'Main Menu': 'Menu principale',
|
||||
'Menu Model': 'Menu Modelli',
|
||||
'Models': 'Modelli',
|
||||
'Modules': 'Moduli',
|
||||
'NO': 'NO',
|
||||
'New Record': 'Nuovo elemento (record)',
|
||||
'New application wizard': 'New application wizard',
|
||||
'New simple application': 'New simple application',
|
||||
'No databases in this application': 'Nessun database presente in questa applicazione',
|
||||
'Original/Translation': 'Originale/Traduzione',
|
||||
'Overwrite installed app': 'sovrascrivi applicazione installata',
|
||||
'PAM authenticated user, cannot change password here': 'utente autenticato tramite PAM, impossibile modificare password qui',
|
||||
'Pack all': 'crea pacchetto',
|
||||
'Pack compiled': 'crea pacchetto del codice compilato',
|
||||
'Peeking at file': 'Uno sguardo al file',
|
||||
'Plugin "%s" in application': 'Plugin "%s" nell\'applicazione',
|
||||
'Plugins': 'I Plugins',
|
||||
'Powered by': 'Powered by',
|
||||
'Query:': 'Richiesta (query):',
|
||||
'Remove compiled': 'rimozione codice compilato',
|
||||
'Resolve Conflict file': 'File di risoluzione conflitto',
|
||||
'Rows in table': 'Righe nella tabella',
|
||||
'Rows selected': 'Righe selezionate',
|
||||
'Saved file hash:': 'Hash del file salvato:',
|
||||
'Site': 'sito',
|
||||
'Start wizard': 'start wizard',
|
||||
'Static files': 'Files statici',
|
||||
'Stylesheet': 'Foglio di stile (stylesheet)',
|
||||
'Sure you want to delete this object?': 'Vuoi veramente cancellare questo oggetto?',
|
||||
'TM': 'TM',
|
||||
'Testing application': 'Test applicazione in corsg',
|
||||
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'La richiesta (query) è una condizione come ad esempio "db.tabella1.campo1==\'valore\'". Una condizione come "db.tabella1.campo1==db.tabella2.campo2" produce un "JOIN" SQL.',
|
||||
'There are no controllers': 'Non ci sono controller',
|
||||
'There are no models': 'Non ci sono modelli',
|
||||
'There are no modules': 'Non ci sono moduli',
|
||||
'There are no static files': 'Non ci sono file statici',
|
||||
'There are no translators, only default language is supported': 'Non ci sono traduzioni, viene solo supportato il linguaggio di base',
|
||||
'There are no views': 'Non ci sono viste ("view")',
|
||||
'This is the %(filename)s template': 'Questo è il template %(filename)s',
|
||||
'Ticket': 'Ticket',
|
||||
'To create a plugin, name a file/folder plugin_[name]': 'Per creare un plugin, chiamare un file o cartella plugin_[nome]',
|
||||
'Unable to check for upgrades': 'Impossibile controllare presenza di aggiornamenti',
|
||||
'Unable to download app because:': 'Impossibile scaricare applicazione perché',
|
||||
'Unable to download because': 'Impossibile scaricare perché',
|
||||
'Unable to download because:': 'Unable to download because:',
|
||||
'Uninstall': 'disinstalla',
|
||||
'Update:': 'Aggiorna:',
|
||||
'Upload & install packed application': 'Carica ed installa pacchetto con applicazione',
|
||||
'Upload a package:': 'Upload a package:',
|
||||
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Per costruire richieste (query) più complesse si usano (...)&(...) come "e" (AND), (...)|(...) come "o" (OR), e ~(...) come negazione (NOT).',
|
||||
'Use an url:': 'Use an url:',
|
||||
'Version': 'Versione',
|
||||
'View': 'Vista',
|
||||
'Views': 'viste',
|
||||
'Welcome %s': 'Benvenuto %s',
|
||||
'Welcome to web2py': 'Benvenuto su web2py',
|
||||
'YES': 'SI',
|
||||
'additional code for your application': 'righe di codice aggiuntive per la tua applicazione',
|
||||
'Additional code for your application': 'Additional code for your application',
|
||||
'admin disabled because no admin password': 'amministrazione disabilitata per mancanza di password amministrativa',
|
||||
'admin disabled because not supported on google app engine': 'amministrazione non supportata da Google Apps Engine',
|
||||
'admin disabled because unable to access password file': 'amministrazione disabilitata per impossibilità di leggere il file delle password',
|
||||
'Admin is disabled because insecure channel': 'amministrazione disabilitata: comunicazione non sicura',
|
||||
'Admin language': 'Admin language',
|
||||
'administrative interface': 'administrative interface',
|
||||
'Administrator Password:': 'Password Amministratore:',
|
||||
'and rename it (required):': 'e rinominala (obbligatorio):',
|
||||
'and rename it:': 'e rinominala:',
|
||||
'appadmin': 'appadmin ',
|
||||
@@ -147,44 +30,104 @@
|
||||
'application "%s" uninstalled': 'applicazione "%s" disinstallata',
|
||||
'application compiled': 'applicazione compilata',
|
||||
'application is compiled and cannot be designed': "l'applicazione è compilata e non si può modificare",
|
||||
'Application name:': 'Application name:',
|
||||
'are not used': 'are not used',
|
||||
'are not used yet': 'are not used yet',
|
||||
'Are you sure you want to delete file "%s"?': 'Confermi di voler cancellare il file "%s"?',
|
||||
'Are you sure you want to delete plugin "%s"?': 'Confermi di voler cancellare il plugin "%s"?',
|
||||
'Are you sure you want to delete this object?': 'Are you sure you want to delete this object?',
|
||||
'Are you sure you want to uninstall application "%s"?': 'Confermi di voler disinstallare l\'applicazione "%s"?',
|
||||
'Are you sure you want to upgrade web2py now?': 'Confermi di voler aggiornare web2py ora?',
|
||||
'arguments': 'arguments',
|
||||
'ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.': "ATTENZIONE: L'accesso richiede una connessione sicura (HTTPS) o l'esecuzione di web2py in locale (connessione su localhost)",
|
||||
'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.': 'ATTENTZIONE: NON ESEGUIRE PIÙ TEST IN PARALLELO (I TEST NON SONO "THREAD SAFE")',
|
||||
'ATTENTION: you cannot edit the running application!': "ATTENZIONE: non puoi modificare l'applicazione correntemente in uso ",
|
||||
'Available databases and tables': 'Database e tabelle disponibili',
|
||||
'back': 'indietro',
|
||||
'cache': 'cache',
|
||||
'cache, errors and sessions cleaned': 'pulitura cache, errori and sessioni ',
|
||||
'can be a git repo': 'can be a git repo',
|
||||
'Cannot be empty': 'Non può essere vuoto',
|
||||
'Cannot compile: there are errors in your app:': "Compilazione fallita: ci sono errori nell'applicazione.",
|
||||
'cannot create file': 'impossibile creare il file',
|
||||
'cannot upload file "%(filename)s"': 'impossibile caricare il file "%(filename)s"',
|
||||
'Change admin password': 'change admin password',
|
||||
'change password': 'cambia password',
|
||||
'check all': 'controlla tutto',
|
||||
'Check for upgrades': 'check for upgrades',
|
||||
'Check to delete': 'Seleziona per cancellare',
|
||||
'Checking for upgrades...': 'Controllo aggiornamenti in corso...',
|
||||
'Clean': 'pulisci',
|
||||
'click here for online examples': 'clicca per vedere gli esempi',
|
||||
'click here for the administrative interface': "clicca per l'interfaccia amministrativa",
|
||||
'click to check for upgrades': 'clicca per controllare presenza di aggiornamenti',
|
||||
'code': 'code',
|
||||
'collapse/expand all': 'collapse/expand all',
|
||||
'Compile': 'compila',
|
||||
'compiled application removed': "rimosso il codice compilato dell'applicazione",
|
||||
'Controller': 'Controller',
|
||||
'Controllers': 'Controllers',
|
||||
'controllers': 'controllers',
|
||||
'Copyright': 'Copyright',
|
||||
'Create': 'crea',
|
||||
'create file with filename:': 'crea un file col nome:',
|
||||
'create new application:': 'create new application:',
|
||||
'Create new simple application': 'Crea nuova applicazione',
|
||||
'created by': 'creato da',
|
||||
'crontab': 'crontab',
|
||||
'Current request': 'Richiesta (request) corrente',
|
||||
'Current response': 'Risposta (response) corrente',
|
||||
'Current session': 'Sessione (session) corrente',
|
||||
'currently running': 'currently running',
|
||||
'currently saved or': 'attualmente salvato o',
|
||||
'customize me!': 'Personalizzami!',
|
||||
'data uploaded': 'dati caricati',
|
||||
'Database': 'Database',
|
||||
'database': 'database',
|
||||
'database %s select': 'database %s select',
|
||||
'database administration': 'amministrazione database',
|
||||
'Date and Time': 'Data and Ora',
|
||||
'db': 'db',
|
||||
'DB Model': 'Modello di DB',
|
||||
'Debug': 'Debug',
|
||||
'defines tables': 'defininisce le tabelle',
|
||||
'Delete': 'Cancella',
|
||||
'delete': 'Cancella',
|
||||
'delete all checked': 'cancella tutti i selezionati',
|
||||
'delete plugin': 'cancella plugin',
|
||||
'Delete this file (you will be asked to confirm deletion)': 'Delete this file (you will be asked to confirm deletion)',
|
||||
'Delete:': 'Cancella:',
|
||||
'Deploy': 'deploy',
|
||||
'Deploy on Google App Engine': 'Installa su Google App Engine',
|
||||
'Deploy to OpenShift': 'Deploy to OpenShift',
|
||||
'design': 'progetta',
|
||||
'Detailed traceback description': 'Detailed traceback description',
|
||||
'direction: ltr': 'direction: ltr',
|
||||
'Disable': 'Disable',
|
||||
'docs': 'docs',
|
||||
'done!': 'fatto!',
|
||||
'download layouts': 'download layouts',
|
||||
'download plugins': 'download plugins',
|
||||
'EDIT': 'MODIFICA',
|
||||
'Edit': 'modifica',
|
||||
'Edit application': 'Modifica applicazione',
|
||||
'edit controller': 'modifica controller',
|
||||
'Edit current record': 'Modifica record corrente',
|
||||
'edit profile': 'modifica profilo',
|
||||
'Edit This App': 'Modifica questa applicazione',
|
||||
'edit views:': 'modifica viste (view):',
|
||||
'Editing file "%s"': 'Modifica del file "%s"',
|
||||
'Editing Language file': 'Modifica file linguaggio',
|
||||
'Enterprise Web Framework': 'Enterprise Web Framework',
|
||||
'Error logs for "%(app)s"': 'Log degli errori per "%(app)s"',
|
||||
'Error snapshot': 'Error snapshot',
|
||||
'Error ticket': 'Error ticket',
|
||||
'Errors': 'errori',
|
||||
'Exception instance attributes': 'Exception instance attributes',
|
||||
'Expand Abbreviation': 'Expand Abbreviation',
|
||||
'export as csv file': 'esporta come file CSV',
|
||||
'exposes': 'espone',
|
||||
'exposes:': 'exposes:',
|
||||
'extends': 'estende',
|
||||
'failed to reload module because:': 'ricaricamento modulo fallito perché:',
|
||||
'file "%(filename)s" created': 'creato il file "%(filename)s"',
|
||||
@@ -195,73 +138,188 @@
|
||||
'file does not exist': 'file inesistente',
|
||||
'file saved on %(time)s': "file salvato nell'istante %(time)s",
|
||||
'file saved on %s': 'file salvato: %s',
|
||||
'filter': 'filter',
|
||||
'Frames': 'Frames',
|
||||
'Functions with no doctests will result in [passed] tests.': 'I test delle funzioni senza "doctests" risulteranno sempre [passed].',
|
||||
'Get from URL:': 'Get from URL:',
|
||||
'Git Pull': 'Git Pull',
|
||||
'Git Push': 'Git Push',
|
||||
'Hello World': 'Salve Mondo',
|
||||
'Help': 'aiuto',
|
||||
'htmledit': 'modifica come html',
|
||||
'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.': 'If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.\nA green title indicates that all tests (if defined) passed. In this case test results are not shown.',
|
||||
'Import/Export': 'Importa/Esporta',
|
||||
'includes': 'include',
|
||||
'Index': 'Indice',
|
||||
'insert new': 'inserisci nuovo',
|
||||
'insert new %s': 'inserisci nuovo %s',
|
||||
'inspect attributes': 'inspect attributes',
|
||||
'Install': 'installa',
|
||||
'Installed applications': 'Applicazioni installate',
|
||||
'internal error': 'errore interno',
|
||||
'Internal State': 'Stato interno',
|
||||
'Invalid action': 'Azione non valida',
|
||||
'invalid password': 'password non valida',
|
||||
'Invalid Query': 'Richiesta (query) non valida',
|
||||
'invalid request': 'richiesta non valida',
|
||||
'invalid ticket': 'ticket non valido',
|
||||
'Key bindings': 'Key bindings',
|
||||
'Key bindings for ZenCoding Plugin': 'Key bindings for ZenCoding Plugin',
|
||||
'language file "%(filename)s" created/updated': 'file linguaggio "%(filename)s" creato/aggiornato',
|
||||
'Language files (static strings) updated': 'Linguaggi (documenti con stringhe statiche) aggiornati',
|
||||
'languages': 'linguaggi',
|
||||
'Languages': 'Linguaggi',
|
||||
'Last saved on:': 'Ultimo salvataggio:',
|
||||
'Layout': 'Layout',
|
||||
'License for': 'Licenza relativa a',
|
||||
'loading...': 'caricamento...',
|
||||
'locals': 'locals',
|
||||
'login': 'accesso',
|
||||
'Login': 'Accesso',
|
||||
'Login to the Administrative Interface': "Accesso all'interfaccia amministrativa",
|
||||
'Logout': 'uscita',
|
||||
'Main Menu': 'Menu principale',
|
||||
'Menu Model': 'Menu Modelli',
|
||||
'merge': 'unisci',
|
||||
'models': 'modelli',
|
||||
'Models': 'Modelli',
|
||||
'Modules': 'Moduli',
|
||||
'modules': 'moduli',
|
||||
'new application "%s" created': 'creata la nuova applicazione "%s"',
|
||||
'New application wizard': 'New application wizard',
|
||||
'new plugin installed': 'installato nuovo plugin',
|
||||
'New Record': 'Nuovo elemento (record)',
|
||||
'new record inserted': 'nuovo record inserito',
|
||||
'New simple application': 'New simple application',
|
||||
'next 100 rows': 'prossime 100 righe',
|
||||
'NO': 'NO',
|
||||
'No databases in this application': 'Nessun database presente in questa applicazione',
|
||||
'no match': 'nessuna corrispondenza',
|
||||
'or import from csv file': 'oppure importa da file CSV',
|
||||
'or provide app url:': "oppure fornisci url dell'applicazione:",
|
||||
'Original/Translation': 'Originale/Traduzione',
|
||||
'Overwrite installed app': 'sovrascrivi applicazione installata',
|
||||
'Pack all': 'crea pacchetto',
|
||||
'Pack compiled': 'crea pacchetto del codice compilato',
|
||||
'pack plugin': 'crea pacchetto del plugin',
|
||||
'PAM authenticated user, cannot change password here': 'utente autenticato tramite PAM, impossibile modificare password qui',
|
||||
'password changed': 'password modificata',
|
||||
'Peeking at file': 'Uno sguardo al file',
|
||||
'plugin "%(plugin)s" deleted': 'plugin "%(plugin)s" cancellato',
|
||||
'Plugin "%s" in application': 'Plugin "%s" nell\'applicazione',
|
||||
'plugins': 'plugins',
|
||||
'Plugins': 'I Plugins',
|
||||
'Plural-Forms:': 'Plural-Forms:',
|
||||
'Powered by': 'Powered by',
|
||||
'previous 100 rows': '100 righe precedenti',
|
||||
'private files': 'private files',
|
||||
'Private files': 'Private files',
|
||||
'Query:': 'Richiesta (query):',
|
||||
'record': 'record',
|
||||
'record does not exist': 'il record non esiste',
|
||||
'record id': 'ID del record',
|
||||
'register': 'registrazione',
|
||||
'Remove compiled': 'rimozione codice compilato',
|
||||
'request': 'request',
|
||||
'Resolve Conflict file': 'File di risoluzione conflitto',
|
||||
'response': 'response',
|
||||
'restore': 'ripristino',
|
||||
'revert': 'versione precedente',
|
||||
'Rows in table': 'Righe nella tabella',
|
||||
'Rows selected': 'Righe selezionate',
|
||||
'rules are not defined': 'rules are not defined',
|
||||
"Run tests in this file (to run all files, you may also use the button labelled 'test')": "Run tests in this file (to run all files, you may also use the button labelled 'test')",
|
||||
'Running on %s': 'Running on %s',
|
||||
'Save': 'Save',
|
||||
'Save via Ajax': 'Save via Ajax',
|
||||
'Saved file hash:': 'Hash del file salvato:',
|
||||
'selected': 'selezionato',
|
||||
'session': 'session',
|
||||
'session expired': 'sessions scaduta',
|
||||
'shell': 'shell',
|
||||
'Site': 'sito',
|
||||
'some files could not be removed': 'non è stato possibile rimuovere alcuni files',
|
||||
'Start wizard': 'start wizard',
|
||||
'state': 'stato',
|
||||
'static': 'statico',
|
||||
'Static files': 'Files statici',
|
||||
'Stylesheet': 'Foglio di stile (stylesheet)',
|
||||
'submit': 'invia',
|
||||
'Submit': 'Submit',
|
||||
'Sure you want to delete this object?': 'Vuoi veramente cancellare questo oggetto?',
|
||||
'table': 'tabella',
|
||||
'test': 'test',
|
||||
'Testing application': 'Test applicazione in corsg',
|
||||
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'La richiesta (query) è una condizione come ad esempio "db.tabella1.campo1==\'valore\'". Una condizione come "db.tabella1.campo1==db.tabella2.campo2" produce un "JOIN" SQL.',
|
||||
'The application logic, each URL path is mapped in one exposed function in the controller': 'The application logic, each URL path is mapped in one exposed function in the controller',
|
||||
'the application logic, each URL path is mapped in one exposed function in the controller': 'logica dell\'applicazione, ogni percorso "URL" corrisponde ad una funzione esposta da un controller',
|
||||
'The data representation, define database tables and sets': 'The data representation, define database tables and sets',
|
||||
'the data representation, define database tables and sets': 'rappresentazione dei dati, definizione di tabelle di database e di "set" ',
|
||||
'The presentations layer, views are also known as templates': 'The presentations layer, views are also known as templates',
|
||||
'the presentations layer, views are also known as templates': 'Presentazione dell\'applicazione, viste (views, chiamate anche "templates")',
|
||||
'There are no controllers': 'Non ci sono controller',
|
||||
'There are no models': 'Non ci sono modelli',
|
||||
'There are no modules': 'Non ci sono moduli',
|
||||
'There are no plugins': 'There are no plugins',
|
||||
'There are no static files': 'Non ci sono file statici',
|
||||
'There are no translators, only default language is supported': 'Non ci sono traduzioni, viene solo supportato il linguaggio di base',
|
||||
'There are no views': 'Non ci sono viste ("view")',
|
||||
'These files are not served, they are only available from within your app': 'These files are not served, they are only available from within your app',
|
||||
'these files are served without processing, your images go here': 'questi files vengono serviti così come sono, le immagini vanno qui',
|
||||
'These files are served without processing, your images go here': 'These files are served without processing, your images go here',
|
||||
'This is the %(filename)s template': 'Questo è il template %(filename)s',
|
||||
'Ticket': 'Ticket',
|
||||
'Ticket ID': 'Ticket ID',
|
||||
'TM': 'TM',
|
||||
'to previous version.': 'torna a versione precedente',
|
||||
'To create a plugin, name a file/folder plugin_[name]': 'Per creare un plugin, chiamare un file o cartella plugin_[nome]',
|
||||
'toggle breakpoint': 'toggle breakpoint',
|
||||
'Toggle Fullscreen': 'Toggle Fullscreen',
|
||||
'Traceback': 'Traceback',
|
||||
'translation strings for the application': "stringhe di traduzioni per l'applicazione",
|
||||
'Translation strings for the application': 'Translation strings for the application',
|
||||
'try': 'prova',
|
||||
'try something like': 'prova qualcosa come',
|
||||
'try view': 'try view',
|
||||
'Unable to check for upgrades': 'Impossibile controllare presenza di aggiornamenti',
|
||||
'unable to create application "%s"': 'impossibile creare applicazione "%s"',
|
||||
'unable to delete file "%(filename)s"': 'impossibile rimuovere file "%(plugin)s"',
|
||||
'unable to delete file plugin "%(plugin)s"': 'impossibile rimuovere file di plugin "%(plugin)s"',
|
||||
'Unable to download app because:': 'Impossibile scaricare applicazione perché',
|
||||
'Unable to download because': 'Impossibile scaricare perché',
|
||||
'Unable to download because:': 'Unable to download because:',
|
||||
'unable to parse csv file': 'non riesco a decodificare questo file CSV',
|
||||
'unable to uninstall "%s"': 'impossibile disinstallare "%s"',
|
||||
'unable to upgrade because "%s"': 'impossibile aggiornare perché "%s"',
|
||||
'uncheck all': 'smarca tutti',
|
||||
'Uninstall': 'disinstalla',
|
||||
'update': 'aggiorna',
|
||||
'update all languages': 'aggiorna tutti i linguaggi',
|
||||
'Update:': 'Aggiorna:',
|
||||
'upgrade web2py now': 'upgrade web2py now',
|
||||
'upload': 'upload',
|
||||
'Upload & install packed application': 'Carica ed installa pacchetto con applicazione',
|
||||
'Upload a package:': 'Upload a package:',
|
||||
'Upload and install packed application': 'Upload and install packed application',
|
||||
'upload application:': 'carica applicazione:',
|
||||
'upload file:': 'carica file:',
|
||||
'upload plugin file:': 'carica file di plugin:',
|
||||
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Per costruire richieste (query) più complesse si usano (...)&(...) come "e" (AND), (...)|(...) come "o" (OR), e ~(...) come negazione (NOT).',
|
||||
'Use an url:': 'Use an url:',
|
||||
'variables': 'variables',
|
||||
'Version': 'Versione',
|
||||
'Version %s.%s.%s (%s) %s': 'Version %s.%s.%s (%s) %s',
|
||||
'versioning': 'sistema di versioni',
|
||||
'Versioning': 'Versioning',
|
||||
'view': 'vista',
|
||||
'View': 'Vista',
|
||||
'Views': 'viste',
|
||||
'views': 'viste',
|
||||
'web2py Recent Tweets': 'Tweets recenti per web2py',
|
||||
'Web Framework': 'Web Framework',
|
||||
'web2py is up to date': 'web2py è aggiornato',
|
||||
'web2py Recent Tweets': 'Tweets recenti per web2py',
|
||||
'web2py upgraded; please restart it': 'web2py aggiornato; prego riavviarlo',
|
||||
'Welcome %s': 'Benvenuto %s',
|
||||
'Welcome to web2py': 'Benvenuto su web2py',
|
||||
'YES': 'SI',
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
'%Y-%m-%d %H:%M:%S': '%Y/%m/%d %H:%M:%S',
|
||||
'(requires internet access)': '(потрібно мати доступ в інтернет)',
|
||||
'(something like "it-it")': '(щось схоже на "uk-ua")',
|
||||
'@markmin\x01(file **gluon/contrib/plural_rules/%s.py** is not found)': '(не існує файлу **gluon/contrib/plural_rules/%s.py**)',
|
||||
'@markmin\x01Searching: **%s** %%{file}': 'Знайдено: **%s** %%{файл}',
|
||||
'Abort': 'Припинити',
|
||||
'About': 'Про',
|
||||
@@ -405,6 +406,7 @@
|
||||
'ticket': 'позначка',
|
||||
'Ticket': 'Позначка (Ticket)',
|
||||
'Ticket ID': 'Ід.позначки (Ticket ID)',
|
||||
'Ticket Missing': 'Позначка (ticket) відсутня',
|
||||
'tickets': 'позначки (tickets)',
|
||||
'Time in Cache (h:m:s)': 'Час в кеші (г:хв:сек)',
|
||||
'to previous version.': 'до попередньої версії.',
|
||||
@@ -412,6 +414,7 @@
|
||||
'To emulate a breakpoint programatically, write:': 'Для встановлення точки зупинки програмним чином напишіть:',
|
||||
'to use the debugger!': 'щоб активувати ладнач!',
|
||||
'toggle breakpoint': '+/- точку зупинки',
|
||||
'Toggle Fullscreen': 'Перемкнути на весь екран',
|
||||
'Traceback': 'Стек викликів (Traceback)',
|
||||
'Translation strings for the application': 'Пари рядків <оригінал>:<переклад> для вибраної мови',
|
||||
'try something like': 'спробуйте щось схоже на',
|
||||
|
||||
@@ -10,14 +10,14 @@ h3 {font-size:2.00em}
|
||||
h4 {font-size:1.50em}
|
||||
h5 {font-size:1.25em}
|
||||
h6 {font-size:1.12em}
|
||||
th,label {font-weight:bold; white-space:nowrap}
|
||||
th,label {font-weight:bold; white-space:nowrap;}
|
||||
td,th {text-align:left; padding:2px 5px 2px 5px}
|
||||
th {vertical-align:middle; border-right:1px solid white}
|
||||
td {vertical-align:top}
|
||||
form table tr td label {text-align:left}
|
||||
p,table,ol,ul {padding:0; margin: 0.5em 0}
|
||||
p,table,ol,ul {padding:0; margin: 0.75em 0}
|
||||
p {text-align:justify}
|
||||
ol, ul {list-style-position:inside}
|
||||
ol, ul {list-style-position:outside; margin-left:2em}
|
||||
li {margin-bottom:0.5em}
|
||||
span,input,select,textarea,button,label,a {display:inline}
|
||||
img {border:0}
|
||||
@@ -39,13 +39,6 @@ input[type=text],input[type=password],select{width:300px; margin-right:5px}
|
||||
|
||||
/* Sticky footer begin */
|
||||
|
||||
.wrapper {
|
||||
min-height:100%;
|
||||
height:auto !important;
|
||||
height:100%;
|
||||
margin:0 auto -8em; /* set last value to footer height plus footer vertical padding */
|
||||
}
|
||||
|
||||
.main {
|
||||
padding:20px 0 50px 0;
|
||||
}
|
||||
@@ -76,7 +69,6 @@ fieldset {padding:16px; border-top:1px #DEDEDE solid}
|
||||
fieldset legend {text-transform:uppercase; font-weight:bold; padding:4px 16px 4px 16px; background:#f1f1f1}
|
||||
|
||||
/* fix ie problem with menu */
|
||||
.ie-lte7 .topbar .container {z-index:2}
|
||||
|
||||
td.w2p_fw {padding-bottom:1px}
|
||||
td.w2p_fl,td.w2p_fw,td.w2p_fc {vertical-align:top}
|
||||
@@ -102,25 +94,42 @@ div.flash {
|
||||
top:48px;
|
||||
right:50px;
|
||||
min-width:280px;
|
||||
opacity:0.85;
|
||||
opacity:0.95;
|
||||
margin:0px 0px 10px 10px;
|
||||
color:#fff;
|
||||
vertical-align:middle;
|
||||
cursor:pointer;
|
||||
background:#000;
|
||||
color:#fff;
|
||||
background-color:#000;
|
||||
border:2px solid #fff;
|
||||
border-radius:5px;
|
||||
-moz-border-radius:5px;
|
||||
-webkit-border-radius:5px;
|
||||
border-radius:8px;
|
||||
-o-border-radius: 8px;
|
||||
-moz-border-radius:8px;
|
||||
-webkit-border-radius:8px;
|
||||
background-image: -webkit-linear-gradient(top,#222,#000);
|
||||
background-image: -o-linear-gradient(top,#222,#000);
|
||||
background-image: -moz-linear-gradient(90deg, #222, #000);
|
||||
background-image: linear-gradient(top,#222,#000);
|
||||
background-repeat: repeat-x;
|
||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
z-index:2000;
|
||||
}
|
||||
|
||||
div.flash:hover { opacity:0.25; }
|
||||
|
||||
div.error_wrapper {display:block}
|
||||
div.error {
|
||||
background-color:red;
|
||||
width: 298px;
|
||||
background:red;
|
||||
border: 2px solid #d00;
|
||||
color:white;
|
||||
padding:3px;
|
||||
display:inline-block;
|
||||
padding:5px;
|
||||
display:inline-block;
|
||||
background-image: -webkit-linear-gradient(left,#f00,#fdd);
|
||||
background-image: -o-linear-gradient(left,#f00,#fdd);
|
||||
background-image: -moz-linear-gradient(0deg, #f00, #fdd);
|
||||
background-image: linear-gradient(left,#f00,#fdd);
|
||||
background-repeat: repeat-y;
|
||||
}
|
||||
|
||||
.topbar {
|
||||
@@ -166,19 +175,6 @@ div.error {
|
||||
|
||||
/* #MEDIA QUERIES SECTION */
|
||||
|
||||
/* All Mobile Sizes (devices and browser) */
|
||||
@media only screen and (max-width:767px) {
|
||||
/* removed because of bootswatch
|
||||
.topbar {text-align:center}
|
||||
#navbar,#menu {float:none}
|
||||
#navbar {font-size:1.2em; padding:.6em 0 1.2em}
|
||||
#menu {padding:0 0 1.5em}
|
||||
#menu select {font-size:1.2em; margin:0; padding:0}
|
||||
|
||||
div.flash {top:110px; right:10px}
|
||||
*/
|
||||
}
|
||||
|
||||
/*
|
||||
*Grid
|
||||
*
|
||||
@@ -190,10 +186,7 @@ div.error {
|
||||
.web2py_paginator {}
|
||||
.web2py_grid {width:100%}
|
||||
.web2py_grid table {width:100%}
|
||||
.web2py_grid tbody td {
|
||||
padding:2px 5px 2px 5px;
|
||||
vertical-align:middle;
|
||||
}
|
||||
.web2py_grid tbody td {padding:2px 5px 2px 5px; vertical-align: middle;}
|
||||
|
||||
.web2py_grid thead th,.web2py_grid tfoot td {
|
||||
background-color:#EAEAEA;
|
||||
@@ -230,7 +223,7 @@ div.error {
|
||||
margin:0;
|
||||
}
|
||||
|
||||
.web2py_search_actions{
|
||||
.web2py_search_actions {
|
||||
float:left;
|
||||
text-align:left;
|
||||
}
|
||||
@@ -254,13 +247,13 @@ div.error {
|
||||
.web2py_console input[type=button],
|
||||
.web2py_console button {
|
||||
line-height:20px;
|
||||
margin-right:5px; display:inline-block;
|
||||
margin-right:2px; display:inline-block;
|
||||
padding:3px 5px 3px 5px;
|
||||
}
|
||||
|
||||
.web2py_counter {
|
||||
margin-top:5px;
|
||||
margin-right:5px;
|
||||
margin-right:2px;
|
||||
width:35%;
|
||||
float:right;
|
||||
text-align:right;
|
||||
@@ -298,10 +291,20 @@ li.w2p_grid_breadcrumb_elem {
|
||||
display:inline-block;
|
||||
}
|
||||
|
||||
.ie9 #query_panel {padding-bottom:2px}
|
||||
.web2py_console form { vertical-align: middle; }
|
||||
.web2py_console input, .web2py_console select,
|
||||
.web2py_console a { margin: 2px; }
|
||||
|
||||
|
||||
#wiki_page_body {
|
||||
width: 600px;
|
||||
height: auto;
|
||||
min-height: 400px;
|
||||
}
|
||||
}
|
||||
|
||||
/* fix some IE problems */
|
||||
|
||||
.ie-lte7 .topbar .container {z-index:2}
|
||||
.ie-lte8 div.flash{ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#222222', endColorstr='#000000', GradientType=0 ); }
|
||||
.ie-lte8 div.flash:hover {filter:alpha(opacity=25);}
|
||||
.ie9 #w2p_query_panel {padding-bottom:2px}
|
||||
|
||||
@@ -149,7 +149,7 @@
|
||||
<h4>{{=T("RAM")}}</h4>
|
||||
<p>{{=T.M("Number of entries: **%s**", ram['entries'])}}</p>
|
||||
{{if ram['entries'] > 0:}}
|
||||
<p>{{=T.M("Hit Ratio: **%(ratio)s%%** (**%(hits)s** %{hit(hits)} and **%(misses)s** %%{miss(misses)})",
|
||||
<p>{{=T.M("Hit Ratio: **%(ratio)s%%** (**%(hits)s** %%{hit(hits)} and **%(misses)s** %%{miss(misses)})",
|
||||
dict( ratio=ram['ratio'], hits=ram['hits'], misses=ram['misses']))}}
|
||||
</p>
|
||||
<p>
|
||||
|
||||
@@ -187,8 +187,9 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
|
||||
</div>
|
||||
{{if not languages:}}<p><strong>{{=T("There are no translators, only default language is supported")}}</strong></p>{{pass}}
|
||||
<table>
|
||||
{{for file in languages:}}
|
||||
{{id="languages__"+file.replace('.','__')}}
|
||||
{{for lang in sorted(languages):
|
||||
file = lang+'.py'
|
||||
id = "languages__"+file.replace('.','__')}}
|
||||
<tr id="{{=id}}">
|
||||
<td>
|
||||
<span class="filetools controls">
|
||||
@@ -203,24 +204,17 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
|
||||
|
||||
(
|
||||
{{=T("Plural-Forms:")}}
|
||||
{{p=plural_rules[file]}}
|
||||
{{if p[0] == 0:}}
|
||||
<b>{{=T("rules are not defined")}}</b>,
|
||||
<span class="controls comptools">
|
||||
{{=button(URL('create_file', vars=dict(filename=p[2], location='gluon/contrib/rules/', sender=URL('design', args=app), id=id, app=app, token=session.token)), T('Create rules'))}}
|
||||
</span>
|
||||
{{p=languages[lang][3:7]}}
|
||||
{{if p[2] == 'default':}}
|
||||
<span class='error'>{{=T("rules are not defined")}}</span> {{=T.M("(file **gluon/contrib/plural_rules/%s.py** is not found)",lang[:2])}}
|
||||
{{else:}}
|
||||
{{if p[0] == 1:}}
|
||||
{{if p[3] == 'ok':}}
|
||||
{{=B(T("are not used"))}},
|
||||
{{else:}}
|
||||
<span class='error'>{{=B(T("rules parsed with errors"))}}</span>,
|
||||
{{pass}}
|
||||
{{if p[3] == 1:}}
|
||||
{{=B(T("are not used"))}}
|
||||
{{else:}}
|
||||
{{pfile='plural-%s.py'%p[1]}}
|
||||
{{if pfile in plurals:}}
|
||||
{{pfile=p[0]}}
|
||||
{{if p[1]!=0:}}
|
||||
<span class="filetools controls">
|
||||
{{=editpluralsfile('languages',pfile,dict(nplurals=p[0]))}}
|
||||
{{=editpluralsfile('languages',pfile,dict(nplurals=p[3]))}}
|
||||
</span>
|
||||
<span class="file">
|
||||
{{=peekfile('languages',pfile,dict(id=id))}}
|
||||
@@ -235,6 +229,7 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
|
||||
</tr>
|
||||
{{pass}}
|
||||
</table>
|
||||
{{pass}}
|
||||
<div class="controls formfield">{{=file_create_form('%s/languages/' % app, 'languages')}}{{=T('(something like "it-it")')}}</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -10,14 +10,14 @@ h3 {font-size:2.00em}
|
||||
h4 {font-size:1.50em}
|
||||
h5 {font-size:1.25em}
|
||||
h6 {font-size:1.12em}
|
||||
th,label {font-weight:bold; white-space:nowrap}
|
||||
th,label {font-weight:bold; white-space:nowrap;}
|
||||
td,th {text-align:left; padding:2px 5px 2px 5px}
|
||||
th {vertical-align:middle; border-right:1px solid white}
|
||||
td {vertical-align:top}
|
||||
form table tr td label {text-align:left}
|
||||
p,table,ol,ul {padding:0; margin: 0.5em 0}
|
||||
p,table,ol,ul {padding:0; margin: 0.75em 0}
|
||||
p {text-align:justify}
|
||||
ol, ul {list-style-position:inside}
|
||||
ol, ul {list-style-position:outside; margin-left:2em}
|
||||
li {margin-bottom:0.5em}
|
||||
span,input,select,textarea,button,label,a {display:inline}
|
||||
img {border:0}
|
||||
@@ -39,13 +39,6 @@ input[type=text],input[type=password],select{width:300px; margin-right:5px}
|
||||
|
||||
/* Sticky footer begin */
|
||||
|
||||
.wrapper {
|
||||
min-height:100%;
|
||||
height:auto !important;
|
||||
height:100%;
|
||||
margin:0 auto -8em; /* set last value to footer height plus footer vertical padding */
|
||||
}
|
||||
|
||||
.main {
|
||||
padding:20px 0 50px 0;
|
||||
}
|
||||
@@ -76,7 +69,6 @@ fieldset {padding:16px; border-top:1px #DEDEDE solid}
|
||||
fieldset legend {text-transform:uppercase; font-weight:bold; padding:4px 16px 4px 16px; background:#f1f1f1}
|
||||
|
||||
/* fix ie problem with menu */
|
||||
.ie-lte7 .topbar .container {z-index:2}
|
||||
|
||||
td.w2p_fw {padding-bottom:1px}
|
||||
td.w2p_fl,td.w2p_fw,td.w2p_fc {vertical-align:top}
|
||||
@@ -102,25 +94,42 @@ div.flash {
|
||||
top:48px;
|
||||
right:50px;
|
||||
min-width:280px;
|
||||
opacity:0.85;
|
||||
opacity:0.95;
|
||||
margin:0px 0px 10px 10px;
|
||||
color:#fff;
|
||||
vertical-align:middle;
|
||||
cursor:pointer;
|
||||
background:#000;
|
||||
color:#fff;
|
||||
background-color:#000;
|
||||
border:2px solid #fff;
|
||||
border-radius:5px;
|
||||
-moz-border-radius:5px;
|
||||
-webkit-border-radius:5px;
|
||||
border-radius:8px;
|
||||
-o-border-radius: 8px;
|
||||
-moz-border-radius:8px;
|
||||
-webkit-border-radius:8px;
|
||||
background-image: -webkit-linear-gradient(top,#222,#000);
|
||||
background-image: -o-linear-gradient(top,#222,#000);
|
||||
background-image: -moz-linear-gradient(90deg, #222, #000);
|
||||
background-image: linear-gradient(top,#222,#000);
|
||||
background-repeat: repeat-x;
|
||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
z-index:2000;
|
||||
}
|
||||
|
||||
div.flash:hover { opacity:0.25; }
|
||||
|
||||
div.error_wrapper {display:block}
|
||||
div.error {
|
||||
background-color:red;
|
||||
width: 298px;
|
||||
background:red;
|
||||
border: 2px solid #d00;
|
||||
color:white;
|
||||
padding:3px;
|
||||
display:inline-block;
|
||||
padding:5px;
|
||||
display:inline-block;
|
||||
background-image: -webkit-linear-gradient(left,#f00,#fdd);
|
||||
background-image: -o-linear-gradient(left,#f00,#fdd);
|
||||
background-image: -moz-linear-gradient(0deg, #f00, #fdd);
|
||||
background-image: linear-gradient(left,#f00,#fdd);
|
||||
background-repeat: repeat-y;
|
||||
}
|
||||
|
||||
.topbar {
|
||||
@@ -166,19 +175,6 @@ div.error {
|
||||
|
||||
/* #MEDIA QUERIES SECTION */
|
||||
|
||||
/* All Mobile Sizes (devices and browser) */
|
||||
@media only screen and (max-width:767px) {
|
||||
/* removed because of bootswatch
|
||||
.topbar {text-align:center}
|
||||
#navbar,#menu {float:none}
|
||||
#navbar {font-size:1.2em; padding:.6em 0 1.2em}
|
||||
#menu {padding:0 0 1.5em}
|
||||
#menu select {font-size:1.2em; margin:0; padding:0}
|
||||
|
||||
div.flash {top:110px; right:10px}
|
||||
*/
|
||||
}
|
||||
|
||||
/*
|
||||
*Grid
|
||||
*
|
||||
@@ -190,10 +186,7 @@ div.error {
|
||||
.web2py_paginator {}
|
||||
.web2py_grid {width:100%}
|
||||
.web2py_grid table {width:100%}
|
||||
.web2py_grid tbody td {
|
||||
padding:2px 5px 2px 5px;
|
||||
vertical-align:middle;
|
||||
}
|
||||
.web2py_grid tbody td {padding:2px 5px 2px 5px; vertical-align: middle;}
|
||||
|
||||
.web2py_grid thead th,.web2py_grid tfoot td {
|
||||
background-color:#EAEAEA;
|
||||
@@ -230,7 +223,7 @@ div.error {
|
||||
margin:0;
|
||||
}
|
||||
|
||||
.web2py_search_actions{
|
||||
.web2py_search_actions {
|
||||
float:left;
|
||||
text-align:left;
|
||||
}
|
||||
@@ -254,13 +247,13 @@ div.error {
|
||||
.web2py_console input[type=button],
|
||||
.web2py_console button {
|
||||
line-height:20px;
|
||||
margin-right:5px; display:inline-block;
|
||||
margin-right:2px; display:inline-block;
|
||||
padding:3px 5px 3px 5px;
|
||||
}
|
||||
|
||||
.web2py_counter {
|
||||
margin-top:5px;
|
||||
margin-right:5px;
|
||||
margin-right:2px;
|
||||
width:35%;
|
||||
float:right;
|
||||
text-align:right;
|
||||
@@ -298,10 +291,20 @@ li.w2p_grid_breadcrumb_elem {
|
||||
display:inline-block;
|
||||
}
|
||||
|
||||
.ie9 #query_panel {padding-bottom:2px}
|
||||
.web2py_console form { vertical-align: middle; }
|
||||
.web2py_console input, .web2py_console select,
|
||||
.web2py_console a { margin: 2px; }
|
||||
|
||||
|
||||
#wiki_page_body {
|
||||
width: 600px;
|
||||
height: auto;
|
||||
min-height: 400px;
|
||||
}
|
||||
}
|
||||
|
||||
/* fix some IE problems */
|
||||
|
||||
.ie-lte7 .topbar .container {z-index:2}
|
||||
.ie-lte8 div.flash{ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#222222', endColorstr='#000000', GradientType=0 ); }
|
||||
.ie-lte8 div.flash:hover {filter:alpha(opacity=25);}
|
||||
.ie9 #w2p_query_panel {padding-bottom:2px}
|
||||
|
||||
@@ -149,7 +149,7 @@
|
||||
<h4>{{=T("RAM")}}</h4>
|
||||
<p>{{=T.M("Number of entries: **%s**", ram['entries'])}}</p>
|
||||
{{if ram['entries'] > 0:}}
|
||||
<p>{{=T.M("Hit Ratio: **%(ratio)s%%** (**%(hits)s** %{hit(hits)} and **%(misses)s** %%{miss(misses)})",
|
||||
<p>{{=T.M("Hit Ratio: **%(ratio)s%%** (**%(hits)s** %%{hit(hits)} and **%(misses)s** %%{miss(misses)})",
|
||||
dict( ratio=ram['ratio'], hits=ram['hits'], misses=ram['misses']))}}
|
||||
</p>
|
||||
<p>
|
||||
|
||||
@@ -80,8 +80,7 @@ Current version: {{="%s.%s.%s (%s) %s" % request.env.web2py_version}}</p>
|
||||
<br/>
|
||||
<a class="button" href="{{=URL('download')}}" style="width:90%">DOWNLOAD NOW</a><br/>
|
||||
<a class="button" href="http://web2py.com/demo_admin" style="width:90%">ONLINE DEMO</a><br/>
|
||||
<a class="button" href="http://web2py.com/poweredby" style="width:90%">SITES POWERED BY WEB2PY</a>
|
||||
<br/>
|
||||
<object width="234" height="60"><param name="movie" value="http://widget.chipin.com/widget/id/dcd384d58839aa4d"></param><param name="allowScriptAccess" value="always"></param><param name="wmode" value="transparent"></param><param name="color_scheme" value="gray"></param><embed src="http://widget.chipin.com/widget/id/dcd384d58839aa4d" flashVars="color_scheme=gray" type="application/x-shockwave-flash" allowScriptAccess="always" wmode="transparent" width="234" height="60"></embed></object>
|
||||
<a class="button" href="http://web2py.com/poweredby" style="width:90%">SITES POWERED BY WEB2PY</a><br/>
|
||||
<a class="button" href="http://www.chipin.com/contribute/id/dcd384d58839aa4d" style="width:90%">SUPPORT/DONATE</a></br>
|
||||
</div>
|
||||
{{end}}
|
||||
|
||||
@@ -3,65 +3,139 @@
|
||||
'!langcode!': 'cs-cz',
|
||||
'!langname!': 'Český',
|
||||
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"update" je voliteľný výraz ako "field1=\'newvalue\'". Nemôžete upravovať alebo zmazať výsledky JOINu',
|
||||
'%Y-%m-%d': '%d.%m.%Y',
|
||||
'%Y-%m-%d %H:%M:%S': '%d.%m.%Y %H:%M:%S',
|
||||
'%s %%{row} deleted': '%s zmazaných záznamů',
|
||||
'%s %%{row} updated': '%s upravených záznamů',
|
||||
'%s selected': '%s označených',
|
||||
'%Y-%m-%d': '%d.%m.%Y',
|
||||
'%Y-%m-%d %H:%M:%S': '%d.%m.%Y %H:%M:%S',
|
||||
'About': 'About',
|
||||
'Access Control': 'Access Control',
|
||||
'Administrative Interface': 'Administrative Interface',
|
||||
'Administrative interface': 'pro administrátorské rozhranie kliknite sem',
|
||||
'Ajax Recipes': 'Ajax Recipes',
|
||||
'appadmin is disabled because insecure channel': 'appadmin je zakázaný bez zabezpečeného spojení',
|
||||
'Are you sure you want to delete this object?': 'Opravdu chceš odstranit tento objekt?',
|
||||
'Available Databases and Tables': 'Dostupné databáze a tabuľky',
|
||||
'Buy this book': 'Buy this book',
|
||||
'cache': 'cache',
|
||||
'Cache': 'Cache',
|
||||
'Cache Keys': 'Cache Keys',
|
||||
'Cannot be empty': 'Nemůže být prázdné',
|
||||
'Change password': 'Změna hesla',
|
||||
'Check to delete': 'Označit ke smazání',
|
||||
'Check to delete:': 'Check to delete:',
|
||||
'Clear CACHE?': 'Clear CACHE?',
|
||||
'Clear DISK': 'Clear DISK',
|
||||
'Clear RAM': 'Clear RAM',
|
||||
'Client IP': 'Client IP',
|
||||
'Community': 'Community',
|
||||
'Components and Plugins': 'Components and Plugins',
|
||||
'Controller': 'Controller',
|
||||
'Copyright': 'Copyright',
|
||||
'Current request': 'Aktuální požadavek',
|
||||
'Current response': 'Aktuální odpověď',
|
||||
'Current session': 'Aktuální session',
|
||||
'customize me!': 'uprav mě!',
|
||||
'data uploaded': 'data nahrána',
|
||||
'Database': 'databáze',
|
||||
'Database %s select': 'databáze %s výber',
|
||||
'db': 'db',
|
||||
'DB Model': 'DB Model',
|
||||
'Database': 'Databáze',
|
||||
'Delete:': 'Smazat:',
|
||||
'Demo': 'Demo',
|
||||
'Deployment Recipes': 'Deployment Recipes',
|
||||
'Description': 'Popis',
|
||||
'design': 'návrh',
|
||||
'DISK': 'DISK',
|
||||
'Disk Cache Keys': 'Disk Cache Keys',
|
||||
'Disk Cleared': 'Disk Cleared',
|
||||
'Documentation': 'Dokumentáce',
|
||||
"Don't know what to do?": "Don't know what to do?",
|
||||
'done!': 'hotovo!',
|
||||
'Download': 'Download',
|
||||
'E-mail': 'E-mail',
|
||||
'Edit': 'Upravit',
|
||||
'Edit Profile': 'Upravit profil',
|
||||
'Edit current record': 'Upravit aktuální záznam',
|
||||
'Edit Profile': 'Upravit profil',
|
||||
'Email and SMS': 'Email and SMS',
|
||||
'enter a number between %(min)g and %(max)g': 'zadej číslo mezi %(min)g a %(max)g',
|
||||
'enter an integer between %(min)g and %(max)g': 'zadej celé číslo mezi %(min)g a %(max)g',
|
||||
'Errors': 'Errors',
|
||||
'export as csv file': 'exportovat do csv souboru',
|
||||
'FAQ': 'FAQ',
|
||||
'First name': 'Křestní jméno',
|
||||
'forgot username?': 'neznáš svúj nick?',
|
||||
'Forms and Validators': 'Forms and Validators',
|
||||
'Free Applications': 'Free Applications',
|
||||
'Group %(group_id)s created': 'Skupina %(group_id)s vytvořena',
|
||||
'Group ID': 'ID skupiny',
|
||||
'Groups': 'Groups',
|
||||
'Hello World': 'Ahoj světe',
|
||||
'Home': 'Home',
|
||||
'How did you get here?': 'How did you get here?',
|
||||
'import': 'import',
|
||||
'Import/Export': 'Import/Export',
|
||||
'Index': 'Index',
|
||||
'insert new': 'vložit nový záznam ',
|
||||
'insert new %s': 'vložit nový záznam %s',
|
||||
'Internal State': 'Vnitřní stav',
|
||||
'Invalid Query': 'Neplatná dotaz',
|
||||
'Introduction': 'Introduction',
|
||||
'Invalid email': 'Neplatný email',
|
||||
'Invalid password': 'Nesprávné heslo',
|
||||
'Invalid Query': 'Neplatná dotaz',
|
||||
'invalid request': 'Neplatný požadavek',
|
||||
'Key': 'Key',
|
||||
'Last name': 'Příjmení',
|
||||
'Layout': 'Layout',
|
||||
'Layout Plugins': 'Layout Plugins',
|
||||
'Layouts': 'Layouts',
|
||||
'Live Chat': 'Live Chat',
|
||||
'Logged in': 'Přihlášení úspěšné',
|
||||
'Logged out': 'Odhlášení úspěšné',
|
||||
'login': 'prihlásit',
|
||||
'Login': 'Login',
|
||||
'logout': 'odhlásit',
|
||||
'Lost Password': 'Ztracené heslo?',
|
||||
'lost password?': 'neznáš heslo?',
|
||||
'Manage Cache': 'Manage Cache',
|
||||
'Menu Model': 'Menu Model',
|
||||
'My Sites': 'My Sites',
|
||||
'Name': 'Jméno',
|
||||
'New Record': 'Nový záznam',
|
||||
'New password': 'Nové heslo',
|
||||
'New Record': 'Nový záznam',
|
||||
'new record inserted': 'nový záznam byl vložen',
|
||||
'next 100 rows': 'dalších 100 řádků',
|
||||
'No databases in this application': 'V této aplikáci nejsou databáze',
|
||||
'Object or table name': 'Objekt či tabulka',
|
||||
'Old password': 'Staré heslo',
|
||||
'Online examples': 'pro online příklady klikněte sem',
|
||||
'or import from csv file': 'a nebo naimportovat z csv souboru',
|
||||
'Origin': 'Púvod',
|
||||
'Other Plugins': 'Other Plugins',
|
||||
'Other Recipes': 'Other Recipes',
|
||||
'Overview': 'Overview',
|
||||
'password': 'heslo',
|
||||
'Password': 'Heslo',
|
||||
"Password fields don't match": 'Hesla se neshodují',
|
||||
'Plugins': 'Plugins',
|
||||
'Powered by': 'Powered by',
|
||||
'Preface': 'Preface',
|
||||
'previous 100 rows': 'předchádzajících 100 řádků',
|
||||
'profile': 'profil',
|
||||
'Python': 'Python',
|
||||
'Query:': 'Dotaz:',
|
||||
'Quick Examples': 'Quick Examples',
|
||||
'RAM': 'RAM',
|
||||
'RAM Cache Keys': 'RAM Cache Keys',
|
||||
'Ram Cleared': 'Ram Cleared',
|
||||
'Readme': 'Nápověda',
|
||||
'Recipes': 'Recipes',
|
||||
'Record': 'záznam',
|
||||
'record does not exist': 'záznam neexistuje',
|
||||
'Record ID': 'ID záznamu',
|
||||
'Record id': 'id záznamu',
|
||||
'Register': 'Zaregistrovat se',
|
||||
'register': 'registrovat',
|
||||
'Registration identifier': 'Registrační identifikátor',
|
||||
'Registration key': 'Registrační kľíč',
|
||||
'Remember me (for 30 days)': 'Zapamatuj si mne (na 30 dní)',
|
||||
@@ -70,14 +144,28 @@
|
||||
'Role': 'Role',
|
||||
'Rows in Table': 'řádků v tabulce',
|
||||
'Rows selected': 'označených řádků',
|
||||
'Semantic': 'Semantic',
|
||||
'Services': 'Services',
|
||||
'Size of cache:': 'Size of cache:',
|
||||
'state': 'stav',
|
||||
'Statistics': 'Statistics',
|
||||
'Stylesheet': 'CSS',
|
||||
'submit': 'submit',
|
||||
'Submit': 'Odeslat',
|
||||
'Support': 'Support',
|
||||
'Sure you want to delete this object?': 'Opravdu chceš smazat tento objekt?',
|
||||
'Table': 'tabulka',
|
||||
'Table name': 'Název tabulky',
|
||||
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': '"query" je podmínka jako "db.table1.field1==\'value\'". Něco jako "db.table1.field1==db.table2.field2" má za výsledek SQL JOIN.',
|
||||
'The Core': 'The Core',
|
||||
'The output of the file is a dictionary that was rendered by the view %s': 'Výstup zo souboru je slovník, ktorý byl zobrazený ve view %s',
|
||||
'The Views': 'The Views',
|
||||
'This App': 'This App',
|
||||
'This is a copy of the scaffolding application': 'Toto je kopie skeletu aplikace',
|
||||
'Time in Cache (h:m:s)': 'Time in Cache (h:m:s)',
|
||||
'Timestamp': 'Časové razítko',
|
||||
'Twitter': 'Twitter',
|
||||
'unable to parse csv file': 'nedá sa zpracovat csv soubor',
|
||||
'Update:': 'Upravit:',
|
||||
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Použijte (...)&(...) pro AND, (...)|(...) pro OR a ~(...) pro NOT na poskládaní komplexnejších dotazů.',
|
||||
'User %(id)s Logged-in': 'Uživatel %(id)s prihlásen',
|
||||
@@ -89,43 +177,13 @@
|
||||
'User ID': 'ID uživatele',
|
||||
'Username': 'Nick',
|
||||
'Verify Password': 'Zopakuj heslo',
|
||||
'Videos': 'Videos',
|
||||
'View': 'Zobrazit',
|
||||
'Welcome': 'Vítej',
|
||||
'Welcome to web2py': 'Vitejte ve web2py',
|
||||
'Welcome to web2py!': 'Welcome to web2py!',
|
||||
'Which called the function %s located in the file %s': 'Ktorý zavolal funkci %s v souboru %s',
|
||||
'You are successfully running web2py': 'Úspešně jste spustili web2py',
|
||||
'You can modify this application and adapt it to your needs': 'Můžete upravit tuto aplikáci a prispôsobit ji svojim potřebám',
|
||||
'You visited the url %s': 'Navštívili jste URL %s',
|
||||
'appadmin is disabled because insecure channel': 'appadmin je zakázaný bez zabezpečeného spojení',
|
||||
'cache': 'cache',
|
||||
'customize me!': 'uprav mě!',
|
||||
'data uploaded': 'data nahrána',
|
||||
'Database': 'databáze',
|
||||
'Database %s select': 'databáze %s výber',
|
||||
'db': 'db',
|
||||
'design': 'návrh',
|
||||
'done!': 'hotovo!',
|
||||
'enter a number between %(min)g and %(max)g': 'zadej číslo mezi %(min)g a %(max)g',
|
||||
'enter an integer between %(min)g and %(max)g': 'zadej celé číslo mezi %(min)g a %(max)g',
|
||||
'export as csv file': 'exportovat do csv souboru',
|
||||
'forgot username?': 'neznáš svúj nick?',
|
||||
'insert new': 'vložit nový záznam ',
|
||||
'insert new %s': 'vložit nový záznam %s',
|
||||
'invalid request': 'Neplatný požadavek',
|
||||
'login': 'prihlásit',
|
||||
'logout': 'odhlásit',
|
||||
'lost password?': 'neznáš heslo?',
|
||||
'new record inserted': 'nový záznam byl vložen',
|
||||
'next 100 rows': 'dalších 100 řádků',
|
||||
'or import from csv file': 'a nebo naimportovat z csv souboru',
|
||||
'password': 'heslo',
|
||||
'previous 100 rows': 'předchádzajících 100 řádků',
|
||||
'profile': 'profil',
|
||||
'Record': 'záznam',
|
||||
'record does not exist': 'záznam neexistuje',
|
||||
'Record id': 'id záznamu',
|
||||
'register': 'registrovat',
|
||||
'state': 'stav',
|
||||
'Table': 'tabulka',
|
||||
'unable to parse csv file': 'nedá sa zpracovat csv soubor',
|
||||
}
|
||||
|
||||
@@ -3,144 +3,28 @@
|
||||
'!langcode!': 'es',
|
||||
'!langname!': 'Español',
|
||||
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"actualice" es una expresión opcional como "campo1=\'nuevo_valor\'". No se puede actualizar o eliminar resultados de un JOIN',
|
||||
'%Y-%m-%d': '%Y-%m-%d',
|
||||
'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
|
||||
'%s %%{row} deleted': '%s filas eliminadas',
|
||||
'%s %%{row} updated': '%s filas actualizadas',
|
||||
'%s selected': '%s seleccionado(s)',
|
||||
'%Y-%m-%d': '%Y-%m-%d',
|
||||
'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
|
||||
'(something like "it-it")': '(algo como "it-it")',
|
||||
'A new version of web2py is available': 'Hay una nueva versión de web2py disponible',
|
||||
'A new version of web2py is available: %s': 'Hay una nueva versión de web2py disponible: %s',
|
||||
'ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.': 'ATENCION: Inicio de sesión requiere una conexión segura (HTTPS) o localhost.',
|
||||
'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.': 'ATENCION: NO EJECUTE VARIAS PRUEBAS SIMULTANEAMENTE, NO SON THREAD SAFE.',
|
||||
'ATTENTION: you cannot edit the running application!': 'ATENCION: no puede modificar la aplicación que se ejecuta!',
|
||||
'about': 'acerca de',
|
||||
'About': 'Acerca de',
|
||||
'About application': 'Acerca de la aplicación',
|
||||
'Admin is disabled because insecure channel': 'Admin deshabilitado, el canal no es seguro',
|
||||
'Admin is disabled because unsecure channel': 'Admin deshabilitado, el canal no es seguro',
|
||||
'Administrative interface': 'Interfaz administrativa',
|
||||
'Administrator Password:': 'Contraseña del Administrador:',
|
||||
'Are you sure you want to delete file "%s"?': '¿Está seguro que desea eliminar el archivo "%s"?',
|
||||
'Are you sure you want to uninstall application "%s"': '¿Está seguro que desea desinstalar la aplicación "%s"',
|
||||
'Are you sure you want to uninstall application "%s"?': '¿Está seguro que desea desinstalar la aplicación "%s"?',
|
||||
'Authentication': 'Autenticación',
|
||||
'Available Databases and Tables': 'Bases de datos y tablas disponibles',
|
||||
'Cannot be empty': 'No puede estar vacío',
|
||||
'Cannot compile: there are errors in your app. Debug it, correct errors and try again.': 'No se puede compilar: hay errores en su aplicación. Depure, corrija errores y vuelva a intentarlo.',
|
||||
'Change Password': 'Cambie Contraseña',
|
||||
'Check to delete': 'Marque para eliminar',
|
||||
'Client IP': 'IP del Cliente',
|
||||
'Controller': 'Controlador',
|
||||
'Controllers': 'Controladores',
|
||||
'Copyright': 'Derechos de autor',
|
||||
'Create new application': 'Cree una nueva aplicación',
|
||||
'Current request': 'Solicitud en curso',
|
||||
'Current response': 'Respuesta en curso',
|
||||
'Current session': 'Sesión en curso',
|
||||
'DB Model': 'Modelo "db"',
|
||||
'DESIGN': 'DISEÑO',
|
||||
'Database': 'Base de datos',
|
||||
'Date and Time': 'Fecha y Hora',
|
||||
'Delete': 'Elimine',
|
||||
'Delete:': 'Elimine:',
|
||||
'Deploy on Google App Engine': 'Instale en Google App Engine',
|
||||
'Description': 'Descripción',
|
||||
'Design for': 'Diseño para',
|
||||
'Documentation': 'Documentación',
|
||||
'E-mail': 'Correo electrónico',
|
||||
'EDIT': 'EDITAR',
|
||||
'Edit': 'Editar',
|
||||
'Edit Profile': 'Editar Perfil',
|
||||
'Edit This App': 'Edite esta App',
|
||||
'Edit application': 'Editar aplicación',
|
||||
'Edit current record': 'Edite el registro actual',
|
||||
'Editing file': 'Editando archivo',
|
||||
'Editing file "%s"': 'Editando archivo "%s"',
|
||||
'Error logs for "%(app)s"': 'Bitácora de errores en "%(app)s"',
|
||||
'First name': 'Nombre',
|
||||
'Functions with no doctests will result in [passed] tests.': 'Funciones sin doctests equivalen a pruebas [aceptadas].',
|
||||
'Group ID': 'ID de Grupo',
|
||||
'Hello World': 'Hola Mundo',
|
||||
'Import/Export': 'Importar/Exportar',
|
||||
'Index': 'Indice',
|
||||
'Installed applications': 'Aplicaciones instaladas',
|
||||
'Internal State': 'Estado Interno',
|
||||
'Invalid Query': 'Consulta inválida',
|
||||
'Invalid action': 'Acción inválida',
|
||||
'Invalid email': 'Correo inválido',
|
||||
'Language files (static strings) updated': 'Archivos de lenguaje (cadenas estáticas) actualizados',
|
||||
'Languages': 'Lenguajes',
|
||||
'Last name': 'Apellido',
|
||||
'Last saved on:': 'Guardado en:',
|
||||
'Layout': 'Diseño de página',
|
||||
'License for': 'Licencia para',
|
||||
'Login': 'Inicio de sesión',
|
||||
'Login to the Administrative Interface': 'Inicio de sesión para la Interfaz Administrativa',
|
||||
'Logout': 'Fin de sesión',
|
||||
'Lost Password': 'Contraseña perdida',
|
||||
'Main Menu': 'Menú principal',
|
||||
'Menu Model': 'Modelo "menu"',
|
||||
'Models': 'Modelos',
|
||||
'Modules': 'Módulos',
|
||||
'NO': 'NO',
|
||||
'Name': 'Nombre',
|
||||
'New Record': 'Registro nuevo',
|
||||
'No databases in this application': 'No hay bases de datos en esta aplicación',
|
||||
'Online examples': 'Ejemplos en línea',
|
||||
'Origin': 'Origen',
|
||||
'Original/Translation': 'Original/Traducción',
|
||||
'Password': 'Contraseña',
|
||||
'Peeking at file': 'Visualizando archivo',
|
||||
'Powered by': 'Este sitio usa',
|
||||
'Query:': 'Consulta:',
|
||||
'Record ID': 'ID de Registro',
|
||||
'Register': 'Registrese',
|
||||
'Registration key': 'Contraseña de Registro',
|
||||
'Reset Password key': 'Reset Password key',
|
||||
'Resolve Conflict file': 'archivo Resolución de Conflicto',
|
||||
'Role': 'Rol',
|
||||
'Rows in Table': 'Filas en la tabla',
|
||||
'Rows selected': 'Filas seleccionadas',
|
||||
'Saved file hash:': 'Hash del archivo guardado:',
|
||||
'Static files': 'Archivos estáticos',
|
||||
'Stylesheet': 'Hoja de estilo',
|
||||
'Sure you want to delete this object?': '¿Está seguro que desea eliminar este objeto?',
|
||||
'Table name': 'Nombre de la tabla',
|
||||
'Testing application': 'Probando aplicación',
|
||||
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'La "consulta" es una condición como "db.tabla1.campo1==\'valor\'". Algo como "db.tabla1.campo1==db.tabla2.campo2" resulta en un JOIN SQL.',
|
||||
'The output of the file is a dictionary that was rendered by the view %s': 'La salida del archivo es un diccionario escenificado por la vista %s',
|
||||
'There are no controllers': 'No hay controladores',
|
||||
'There are no models': 'No hay modelos',
|
||||
'There are no modules': 'No hay módulos',
|
||||
'There are no static files': 'No hay archivos estáticos',
|
||||
'There are no translators, only default language is supported': 'No hay traductores, sólo el lenguaje por defecto es soportado',
|
||||
'There are no views': 'No hay vistas',
|
||||
'This is a copy of the scaffolding application': 'Esta es una copia de la aplicación de andamiaje',
|
||||
'This is the %(filename)s template': 'Esta es la plantilla %(filename)s',
|
||||
'Ticket': 'Tiquete',
|
||||
'Timestamp': 'Timestamp',
|
||||
'Unable to check for upgrades': 'No es posible verificar la existencia de actualizaciones',
|
||||
'Unable to download': 'No es posible la descarga',
|
||||
'Unable to download app': 'No es posible descarga la aplicación',
|
||||
'Update:': 'Actualice:',
|
||||
'Upload existing application': 'Suba esta aplicación',
|
||||
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Use (...)&(...) para AND, (...)|(...) para OR, y ~(...) para NOT, para crear consultas más complejas.',
|
||||
'User ID': 'ID de Usuario',
|
||||
'View': 'Vista',
|
||||
'Views': 'Vistas',
|
||||
'Welcome': 'Welcome',
|
||||
'Welcome %s': 'Bienvenido %s',
|
||||
'Welcome to web2py': 'Bienvenido a web2py',
|
||||
'Which called the function %s located in the file %s': 'La cual llamó la función %s localizada en el archivo %s',
|
||||
'YES': 'SI',
|
||||
'You are successfully running web2py': 'Usted está ejecutando web2py exitosamente',
|
||||
'You can modify this application and adapt it to your needs': 'Usted puede modificar esta aplicación y adaptarla a sus necesidades',
|
||||
'You visited the url %s': 'Usted visitó la url %s',
|
||||
'about': 'acerca de',
|
||||
'Access Control': 'Access Control',
|
||||
'additional code for your application': 'código adicional para su aplicación',
|
||||
'admin disabled because no admin password': ' por falta de contraseña',
|
||||
'admin disabled because not supported on google app engine': 'admin deshabilitado, no es soportado en GAE',
|
||||
'admin disabled because unable to access password file': 'admin deshabilitado, imposible acceder al archivo con la contraseña',
|
||||
'Admin is disabled because insecure channel': 'Admin deshabilitado, el canal no es seguro',
|
||||
'Admin is disabled because unsecure channel': 'Admin deshabilitado, el canal no es seguro',
|
||||
'Administrative Interface': 'Administrative Interface',
|
||||
'Administrative interface': 'Interfaz administrativa',
|
||||
'Administrator Password:': 'Contraseña del Administrador:',
|
||||
'Ajax Recipes': 'Ajax Recipes',
|
||||
'and rename it (required):': 'y renombrela (requerido):',
|
||||
'and rename it:': ' y renombrelo:',
|
||||
'appadmin': 'appadmin',
|
||||
@@ -148,40 +32,98 @@
|
||||
'application "%s" uninstalled': 'aplicación "%s" desinstalada',
|
||||
'application compiled': 'aplicación compilada',
|
||||
'application is compiled and cannot be designed': 'la aplicación está compilada y no puede ser modificada',
|
||||
'Are you sure you want to delete file "%s"?': '¿Está seguro que desea eliminar el archivo "%s"?',
|
||||
'Are you sure you want to delete this object?': 'Are you sure you want to delete this object?',
|
||||
'Are you sure you want to uninstall application "%s"': '¿Está seguro que desea desinstalar la aplicación "%s"',
|
||||
'Are you sure you want to uninstall application "%s"?': '¿Está seguro que desea desinstalar la aplicación "%s"?',
|
||||
'ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.': 'ATENCION: Inicio de sesión requiere una conexión segura (HTTPS) o localhost.',
|
||||
'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.': 'ATENCION: NO EJECUTE VARIAS PRUEBAS SIMULTANEAMENTE, NO SON THREAD SAFE.',
|
||||
'ATTENTION: you cannot edit the running application!': 'ATENCION: no puede modificar la aplicación que se ejecuta!',
|
||||
'Authentication': 'Autenticación',
|
||||
'Available Databases and Tables': 'Bases de datos y tablas disponibles',
|
||||
'Buy this book': 'Buy this book',
|
||||
'cache': 'cache',
|
||||
'Cache': 'Cache',
|
||||
'Cache Keys': 'Cache Keys',
|
||||
'cache, errors and sessions cleaned': 'cache, errores y sesiones eliminados',
|
||||
'Cannot be empty': 'No puede estar vacío',
|
||||
'Cannot compile: there are errors in your app. Debug it, correct errors and try again.': 'No se puede compilar: hay errores en su aplicación. Depure, corrija errores y vuelva a intentarlo.',
|
||||
'cannot create file': 'no es posible crear archivo',
|
||||
'cannot upload file "%(filename)s"': 'no es posible subir archivo "%(filename)s"',
|
||||
'Change Password': 'Cambie Contraseña',
|
||||
'change password': 'cambie contraseña',
|
||||
'check all': 'marcar todos',
|
||||
'Check to delete': 'Marque para eliminar',
|
||||
'clean': 'limpiar',
|
||||
'Clear CACHE?': 'Clear CACHE?',
|
||||
'Clear DISK': 'Clear DISK',
|
||||
'Clear RAM': 'Clear RAM',
|
||||
'click to check for upgrades': 'haga clic para buscar actualizaciones',
|
||||
'Client IP': 'IP del Cliente',
|
||||
'Community': 'Community',
|
||||
'compile': 'compilar',
|
||||
'compiled application removed': 'aplicación compilada removida',
|
||||
'Components and Plugins': 'Components and Plugins',
|
||||
'Controller': 'Controlador',
|
||||
'Controllers': 'Controladores',
|
||||
'controllers': 'controladores',
|
||||
'Copyright': 'Derechos de autor',
|
||||
'create file with filename:': 'cree archivo con nombre:',
|
||||
'Create new application': 'Cree una nueva aplicación',
|
||||
'create new application:': 'nombre de la nueva aplicación:',
|
||||
'crontab': 'crontab',
|
||||
'Current request': 'Solicitud en curso',
|
||||
'Current response': 'Respuesta en curso',
|
||||
'Current session': 'Sesión en curso',
|
||||
'currently saved or': 'actualmente guardado o',
|
||||
'customize me!': 'Adaptame!',
|
||||
'data uploaded': 'datos subidos',
|
||||
'Database': 'base de datos',
|
||||
'Database %s select': 'selección en base de datos %s',
|
||||
'database administration': 'administración base de datos',
|
||||
'Date and Time': 'Fecha y Hora',
|
||||
'db': 'db',
|
||||
'DB Model': 'Modelo "db"',
|
||||
'defines tables': 'define tablas',
|
||||
'Delete': 'Elimine',
|
||||
'delete': 'eliminar',
|
||||
'delete all checked': 'eliminar marcados',
|
||||
'Delete:': 'Elimine:',
|
||||
'Demo': 'Demo',
|
||||
'Deploy on Google App Engine': 'Instale en Google App Engine',
|
||||
'Deployment Recipes': 'Deployment Recipes',
|
||||
'Description': 'Descripción',
|
||||
'DESIGN': 'DISEÑO',
|
||||
'design': 'modificar',
|
||||
'Design for': 'Diseño para',
|
||||
'DISK': 'DISK',
|
||||
'Disk Cache Keys': 'Disk Cache Keys',
|
||||
'Disk Cleared': 'Disk Cleared',
|
||||
'Documentation': 'Documentación',
|
||||
"Don't know what to do?": "Don't know what to do?",
|
||||
'done!': 'listo!',
|
||||
'Download': 'Download',
|
||||
'E-mail': 'Correo electrónico',
|
||||
'EDIT': 'EDITAR',
|
||||
'edit': 'editar',
|
||||
'Edit': 'Editar',
|
||||
'Edit application': 'Editar aplicación',
|
||||
'edit controller': 'editar controlador',
|
||||
'Edit current record': 'Edite el registro actual',
|
||||
'edit profile': 'editar perfil',
|
||||
'Edit Profile': 'Editar Perfil',
|
||||
'Edit This App': 'Edite esta App',
|
||||
'Editing file': 'Editando archivo',
|
||||
'Editing file "%s"': 'Editando archivo "%s"',
|
||||
'Email and SMS': 'Email and SMS',
|
||||
'Error logs for "%(app)s"': 'Bitácora de errores en "%(app)s"',
|
||||
'Errors': 'Errors',
|
||||
'errors': 'errores',
|
||||
'export as csv file': 'exportar como archivo CSV',
|
||||
'exposes': 'expone',
|
||||
'extends': 'extiende',
|
||||
'failed to reload module': 'recarga del módulo ha fallado',
|
||||
'FAQ': 'FAQ',
|
||||
'file "%(filename)s" created': 'archivo "%(filename)s" creado',
|
||||
'file "%(filename)s" deleted': 'archivo "%(filename)s" eliminado',
|
||||
'file "%(filename)s" uploaded': 'archivo "%(filename)s" subido',
|
||||
@@ -191,70 +133,186 @@
|
||||
'file does not exist': 'archivo no existe',
|
||||
'file saved on %(time)s': 'archivo guardado %(time)s',
|
||||
'file saved on %s': 'archivo guardado %s',
|
||||
'First name': 'Nombre',
|
||||
'Forms and Validators': 'Forms and Validators',
|
||||
'Free Applications': 'Free Applications',
|
||||
'Functions with no doctests will result in [passed] tests.': 'Funciones sin doctests equivalen a pruebas [aceptadas].',
|
||||
'Group ID': 'ID de Grupo',
|
||||
'Groups': 'Groups',
|
||||
'Hello World': 'Hola Mundo',
|
||||
'help': 'ayuda',
|
||||
'Home': 'Home',
|
||||
'How did you get here?': 'How did you get here?',
|
||||
'htmledit': 'htmledit',
|
||||
'import': 'import',
|
||||
'Import/Export': 'Importar/Exportar',
|
||||
'includes': 'incluye',
|
||||
'Index': 'Indice',
|
||||
'insert new': 'inserte nuevo',
|
||||
'insert new %s': 'inserte nuevo %s',
|
||||
'Installed applications': 'Aplicaciones instaladas',
|
||||
'internal error': 'error interno',
|
||||
'Internal State': 'Estado Interno',
|
||||
'Introduction': 'Introduction',
|
||||
'Invalid action': 'Acción inválida',
|
||||
'Invalid email': 'Correo inválido',
|
||||
'invalid password': 'contraseña inválida',
|
||||
'Invalid Query': 'Consulta inválida',
|
||||
'invalid request': 'solicitud inválida',
|
||||
'invalid ticket': 'tiquete inválido',
|
||||
'Key': 'Key',
|
||||
'language file "%(filename)s" created/updated': 'archivo de lenguaje "%(filename)s" creado/actualizado',
|
||||
'Language files (static strings) updated': 'Archivos de lenguaje (cadenas estáticas) actualizados',
|
||||
'languages': 'lenguajes',
|
||||
'Languages': 'Lenguajes',
|
||||
'languages updated': 'lenguajes actualizados',
|
||||
'Last name': 'Apellido',
|
||||
'Last saved on:': 'Guardado en:',
|
||||
'Layout': 'Diseño de página',
|
||||
'Layout Plugins': 'Layout Plugins',
|
||||
'Layouts': 'Layouts',
|
||||
'License for': 'Licencia para',
|
||||
'Live Chat': 'Live Chat',
|
||||
'loading...': 'cargando...',
|
||||
'login': 'inicio de sesión',
|
||||
'Login': 'Inicio de sesión',
|
||||
'Login to the Administrative Interface': 'Inicio de sesión para la Interfaz Administrativa',
|
||||
'logout': 'fin de sesión',
|
||||
'Logout': 'Fin de sesión',
|
||||
'Lost Password': 'Contraseña perdida',
|
||||
'lost password?': '¿olvido la contraseña?',
|
||||
'Main Menu': 'Menú principal',
|
||||
'Manage Cache': 'Manage Cache',
|
||||
'Menu Model': 'Modelo "menu"',
|
||||
'merge': 'combinar',
|
||||
'Models': 'Modelos',
|
||||
'models': 'modelos',
|
||||
'Modules': 'Módulos',
|
||||
'modules': 'módulos',
|
||||
'My Sites': 'My Sites',
|
||||
'Name': 'Nombre',
|
||||
'new application "%s" created': 'nueva aplicación "%s" creada',
|
||||
'New Record': 'Registro nuevo',
|
||||
'new record inserted': 'nuevo registro insertado',
|
||||
'next 100 rows': '100 filas siguientes',
|
||||
'NO': 'NO',
|
||||
'No databases in this application': 'No hay bases de datos en esta aplicación',
|
||||
'Online examples': 'Ejemplos en línea',
|
||||
'or import from csv file': 'o importar desde archivo CSV',
|
||||
'or provide application url:': 'o provea URL de la aplicación:',
|
||||
'Origin': 'Origen',
|
||||
'Original/Translation': 'Original/Traducción',
|
||||
'Other Plugins': 'Other Plugins',
|
||||
'Other Recipes': 'Other Recipes',
|
||||
'Overview': 'Overview',
|
||||
'pack all': 'empaquetar todo',
|
||||
'pack compiled': 'empaquete compiladas',
|
||||
'Password': 'Contraseña',
|
||||
'Peeking at file': 'Visualizando archivo',
|
||||
'Plugins': 'Plugins',
|
||||
'Powered by': 'Este sitio usa',
|
||||
'Preface': 'Preface',
|
||||
'previous 100 rows': '100 filas anteriores',
|
||||
'Python': 'Python',
|
||||
'Query:': 'Consulta:',
|
||||
'Quick Examples': 'Quick Examples',
|
||||
'RAM': 'RAM',
|
||||
'RAM Cache Keys': 'RAM Cache Keys',
|
||||
'Ram Cleared': 'Ram Cleared',
|
||||
'Recipes': 'Recipes',
|
||||
'Record': 'registro',
|
||||
'record does not exist': 'el registro no existe',
|
||||
'Record ID': 'ID de Registro',
|
||||
'Record id': 'id de registro',
|
||||
'Register': 'Registrese',
|
||||
'register': 'registrese',
|
||||
'Registration key': 'Contraseña de Registro',
|
||||
'remove compiled': 'eliminar compiladas',
|
||||
'Reset Password key': 'Reset Password key',
|
||||
'Resolve Conflict file': 'archivo Resolución de Conflicto',
|
||||
'restore': 'restaurar',
|
||||
'revert': 'revertir',
|
||||
'Role': 'Rol',
|
||||
'Rows in Table': 'Filas en la tabla',
|
||||
'Rows selected': 'Filas seleccionadas',
|
||||
'save': 'guardar',
|
||||
'Saved file hash:': 'Hash del archivo guardado:',
|
||||
'Semantic': 'Semantic',
|
||||
'Services': 'Services',
|
||||
'session expired': 'sesión expirada',
|
||||
'shell': 'shell',
|
||||
'site': 'sitio',
|
||||
'Size of cache:': 'Size of cache:',
|
||||
'some files could not be removed': 'algunos archivos no pudieron ser removidos',
|
||||
'state': 'estado',
|
||||
'static': 'estáticos',
|
||||
'Static files': 'Archivos estáticos',
|
||||
'Statistics': 'Statistics',
|
||||
'Stylesheet': 'Hoja de estilo',
|
||||
'submit': 'submit',
|
||||
'Support': 'Support',
|
||||
'Sure you want to delete this object?': '¿Está seguro que desea eliminar este objeto?',
|
||||
'Table': 'tabla',
|
||||
'Table name': 'Nombre de la tabla',
|
||||
'test': 'probar',
|
||||
'Testing application': 'Probando aplicación',
|
||||
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'La "consulta" es una condición como "db.tabla1.campo1==\'valor\'". Algo como "db.tabla1.campo1==db.tabla2.campo2" resulta en un JOIN SQL.',
|
||||
'the application logic, each URL path is mapped in one exposed function in the controller': 'la lógica de la aplicación, cada ruta URL se mapea en una función expuesta en el controlador',
|
||||
'The Core': 'The Core',
|
||||
'the data representation, define database tables and sets': 'la representación de datos, define tablas y conjuntos de base de datos',
|
||||
'The output of the file is a dictionary that was rendered by the view %s': 'La salida del archivo es un diccionario escenificado por la vista %s',
|
||||
'the presentations layer, views are also known as templates': 'la capa de presentación, las vistas también son llamadas plantillas',
|
||||
'The Views': 'The Views',
|
||||
'There are no controllers': 'No hay controladores',
|
||||
'There are no models': 'No hay modelos',
|
||||
'There are no modules': 'No hay módulos',
|
||||
'There are no static files': 'No hay archivos estáticos',
|
||||
'There are no translators, only default language is supported': 'No hay traductores, sólo el lenguaje por defecto es soportado',
|
||||
'There are no views': 'No hay vistas',
|
||||
'these files are served without processing, your images go here': 'estos archivos son servidos sin procesar, sus imágenes van aquí',
|
||||
'This App': 'This App',
|
||||
'This is a copy of the scaffolding application': 'Esta es una copia de la aplicación de andamiaje',
|
||||
'This is the %(filename)s template': 'Esta es la plantilla %(filename)s',
|
||||
'Ticket': 'Tiquete',
|
||||
'Time in Cache (h:m:s)': 'Time in Cache (h:m:s)',
|
||||
'Timestamp': 'Timestamp',
|
||||
'to previous version.': 'a la versión previa.',
|
||||
'translation strings for the application': 'cadenas de caracteres de traducción para la aplicación',
|
||||
'try': 'intente',
|
||||
'try something like': 'intente algo como',
|
||||
'Twitter': 'Twitter',
|
||||
'Unable to check for upgrades': 'No es posible verificar la existencia de actualizaciones',
|
||||
'unable to create application "%s"': 'no es posible crear la aplicación "%s"',
|
||||
'unable to delete file "%(filename)s"': 'no es posible eliminar el archivo "%(filename)s"',
|
||||
'Unable to download': 'No es posible la descarga',
|
||||
'Unable to download app': 'No es posible descarga la aplicación',
|
||||
'unable to parse csv file': 'no es posible analizar el archivo CSV',
|
||||
'unable to uninstall "%s"': 'no es posible instalar "%s"',
|
||||
'uncheck all': 'desmarcar todos',
|
||||
'uninstall': 'desinstalar',
|
||||
'update': 'actualizar',
|
||||
'update all languages': 'actualizar todos los lenguajes',
|
||||
'Update:': 'Actualice:',
|
||||
'upload application:': 'subir aplicación:',
|
||||
'Upload existing application': 'Suba esta aplicación',
|
||||
'upload file:': 'suba archivo:',
|
||||
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Use (...)&(...) para AND, (...)|(...) para OR, y ~(...) para NOT, para crear consultas más complejas.',
|
||||
'User ID': 'ID de Usuario',
|
||||
'versioning': 'versiones',
|
||||
'Videos': 'Videos',
|
||||
'view': 'vista',
|
||||
'View': 'Vista',
|
||||
'Views': 'Vistas',
|
||||
'views': 'vistas',
|
||||
'web2py Recent Tweets': 'Tweets Recientes de web2py',
|
||||
'web2py is up to date': 'web2py está actualizado',
|
||||
'web2py Recent Tweets': 'Tweets Recientes de web2py',
|
||||
'Welcome': 'Welcome',
|
||||
'Welcome %s': 'Bienvenido %s',
|
||||
'Welcome to web2py': 'Bienvenido a web2py',
|
||||
'Welcome to web2py!': 'Welcome to web2py!',
|
||||
'Which called the function %s located in the file %s': 'La cual llamó la función %s localizada en el archivo %s',
|
||||
'YES': 'SI',
|
||||
'You are successfully running web2py': 'Usted está ejecutando web2py exitosamente',
|
||||
'You can modify this application and adapt it to your needs': 'Usted puede modificar esta aplicación y adaptarla a sus necesidades',
|
||||
'You visited the url %s': 'Usted visitó la url %s',
|
||||
}
|
||||
|
||||
@@ -3,42 +3,67 @@
|
||||
'!langcode!': 'fr-ca',
|
||||
'!langname!': 'Français (Canadien)',
|
||||
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"update" est une expression optionnelle comme "champ1=\'nouvellevaleur\'". Vous ne pouvez mettre à jour ou supprimer les résultats d\'un JOIN',
|
||||
'%Y-%m-%d': '%Y-%m-%d',
|
||||
'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
|
||||
'%s %%{row} deleted': '%s rangées supprimées',
|
||||
'%s %%{row} updated': '%s rangées mises à jour',
|
||||
'%s selected': '%s sélectionné',
|
||||
'%Y-%m-%d': '%Y-%m-%d',
|
||||
'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
|
||||
'about': 'à propos',
|
||||
'About': 'À propos',
|
||||
'Access Control': "Contrôle d'accès",
|
||||
'Administrative Interface': 'Administrative Interface',
|
||||
'Administrative interface': "Interface d'administration",
|
||||
'Ajax Recipes': 'Recettes Ajax',
|
||||
'appadmin is disabled because insecure channel': "appadmin est désactivée parce que le canal n'est pas sécurisé",
|
||||
'Are you sure you want to delete this object?': 'Êtes-vous sûr de vouloir supprimer cet objet?',
|
||||
'Authentication': 'Authentification',
|
||||
'Available Databases and Tables': 'Bases de données et tables disponibles',
|
||||
'Buy this book': 'Acheter ce livre',
|
||||
'cache': 'cache',
|
||||
'Cache': 'Cache',
|
||||
'Cache Keys': 'Cache Keys',
|
||||
'Cannot be empty': 'Ne peut pas être vide',
|
||||
'change password': 'changer le mot de passe',
|
||||
'Check to delete': 'Cliquez pour supprimer',
|
||||
'Check to delete:': 'Cliquez pour supprimer:',
|
||||
'Clear CACHE?': 'Clear CACHE?',
|
||||
'Clear DISK': 'Clear DISK',
|
||||
'Clear RAM': 'Clear RAM',
|
||||
'Client IP': 'IP client',
|
||||
'Community': 'Communauté',
|
||||
'Components and Plugins': 'Components and Plugins',
|
||||
'Controller': 'Contrôleur',
|
||||
'Copyright': "Droit d'auteur",
|
||||
'Current request': 'Demande actuelle',
|
||||
'Current response': 'Réponse actuelle',
|
||||
'Current session': 'Session en cours',
|
||||
'customize me!': 'personnalisez-moi!',
|
||||
'data uploaded': 'données téléchargées',
|
||||
'Database': 'base de données',
|
||||
'Database %s select': 'base de données %s select',
|
||||
'db': 'db',
|
||||
'DB Model': 'Modèle DB',
|
||||
'Database': 'Base de données',
|
||||
'Delete:': 'Supprimer:',
|
||||
'Demo': 'Démo',
|
||||
'Deployment Recipes': 'Recettes de déploiement ',
|
||||
'Description': 'Descriptif',
|
||||
'design': 'design',
|
||||
'DISK': 'DISK',
|
||||
'Disk Cache Keys': 'Disk Cache Keys',
|
||||
'Disk Cleared': 'Disk Cleared',
|
||||
'Documentation': 'Documentation',
|
||||
"Don't know what to do?": "Don't know what to do?",
|
||||
'done!': 'fait!',
|
||||
'Download': 'Téléchargement',
|
||||
'E-mail': 'Courriel',
|
||||
'Edit': 'Éditer',
|
||||
'Edit This App': 'Modifier cette application',
|
||||
'Edit current record': "Modifier l'enregistrement courant",
|
||||
'edit profile': 'modifier le profil',
|
||||
'Edit This App': 'Modifier cette application',
|
||||
'Email and SMS': 'Email and SMS',
|
||||
'enter an integer between %(min)g and %(max)g': 'entrer un entier compris entre %(min)g et %(max)g',
|
||||
'Errors': 'Erreurs',
|
||||
'export as csv file': 'exporter sous forme de fichier csv',
|
||||
'FAQ': 'faq',
|
||||
'First name': 'Prénom',
|
||||
'Forms and Validators': 'Formulaires et Validateurs',
|
||||
@@ -50,44 +75,73 @@
|
||||
'Groups': 'Groupes',
|
||||
'Hello World': 'Bonjour le monde',
|
||||
'Home': 'Accueil',
|
||||
'How did you get here?': 'How did you get here?',
|
||||
'import': 'import',
|
||||
'Import/Export': 'Importer/Exporter',
|
||||
'Index': 'Index',
|
||||
'insert new': 'insérer un nouveau',
|
||||
'insert new %s': 'insérer un nouveau %s',
|
||||
'Internal State': 'État interne',
|
||||
'Introduction': 'Présentation',
|
||||
'Invalid Query': 'Requête Invalide',
|
||||
'Invalid email': 'Courriel invalide',
|
||||
'Invalid Query': 'Requête Invalide',
|
||||
'invalid request': 'requête invalide',
|
||||
'Key': 'Key',
|
||||
'Last name': 'Nom',
|
||||
'Layout': 'Mise en page',
|
||||
'Layout Plugins': 'Layout Plugins',
|
||||
'Layouts': 'layouts',
|
||||
'Live chat': 'Clavardage en direct',
|
||||
'Live Chat': 'Live Chat',
|
||||
'Logged in': 'Connecté',
|
||||
'login': 'connectez-vous',
|
||||
'Login': 'Connectez-vous',
|
||||
'logout': 'déconnectez-vous',
|
||||
'lost password': 'mot de passe perdu',
|
||||
'Lost Password': 'Mot de passe perdu',
|
||||
'lost password?': 'mot de passe perdu?',
|
||||
'Main Menu': 'Menu principal',
|
||||
'Manage Cache': 'Manage Cache',
|
||||
'Menu Model': 'Menu modèle',
|
||||
'My Sites': 'My Sites',
|
||||
'Name': 'Nom',
|
||||
'New Record': 'Nouvel enregistrement',
|
||||
'new record inserted': 'nouvel enregistrement inséré',
|
||||
'next 100 rows': '100 prochaines lignes',
|
||||
'No databases in this application': "Cette application n'a pas de bases de données",
|
||||
'Online examples': 'Exemples en ligne',
|
||||
'or import from csv file': "ou importer d'un fichier CSV",
|
||||
'Origin': 'Origine',
|
||||
'Other Plugins': 'Other Plugins',
|
||||
'Other Recipes': 'Autres recettes',
|
||||
'Overview': 'Présentation',
|
||||
'password': 'mot de passe',
|
||||
'Password': 'Mot de passe',
|
||||
"Password fields don't match": 'Les mots de passe ne correspondent pas',
|
||||
'please input your password again': "S'il vous plaît entrer votre mot de passe",
|
||||
'Plugins': 'Plugiciels',
|
||||
'Powered by': 'Alimenté par',
|
||||
'Preface': 'Préface',
|
||||
'previous 100 rows': '100 lignes précédentes',
|
||||
'profile': 'profile',
|
||||
'Python': 'Python',
|
||||
'Query:': 'Requête:',
|
||||
'Quick Examples': 'Examples Rapides',
|
||||
'RAM': 'RAM',
|
||||
'RAM Cache Keys': 'RAM Cache Keys',
|
||||
'Ram Cleared': 'Ram Cleared',
|
||||
'Readme': 'Lisez-moi',
|
||||
'Recipes': 'Recettes',
|
||||
'Record': 'enregistrement',
|
||||
'Record %(id)s created': 'Record %(id)s created',
|
||||
'Record %(id)s updated': 'Record %(id)s updated',
|
||||
'Record Created': 'Record Created',
|
||||
'record does not exist': "l'archive n'existe pas",
|
||||
'Record ID': "ID d'enregistrement",
|
||||
'Record id': "id d'enregistrement",
|
||||
'Record Updated': 'Record Updated',
|
||||
'Register': "S'inscrire",
|
||||
'register': "s'inscrire",
|
||||
'Registration key': "Clé d'enregistrement",
|
||||
'Registration successful': 'Inscription réussie',
|
||||
'Remember me (for 30 days)': 'Se souvenir de moi (pendant 30 jours)',
|
||||
@@ -99,25 +153,33 @@
|
||||
'Rows selected': 'Lignes sélectionnées',
|
||||
'Semantic': 'Sémantique',
|
||||
'Services': 'Services',
|
||||
'Size of cache:': 'Size of cache:',
|
||||
'state': 'état',
|
||||
'Statistics': 'Statistics',
|
||||
'Stylesheet': 'Feuille de style',
|
||||
'submit': 'submit',
|
||||
'Submit': 'Soumettre',
|
||||
'Support': 'Soutien',
|
||||
'Sure you want to delete this object?': 'Êtes-vous sûr de vouloir supprimer cet objet?',
|
||||
'Table': 'tableau',
|
||||
'Table name': 'Nom du tableau',
|
||||
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'La "query" est une condition comme "db.table1.champ1==\'valeur\'". Quelque chose comme "db.table1.champ1==db.table2.champ2" résulte en un JOIN SQL.',
|
||||
'The Core': 'Le noyau',
|
||||
'The Views': 'Les Vues',
|
||||
'The output of the file is a dictionary that was rendered by the view %s': 'La sortie de ce fichier est un dictionnaire qui été restitué par la vue %s',
|
||||
'The Views': 'Les Vues',
|
||||
'This App': 'Cette Appli',
|
||||
'This is a copy of the scaffolding application': "Ceci est une copie de l'application échafaudage",
|
||||
'Time in Cache (h:m:s)': 'Time in Cache (h:m:s)',
|
||||
'Timestamp': 'Horodatage',
|
||||
'Twitter': 'Twitter',
|
||||
'unable to parse csv file': "incapable d'analyser le fichier cvs",
|
||||
'Update:': 'Mise à jour:',
|
||||
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Employez (...)&(...) pour AND, (...)|(...) pour OR, and ~(...) pour NOT pour construire des requêtes plus complexes.',
|
||||
'User %(id)s Logged-in': 'Utilisateur %(id)s connecté',
|
||||
'User %(id)s Registered': 'Utilisateur %(id)s enregistré',
|
||||
'User ID': 'ID utilisateur',
|
||||
'User Voice': 'User Voice',
|
||||
'value already in database or empty': 'valeur déjà dans la base ou vide',
|
||||
'Verify Password': 'Vérifiez le mot de passe',
|
||||
'Videos': 'Vidéos',
|
||||
'View': 'Présentation',
|
||||
@@ -125,44 +187,9 @@
|
||||
'Welcome': 'Bienvenu',
|
||||
'Welcome %s': 'Bienvenue %s',
|
||||
'Welcome to web2py': 'Bienvenue à web2py',
|
||||
'Welcome to web2py!': 'Welcome to web2py!',
|
||||
'Which called the function %s located in the file %s': 'Qui a appelé la fonction %s se trouvant dans le fichier %s',
|
||||
'You are successfully running web2py': 'Vous roulez avec succès web2py',
|
||||
'You can modify this application and adapt it to your needs': "Vous pouvez modifier cette application et l'adapter à vos besoins",
|
||||
'You visited the url %s': "Vous avez visité l'URL %s",
|
||||
'about': 'à propos',
|
||||
'appadmin is disabled because insecure channel': "appadmin est désactivée parce que le canal n'est pas sécurisé",
|
||||
'cache': 'cache',
|
||||
'change password': 'changer le mot de passe',
|
||||
'customize me!': 'personnalisez-moi!',
|
||||
'data uploaded': 'données téléchargées',
|
||||
'Database': 'base de données',
|
||||
'Database %s select': 'base de données %s select',
|
||||
'db': 'db',
|
||||
'design': 'design',
|
||||
'done!': 'fait!',
|
||||
'edit profile': 'modifier le profil',
|
||||
'enter an integer between %(min)g and %(max)g': 'entrer un entier compris entre %(min)g et %(max)g',
|
||||
'export as csv file': 'exporter sous forme de fichier csv',
|
||||
'insert new': 'insérer un nouveau',
|
||||
'insert new %s': 'insérer un nouveau %s',
|
||||
'invalid request': 'requête invalide',
|
||||
'login': 'connectez-vous',
|
||||
'logout': 'déconnectez-vous',
|
||||
'lost password': 'mot de passe perdu',
|
||||
'lost password?': 'mot de passe perdu?',
|
||||
'new record inserted': 'nouvel enregistrement inséré',
|
||||
'next 100 rows': '100 prochaines lignes',
|
||||
'or import from csv file': "ou importer d'un fichier CSV",
|
||||
'password': 'mot de passe',
|
||||
'please input your password again': "S'il vous plaît entrer votre mot de passe",
|
||||
'previous 100 rows': '100 lignes précédentes',
|
||||
'profile': 'profile',
|
||||
'Record': 'enregistrement',
|
||||
'record does not exist': "l'archive n'existe pas",
|
||||
'Record id': "id d'enregistrement",
|
||||
'register': "s'inscrire",
|
||||
'state': 'état',
|
||||
'Table': 'tableau',
|
||||
'unable to parse csv file': "incapable d'analyser le fichier cvs",
|
||||
'value already in database or empty': 'valeur déjà dans la base ou vide',
|
||||
}
|
||||
|
||||
@@ -19,10 +19,15 @@
|
||||
'Available Databases and Tables': 'Bases de données et tables disponibles',
|
||||
'Buy this book': 'Acheter ce livre',
|
||||
'cache': 'cache',
|
||||
'Cache': 'Cache',
|
||||
'Cache Keys': 'Cache Keys',
|
||||
'Cannot be empty': 'Ne peut pas être vide',
|
||||
'change password': 'changer le mot de passe',
|
||||
'Check to delete': 'Cliquez pour supprimer',
|
||||
'Check to delete:': 'Cliquez pour supprimer:',
|
||||
'Clear CACHE?': 'Clear CACHE?',
|
||||
'Clear DISK': 'Clear DISK',
|
||||
'Clear RAM': 'Clear RAM',
|
||||
'Client IP': 'IP client',
|
||||
'Community': 'Communauté',
|
||||
'Components and Plugins': 'Components and Plugins',
|
||||
@@ -33,7 +38,6 @@
|
||||
'Current session': 'Session en cours',
|
||||
'customize me!': 'personnalisez-moi!',
|
||||
'data uploaded': 'données téléchargées',
|
||||
'Database': 'Base de données',
|
||||
'Database': 'base de données',
|
||||
'Database %s select': 'base de données %s select',
|
||||
'db': 'db',
|
||||
@@ -43,6 +47,9 @@
|
||||
'Deployment Recipes': 'Recettes de déploiement',
|
||||
'Description': 'Description',
|
||||
'design': 'design',
|
||||
'DISK': 'DISK',
|
||||
'Disk Cache Keys': 'Disk Cache Keys',
|
||||
'Disk Cleared': 'Disk Cleared',
|
||||
'Documentation': 'Documentation',
|
||||
"Don't know what to do?": "Don't know what to do?",
|
||||
'done!': 'fait!',
|
||||
@@ -66,6 +73,7 @@
|
||||
'Hello World': 'Bonjour le monde',
|
||||
'Home': 'Accueil',
|
||||
'How did you get here?': 'How did you get here?',
|
||||
'import': 'import',
|
||||
'Import/Export': 'Importer/Exporter',
|
||||
'Index': 'Index',
|
||||
'insert new': 'insérer un nouveau',
|
||||
@@ -75,20 +83,22 @@
|
||||
'Invalid email': 'E-mail invalide',
|
||||
'Invalid Query': 'Requête Invalide',
|
||||
'invalid request': 'requête invalide',
|
||||
'Key': 'Key',
|
||||
'Last name': 'Nom',
|
||||
'Layout': 'Mise en page',
|
||||
'Layout Plugins': 'Layout Plugins',
|
||||
'Layouts': 'Layouts',
|
||||
'Live chat': 'Chat live',
|
||||
'Live Chat': 'Live Chat',
|
||||
'Login': 'Connectez-vous',
|
||||
'login': 'connectez-vous',
|
||||
'Login': 'Connectez-vous',
|
||||
'logout': 'déconnectez-vous',
|
||||
'lost password': 'mot de passe perdu',
|
||||
'Lost Password': 'Mot de passe perdu',
|
||||
'lost password?': 'mot de passe perdu?',
|
||||
'Lost password?': 'Lost password?',
|
||||
'lost password?': 'mot de passe perdu?',
|
||||
'Main Menu': 'Menu principal',
|
||||
'Manage Cache': 'Manage Cache',
|
||||
'Menu Model': 'Menu modèle',
|
||||
'My Sites': 'My Sites',
|
||||
'Name': 'Nom',
|
||||
@@ -112,12 +122,15 @@
|
||||
'Python': 'Python',
|
||||
'Query:': 'Requête:',
|
||||
'Quick Examples': 'Examples Rapides',
|
||||
'RAM': 'RAM',
|
||||
'RAM Cache Keys': 'RAM Cache Keys',
|
||||
'Ram Cleared': 'Ram Cleared',
|
||||
'Readme': 'Lisez-moi',
|
||||
'Recipes': 'Recettes',
|
||||
'Record': 'enregistrement',
|
||||
'record does not exist': "l'archive n'existe pas",
|
||||
'Record id': "id d'enregistrement",
|
||||
'Record ID': "ID d'enregistrement",
|
||||
'Record id': "id d'enregistrement",
|
||||
'Register': "S'inscrire",
|
||||
'register': "s'inscrire",
|
||||
'Registration identifier': 'Registration identifier',
|
||||
@@ -131,8 +144,11 @@
|
||||
'Rows selected': 'Lignes sélectionnées',
|
||||
'Semantic': 'Sémantique',
|
||||
'Services': 'Services',
|
||||
'Size of cache:': 'Size of cache:',
|
||||
'state': 'état',
|
||||
'Statistics': 'Statistics',
|
||||
'Stylesheet': 'Feuille de style',
|
||||
'submit': 'submit',
|
||||
'Submit': 'Soumettre',
|
||||
'Support': 'Support',
|
||||
'Sure you want to delete this object?': 'Êtes-vous sûr de vouloir supprimer cet objet?',
|
||||
@@ -144,6 +160,7 @@
|
||||
'The Views': 'Les Vues',
|
||||
'This App': 'Cette Appli',
|
||||
'This is a copy of the scaffolding application': "Ceci est une copie de l'application échafaudage",
|
||||
'Time in Cache (h:m:s)': 'Time in Cache (h:m:s)',
|
||||
'Timestamp': 'Horodatage',
|
||||
'Twitter': 'Twitter',
|
||||
'unable to parse csv file': "incapable d'analyser le fichier cvs",
|
||||
|
||||
@@ -3,85 +3,147 @@
|
||||
'!langcode!': 'hi-in',
|
||||
'!langname!': 'हिन्दी',
|
||||
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN',
|
||||
'%Y-%m-%d': '%Y-%m-%d',
|
||||
'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
|
||||
'%s %%{row} deleted': '%s पंक्तियाँ मिटाएँ',
|
||||
'%s %%{row} updated': '%s पंक्तियाँ अद्यतन',
|
||||
'%s selected': '%s चुना हुआ',
|
||||
'%Y-%m-%d': '%Y-%m-%d',
|
||||
'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
|
||||
'About': 'About',
|
||||
'Access Control': 'Access Control',
|
||||
'Administrative Interface': 'Administrative Interface',
|
||||
'Administrative interface': 'प्रशासनिक इंटरफेस के लिए यहाँ क्लिक करें',
|
||||
'Ajax Recipes': 'Ajax Recipes',
|
||||
'appadmin is disabled because insecure channel': 'अप आडमिन (appadmin) अक्षम है क्योंकि असुरक्षित चैनल',
|
||||
'Are you sure you want to delete this object?': 'Are you sure you want to delete this object?',
|
||||
'Available Databases and Tables': 'उपलब्ध डेटाबेस और तालिका',
|
||||
'Buy this book': 'Buy this book',
|
||||
'cache': 'cache',
|
||||
'Cache': 'Cache',
|
||||
'Cache Keys': 'Cache Keys',
|
||||
'Cannot be empty': 'खाली नहीं हो सकता',
|
||||
'Change Password': 'पासवर्ड बदलें',
|
||||
'change password': 'change password',
|
||||
'Check to delete': 'हटाने के लिए चुनें',
|
||||
'Clear CACHE?': 'Clear CACHE?',
|
||||
'Clear DISK': 'Clear DISK',
|
||||
'Clear RAM': 'Clear RAM',
|
||||
'Community': 'Community',
|
||||
'Components and Plugins': 'Components and Plugins',
|
||||
'Controller': 'Controller',
|
||||
'Copyright': 'Copyright',
|
||||
'Current request': 'वर्तमान अनुरोध',
|
||||
'Current response': 'वर्तमान प्रतिक्रिया',
|
||||
'Current session': 'वर्तमान सेशन',
|
||||
'DB Model': 'DB Model',
|
||||
'Database': 'Database',
|
||||
'Delete:': 'मिटाना:',
|
||||
'Edit': 'Edit',
|
||||
'Edit Profile': 'प्रोफ़ाइल संपादित करें',
|
||||
'Edit This App': 'Edit This App',
|
||||
'Edit current record': 'वर्तमान रेकॉर्ड संपादित करें ',
|
||||
'Hello World': 'Hello World',
|
||||
'Hello from MyApp': 'Hello from MyApp',
|
||||
'Import/Export': 'आयात / निर्यात',
|
||||
'Index': 'Index',
|
||||
'Internal State': 'आंतरिक स्थिति',
|
||||
'Invalid Query': 'अमान्य प्रश्न',
|
||||
'Layout': 'Layout',
|
||||
'Login': 'लॉग इन',
|
||||
'Logout': 'लॉग आउट',
|
||||
'Lost Password': 'पासवर्ड खो गया',
|
||||
'Main Menu': 'Main Menu',
|
||||
'Menu Model': 'Menu Model',
|
||||
'New Record': 'नया रेकॉर्ड',
|
||||
'No databases in this application': 'इस अनुप्रयोग में कोई डेटाबेस नहीं हैं',
|
||||
'Online examples': 'ऑनलाइन उदाहरण के लिए यहाँ क्लिक करें',
|
||||
'Powered by': 'Powered by',
|
||||
'Query:': 'प्रश्न:',
|
||||
'Register': 'पंजीकृत (रजिस्टर) करना ',
|
||||
'Rows in Table': 'तालिका में पंक्तियाँ ',
|
||||
'Rows selected': 'चयनित (चुने गये) पंक्तियाँ ',
|
||||
'Stylesheet': 'Stylesheet',
|
||||
'Sure you want to delete this object?': 'सुनिश्चित हैं कि आप इस वस्तु को हटाना चाहते हैं?',
|
||||
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.',
|
||||
'The output of the file is a dictionary that was rendered by the view %s': 'The output of the file is a dictionary that was rendered by the view %s',
|
||||
'Update:': 'अद्यतन करना:',
|
||||
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.',
|
||||
'View': 'View',
|
||||
'Welcome %s': 'Welcome %s',
|
||||
'Welcome to web2py': 'वेब२पाइ (web2py) में आपका स्वागत है',
|
||||
'Which called the function %s located in the file %s': 'Which called the function %s located in the file %s',
|
||||
'You visited the url %s': 'You visited the url %s',
|
||||
'appadmin is disabled because insecure channel': 'अप आडमिन (appadmin) अक्षम है क्योंकि असुरक्षित चैनल',
|
||||
'cache': 'cache',
|
||||
'change password': 'change password',
|
||||
'customize me!': 'मुझे अनुकूलित (कस्टमाइज़) करें!',
|
||||
'data uploaded': 'डाटा अपलोड सम्पन्न ',
|
||||
'Database': 'डेटाबेस',
|
||||
'Database %s select': 'डेटाबेस %s चुनी हुई',
|
||||
'db': 'db',
|
||||
'DB Model': 'DB Model',
|
||||
'Delete:': 'मिटाना:',
|
||||
'Demo': 'Demo',
|
||||
'Deployment Recipes': 'Deployment Recipes',
|
||||
'design': 'रचना करें',
|
||||
'DISK': 'DISK',
|
||||
'Disk Cache Keys': 'Disk Cache Keys',
|
||||
'Disk Cleared': 'Disk Cleared',
|
||||
'Documentation': 'Documentation',
|
||||
"Don't know what to do?": "Don't know what to do?",
|
||||
'done!': 'हो गया!',
|
||||
'Download': 'Download',
|
||||
'Edit': 'Edit',
|
||||
'Edit current record': 'वर्तमान रेकॉर्ड संपादित करें ',
|
||||
'edit profile': 'edit profile',
|
||||
'Edit Profile': 'प्रोफ़ाइल संपादित करें',
|
||||
'Edit This App': 'Edit This App',
|
||||
'Email and SMS': 'Email and SMS',
|
||||
'Errors': 'Errors',
|
||||
'export as csv file': 'csv फ़ाइल के रूप में निर्यात',
|
||||
'FAQ': 'FAQ',
|
||||
'Forms and Validators': 'Forms and Validators',
|
||||
'Free Applications': 'Free Applications',
|
||||
'Groups': 'Groups',
|
||||
'Hello from MyApp': 'Hello from MyApp',
|
||||
'Hello World': 'Hello World',
|
||||
'Home': 'Home',
|
||||
'How did you get here?': 'How did you get here?',
|
||||
'import': 'import',
|
||||
'Import/Export': 'आयात / निर्यात',
|
||||
'Index': 'Index',
|
||||
'insert new': 'नया डालें',
|
||||
'insert new %s': 'नया %s डालें',
|
||||
'Internal State': 'आंतरिक स्थिति',
|
||||
'Introduction': 'Introduction',
|
||||
'Invalid Query': 'अमान्य प्रश्न',
|
||||
'invalid request': 'अवैध अनुरोध',
|
||||
'Key': 'Key',
|
||||
'Layout': 'Layout',
|
||||
'Layout Plugins': 'Layout Plugins',
|
||||
'Layouts': 'Layouts',
|
||||
'Live Chat': 'Live Chat',
|
||||
'login': 'login',
|
||||
'Login': 'लॉग इन',
|
||||
'logout': 'logout',
|
||||
'Logout': 'लॉग आउट',
|
||||
'Lost Password': 'पासवर्ड खो गया',
|
||||
'Main Menu': 'Main Menu',
|
||||
'Manage Cache': 'Manage Cache',
|
||||
'Menu Model': 'Menu Model',
|
||||
'My Sites': 'My Sites',
|
||||
'New Record': 'नया रेकॉर्ड',
|
||||
'new record inserted': 'नया रेकॉर्ड डाला',
|
||||
'next 100 rows': 'अगले 100 पंक्तियाँ',
|
||||
'No databases in this application': 'इस अनुप्रयोग में कोई डेटाबेस नहीं हैं',
|
||||
'Online examples': 'ऑनलाइन उदाहरण के लिए यहाँ क्लिक करें',
|
||||
'or import from csv file': 'या csv फ़ाइल से आयात',
|
||||
'Other Plugins': 'Other Plugins',
|
||||
'Other Recipes': 'Other Recipes',
|
||||
'Overview': 'Overview',
|
||||
'Plugins': 'Plugins',
|
||||
'Powered by': 'Powered by',
|
||||
'Preface': 'Preface',
|
||||
'previous 100 rows': 'पिछले 100 पंक्तियाँ',
|
||||
'Python': 'Python',
|
||||
'Query:': 'प्रश्न:',
|
||||
'Quick Examples': 'Quick Examples',
|
||||
'RAM': 'RAM',
|
||||
'RAM Cache Keys': 'RAM Cache Keys',
|
||||
'Ram Cleared': 'Ram Cleared',
|
||||
'Recipes': 'Recipes',
|
||||
'Record': 'Record',
|
||||
'record does not exist': 'रिकॉर्ड मौजूद नहीं है',
|
||||
'Record id': 'रिकॉर्ड पहचानकर्ता (आईडी)',
|
||||
'Register': 'पंजीकृत (रजिस्टर) करना ',
|
||||
'register': 'register',
|
||||
'Rows in Table': 'तालिका में पंक्तियाँ ',
|
||||
'Rows selected': 'चयनित (चुने गये) पंक्तियाँ ',
|
||||
'Semantic': 'Semantic',
|
||||
'Services': 'Services',
|
||||
'Size of cache:': 'Size of cache:',
|
||||
'state': 'स्थिति',
|
||||
'Statistics': 'Statistics',
|
||||
'Stylesheet': 'Stylesheet',
|
||||
'submit': 'submit',
|
||||
'Support': 'Support',
|
||||
'Sure you want to delete this object?': 'सुनिश्चित हैं कि आप इस वस्तु को हटाना चाहते हैं?',
|
||||
'Table': 'तालिका',
|
||||
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.',
|
||||
'The Core': 'The Core',
|
||||
'The output of the file is a dictionary that was rendered by the view %s': 'The output of the file is a dictionary that was rendered by the view %s',
|
||||
'The Views': 'The Views',
|
||||
'This App': 'This App',
|
||||
'Time in Cache (h:m:s)': 'Time in Cache (h:m:s)',
|
||||
'Twitter': 'Twitter',
|
||||
'unable to parse csv file': 'csv फ़ाइल पार्स करने में असमर्थ',
|
||||
'Update:': 'अद्यतन करना:',
|
||||
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.',
|
||||
'Videos': 'Videos',
|
||||
'View': 'View',
|
||||
'Welcome %s': 'Welcome %s',
|
||||
'Welcome to web2py': 'वेब२पाइ (web2py) में आपका स्वागत है',
|
||||
'Welcome to web2py!': 'Welcome to web2py!',
|
||||
'Which called the function %s located in the file %s': 'Which called the function %s located in the file %s',
|
||||
'You are successfully running web2py': 'You are successfully running web2py',
|
||||
'You can modify this application and adapt it to your needs': 'You can modify this application and adapt it to your needs',
|
||||
'You visited the url %s': 'You visited the url %s',
|
||||
}
|
||||
|
||||
@@ -3,96 +3,160 @@
|
||||
'!langcode!': 'hu',
|
||||
'!langname!': 'Magyar',
|
||||
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN',
|
||||
'%Y-%m-%d': '%Y.%m.%d.',
|
||||
'%Y-%m-%d %H:%M:%S': '%Y.%m.%d. %H:%M:%S',
|
||||
'%s %%{row} deleted': '%s sorok törlődtek',
|
||||
'%s %%{row} updated': '%s sorok frissítődtek',
|
||||
'%s selected': '%s kiválasztott',
|
||||
'%Y-%m-%d': '%Y.%m.%d.',
|
||||
'%Y-%m-%d %H:%M:%S': '%Y.%m.%d. %H:%M:%S',
|
||||
'About': 'About',
|
||||
'Access Control': 'Access Control',
|
||||
'Administrative Interface': 'Administrative Interface',
|
||||
'Administrative interface': 'az adminisztrációs felületért kattints ide',
|
||||
'Ajax Recipes': 'Ajax Recipes',
|
||||
'appadmin is disabled because insecure channel': 'az appadmin a biztonságtalan csatorna miatt letiltva',
|
||||
'Are you sure you want to delete this object?': 'Are you sure you want to delete this object?',
|
||||
'Available Databases and Tables': 'Elérhető adatbázisok és táblák',
|
||||
'Buy this book': 'Buy this book',
|
||||
'cache': 'gyorsítótár',
|
||||
'Cache': 'Cache',
|
||||
'Cache Keys': 'Cache Keys',
|
||||
'Cannot be empty': 'Nem lehet üres',
|
||||
'change password': 'jelszó megváltoztatása',
|
||||
'Check to delete': 'Törléshez válaszd ki',
|
||||
'Clear CACHE?': 'Clear CACHE?',
|
||||
'Clear DISK': 'Clear DISK',
|
||||
'Clear RAM': 'Clear RAM',
|
||||
'Client IP': 'Client IP',
|
||||
'Community': 'Community',
|
||||
'Components and Plugins': 'Components and Plugins',
|
||||
'Controller': 'Controller',
|
||||
'Copyright': 'Copyright',
|
||||
'Current request': 'Jelenlegi lekérdezés',
|
||||
'Current response': 'Jelenlegi válasz',
|
||||
'Current session': 'Jelenlegi folyamat',
|
||||
'DB Model': 'DB Model',
|
||||
'Database': 'Adatbázis',
|
||||
'Delete:': 'Töröl:',
|
||||
'Description': 'Description',
|
||||
'E-mail': 'E-mail',
|
||||
'Edit': 'Szerkeszt',
|
||||
'Edit This App': 'Alkalmazást szerkeszt',
|
||||
'Edit current record': 'Aktuális bejegyzés szerkesztése',
|
||||
'First name': 'First name',
|
||||
'Group ID': 'Group ID',
|
||||
'Hello World': 'Hello Világ',
|
||||
'Import/Export': 'Import/Export',
|
||||
'Index': 'Index',
|
||||
'Internal State': 'Internal State',
|
||||
'Invalid Query': 'Hibás lekérdezés',
|
||||
'Invalid email': 'Invalid email',
|
||||
'Last name': 'Last name',
|
||||
'Layout': 'Szerkezet',
|
||||
'Main Menu': 'Főmenü',
|
||||
'Menu Model': 'Menü model',
|
||||
'Name': 'Name',
|
||||
'New Record': 'Új bejegyzés',
|
||||
'No databases in this application': 'Nincs adatbázis ebben az alkalmazásban',
|
||||
'Online examples': 'online példákért kattints ide',
|
||||
'Origin': 'Origin',
|
||||
'Password': 'Password',
|
||||
'Powered by': 'Powered by',
|
||||
'Query:': 'Lekérdezés:',
|
||||
'Record ID': 'Record ID',
|
||||
'Registration key': 'Registration key',
|
||||
'Reset Password key': 'Reset Password key',
|
||||
'Role': 'Role',
|
||||
'Rows in Table': 'Sorok a táblában',
|
||||
'Rows selected': 'Kiválasztott sorok',
|
||||
'Stylesheet': 'Stylesheet',
|
||||
'Sure you want to delete this object?': 'Biztos törli ezt az objektumot?',
|
||||
'Table name': 'Table name',
|
||||
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.',
|
||||
'The output of the file is a dictionary that was rendered by the view %s': 'The output of the file is a dictionary that was rendered by the view %s',
|
||||
'Timestamp': 'Timestamp',
|
||||
'Update:': 'Frissít:',
|
||||
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.',
|
||||
'User ID': 'User ID',
|
||||
'View': 'Nézet',
|
||||
'Welcome %s': 'Welcome %s',
|
||||
'Welcome to web2py': 'Isten hozott a web2py-ban',
|
||||
'Which called the function %s located in the file %s': 'Which called the function %s located in the file %s',
|
||||
'You visited the url %s': 'You visited the url %s',
|
||||
'appadmin is disabled because insecure channel': 'az appadmin a biztonságtalan csatorna miatt letiltva',
|
||||
'cache': 'gyorsítótár',
|
||||
'change password': 'jelszó megváltoztatása',
|
||||
'customize me!': 'változtass meg!',
|
||||
'data uploaded': 'adat feltöltve',
|
||||
'Database': 'adatbázis',
|
||||
'Database %s select': 'adatbázis %s kiválasztás',
|
||||
'db': 'db',
|
||||
'DB Model': 'DB Model',
|
||||
'Delete:': 'Töröl:',
|
||||
'Demo': 'Demo',
|
||||
'Deployment Recipes': 'Deployment Recipes',
|
||||
'Description': 'Description',
|
||||
'design': 'design',
|
||||
'DISK': 'DISK',
|
||||
'Disk Cache Keys': 'Disk Cache Keys',
|
||||
'Disk Cleared': 'Disk Cleared',
|
||||
'Documentation': 'Documentation',
|
||||
"Don't know what to do?": "Don't know what to do?",
|
||||
'done!': 'kész!',
|
||||
'Download': 'Download',
|
||||
'E-mail': 'E-mail',
|
||||
'Edit': 'Szerkeszt',
|
||||
'Edit current record': 'Aktuális bejegyzés szerkesztése',
|
||||
'edit profile': 'profil szerkesztése',
|
||||
'Edit This App': 'Alkalmazást szerkeszt',
|
||||
'Email and SMS': 'Email and SMS',
|
||||
'Errors': 'Errors',
|
||||
'export as csv file': 'exportál csv fájlba',
|
||||
'FAQ': 'FAQ',
|
||||
'First name': 'First name',
|
||||
'Forms and Validators': 'Forms and Validators',
|
||||
'Free Applications': 'Free Applications',
|
||||
'Group ID': 'Group ID',
|
||||
'Groups': 'Groups',
|
||||
'Hello World': 'Hello Világ',
|
||||
'Home': 'Home',
|
||||
'How did you get here?': 'How did you get here?',
|
||||
'import': 'import',
|
||||
'Import/Export': 'Import/Export',
|
||||
'Index': 'Index',
|
||||
'insert new': 'új beillesztése',
|
||||
'insert new %s': 'új beillesztése %s',
|
||||
'Internal State': 'Internal State',
|
||||
'Introduction': 'Introduction',
|
||||
'Invalid email': 'Invalid email',
|
||||
'Invalid Query': 'Hibás lekérdezés',
|
||||
'invalid request': 'hibás kérés',
|
||||
'Key': 'Key',
|
||||
'Last name': 'Last name',
|
||||
'Layout': 'Szerkezet',
|
||||
'Layout Plugins': 'Layout Plugins',
|
||||
'Layouts': 'Layouts',
|
||||
'Live Chat': 'Live Chat',
|
||||
'login': 'belép',
|
||||
'logout': 'kilép',
|
||||
'lost password': 'elveszett jelszó',
|
||||
'Lost Password': 'Lost Password',
|
||||
'Main Menu': 'Főmenü',
|
||||
'Manage Cache': 'Manage Cache',
|
||||
'Menu Model': 'Menü model',
|
||||
'My Sites': 'My Sites',
|
||||
'Name': 'Name',
|
||||
'New Record': 'Új bejegyzés',
|
||||
'new record inserted': 'új bejegyzés felvéve',
|
||||
'next 100 rows': 'következő 100 sor',
|
||||
'No databases in this application': 'Nincs adatbázis ebben az alkalmazásban',
|
||||
'Online examples': 'online példákért kattints ide',
|
||||
'or import from csv file': 'vagy betöltés csv fájlból',
|
||||
'Origin': 'Origin',
|
||||
'Other Plugins': 'Other Plugins',
|
||||
'Other Recipes': 'Other Recipes',
|
||||
'Overview': 'Overview',
|
||||
'Password': 'Password',
|
||||
'Plugins': 'Plugins',
|
||||
'Powered by': 'Powered by',
|
||||
'Preface': 'Preface',
|
||||
'previous 100 rows': 'előző 100 sor',
|
||||
'Python': 'Python',
|
||||
'Query:': 'Lekérdezés:',
|
||||
'Quick Examples': 'Quick Examples',
|
||||
'RAM': 'RAM',
|
||||
'RAM Cache Keys': 'RAM Cache Keys',
|
||||
'Ram Cleared': 'Ram Cleared',
|
||||
'Recipes': 'Recipes',
|
||||
'Record': 'bejegyzés',
|
||||
'record does not exist': 'bejegyzés nem létezik',
|
||||
'Record ID': 'Record ID',
|
||||
'Record id': 'bejegyzés id',
|
||||
'Register': 'Register',
|
||||
'register': 'regisztráció',
|
||||
'Registration key': 'Registration key',
|
||||
'Reset Password key': 'Reset Password key',
|
||||
'Role': 'Role',
|
||||
'Rows in Table': 'Sorok a táblában',
|
||||
'Rows selected': 'Kiválasztott sorok',
|
||||
'Semantic': 'Semantic',
|
||||
'Services': 'Services',
|
||||
'Size of cache:': 'Size of cache:',
|
||||
'state': 'állapot',
|
||||
'Statistics': 'Statistics',
|
||||
'Stylesheet': 'Stylesheet',
|
||||
'submit': 'submit',
|
||||
'Support': 'Support',
|
||||
'Sure you want to delete this object?': 'Biztos törli ezt az objektumot?',
|
||||
'Table': 'tábla',
|
||||
'Table name': 'Table name',
|
||||
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.',
|
||||
'The Core': 'The Core',
|
||||
'The output of the file is a dictionary that was rendered by the view %s': 'The output of the file is a dictionary that was rendered by the view %s',
|
||||
'The Views': 'The Views',
|
||||
'This App': 'This App',
|
||||
'Time in Cache (h:m:s)': 'Time in Cache (h:m:s)',
|
||||
'Timestamp': 'Timestamp',
|
||||
'Twitter': 'Twitter',
|
||||
'unable to parse csv file': 'nem lehet a csv fájlt beolvasni',
|
||||
'Update:': 'Frissít:',
|
||||
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.',
|
||||
'User ID': 'User ID',
|
||||
'Videos': 'Videos',
|
||||
'View': 'Nézet',
|
||||
'Welcome %s': 'Welcome %s',
|
||||
'Welcome to web2py': 'Isten hozott a web2py-ban',
|
||||
'Welcome to web2py!': 'Welcome to web2py!',
|
||||
'Which called the function %s located in the file %s': 'Which called the function %s located in the file %s',
|
||||
'You are successfully running web2py': 'You are successfully running web2py',
|
||||
'You can modify this application and adapt it to your needs': 'You can modify this application and adapt it to your needs',
|
||||
'You visited the url %s': 'You visited the url %s',
|
||||
}
|
||||
|
||||
@@ -1,38 +1,57 @@
|
||||
# coding: utf8
|
||||
{
|
||||
'!=': '!=',
|
||||
'!langcode!': 'it',
|
||||
'!langname!': 'Italiano',
|
||||
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"update" è un\'espressione opzionale come "campo1=\'nuovo valore\'". Non si può fare "update" o "delete" dei risultati di un JOIN ',
|
||||
'%(nrows)s records found': '%(nrows)s records found',
|
||||
'%d seconds ago': '%d seconds ago',
|
||||
'%s %%{row} deleted': '%s righe ("record") cancellate',
|
||||
'%s %%{row} updated': '%s righe ("record") modificate',
|
||||
'%s selected': '%s selezionato',
|
||||
'%Y-%m-%d': '%d/%m/%Y',
|
||||
'%Y-%m-%d %H:%M:%S': '%d/%m/%Y %H:%M:%S',
|
||||
'<': '<',
|
||||
'<=': '<=',
|
||||
'=': '=',
|
||||
'>': '>',
|
||||
'>=': '>=',
|
||||
'@markmin\x01Number of entries: **%s**': 'Number of entries: **%s**',
|
||||
'About': 'About',
|
||||
'Access Control': 'Access Control',
|
||||
'Add': 'Add',
|
||||
'Administrative Interface': 'Administrative Interface',
|
||||
'Administrative interface': 'Interfaccia amministrativa',
|
||||
'Ajax Recipes': 'Ajax Recipes',
|
||||
'And': 'And',
|
||||
'appadmin is disabled because insecure channel': 'Amministrazione (appadmin) disabilitata: comunicazione non sicura',
|
||||
'Are you sure you want to delete this object?': 'Are you sure you want to delete this object?',
|
||||
'Available Databases and Tables': 'Database e tabelle disponibili',
|
||||
'Back': 'Back',
|
||||
'Buy this book': 'Buy this book',
|
||||
'cache': 'cache',
|
||||
'Cache': 'Cache',
|
||||
'Cache Keys': 'Cache Keys',
|
||||
'Cannot be empty': 'Non può essere vuoto',
|
||||
'Change password': 'Change password',
|
||||
'change password': 'Cambia password',
|
||||
'Check to delete': 'Seleziona per cancellare',
|
||||
'Clear': 'Clear',
|
||||
'Clear CACHE?': 'Clear CACHE?',
|
||||
'Clear DISK': 'Clear DISK',
|
||||
'Clear RAM': 'Clear RAM',
|
||||
'Client IP': 'Client IP',
|
||||
'Close': 'Close',
|
||||
'Cognome': 'Cognome',
|
||||
'Community': 'Community',
|
||||
'Components and Plugins': 'Components and Plugins',
|
||||
'contains': 'contains',
|
||||
'Controller': 'Controller',
|
||||
'Copyright': 'Copyright',
|
||||
'Created By': 'Created By',
|
||||
'Created On': 'Created On',
|
||||
'CSV': 'CSV',
|
||||
'CSV (hidden cols)': 'CSV (hidden cols)',
|
||||
'Current request': 'Richiesta (request) corrente',
|
||||
'Current response': 'Risposta (response) corrente',
|
||||
'Current session': 'Sessione (session) corrente',
|
||||
@@ -49,6 +68,7 @@
|
||||
'Description': 'Descrizione',
|
||||
'design': 'progetta',
|
||||
'DISK': 'DISK',
|
||||
'Disk Cache Keys': 'Disk Cache Keys',
|
||||
'Disk Cleared': 'Disk Cleared',
|
||||
'Documentation': 'Documentazione',
|
||||
"Don't know what to do?": "Don't know what to do?",
|
||||
@@ -63,9 +83,12 @@
|
||||
'Email non valida': 'Email non valida',
|
||||
'enter an integer between %(min)g and %(max)g': 'enter an integer between %(min)g and %(max)g',
|
||||
'Errors': 'Errors',
|
||||
'Errors in form, please check it out.': 'Errors in form, please check it out.',
|
||||
'export as csv file': 'esporta come file CSV',
|
||||
'Export:': 'Export:',
|
||||
'FAQ': 'FAQ',
|
||||
'First name': 'Nome',
|
||||
'Forgot username?': 'Forgot username?',
|
||||
'Forms and Validators': 'Forms and Validators',
|
||||
'Free Applications': 'Free Applications',
|
||||
'Group %(group_id)s created': 'Group %(group_id)s created',
|
||||
@@ -78,6 +101,7 @@
|
||||
'Hello World in a flash!': 'Salve Mondo in un flash!',
|
||||
'Home': 'Home',
|
||||
'How did you get here?': 'How did you get here?',
|
||||
'HTML': 'HTML',
|
||||
'import': 'import',
|
||||
'Import/Export': 'Importa/Esporta',
|
||||
'Index': 'Indice',
|
||||
@@ -90,6 +114,7 @@
|
||||
'Invalid Query': 'Richiesta (query) non valida',
|
||||
'invalid request': 'richiesta non valida',
|
||||
'Is Active': 'Is Active',
|
||||
'Key': 'Key',
|
||||
'Last name': 'Cognome',
|
||||
'Layout': 'Layout',
|
||||
'Layout Plugins': 'Layout Plugins',
|
||||
@@ -111,14 +136,20 @@
|
||||
'Modified On': 'Modified On',
|
||||
'My Sites': 'My Sites',
|
||||
'Name': 'Nome',
|
||||
'New': 'New',
|
||||
'New password': 'New password',
|
||||
'New Record': 'Nuovo elemento (record)',
|
||||
'new record inserted': 'nuovo record inserito',
|
||||
'next 100 rows': 'prossime 100 righe',
|
||||
'No databases in this application': 'Nessun database presente in questa applicazione',
|
||||
'No records found': 'No records found',
|
||||
'Nome': 'Nome',
|
||||
'Non può essere vuoto': 'Non può essere vuoto',
|
||||
'not authorized': 'non autorizzato',
|
||||
'Object or table name': 'Object or table name',
|
||||
'Old password': 'Old password',
|
||||
'Online examples': 'Vedere gli esempi',
|
||||
'Or': 'Or',
|
||||
'or import from csv file': 'oppure importa da file CSV',
|
||||
'Origin': 'Origine',
|
||||
'Other Plugins': 'Other Plugins',
|
||||
@@ -136,6 +167,7 @@
|
||||
'Query:': 'Richiesta (query):',
|
||||
'Quick Examples': 'Quick Examples',
|
||||
'RAM': 'RAM',
|
||||
'RAM Cache Keys': 'RAM Cache Keys',
|
||||
'Ram Cleared': 'Ram Cleared',
|
||||
'Recipes': 'Recipes',
|
||||
'Record': 'Record',
|
||||
@@ -148,13 +180,19 @@
|
||||
'Registration key': 'Chiave di Registazione',
|
||||
'Registration successful': 'Registration successful',
|
||||
'Remember me (for 30 days)': 'Remember me (for 30 days)',
|
||||
'Request reset password': 'Request reset password',
|
||||
'Reset Password key': 'Resetta chiave Password ',
|
||||
'Role': 'Ruolo',
|
||||
'Rows in Table': 'Righe nella tabella',
|
||||
'Rows selected': 'Righe selezionate',
|
||||
'Save profile': 'Save profile',
|
||||
'Search': 'Search',
|
||||
'Semantic': 'Semantic',
|
||||
'Services': 'Services',
|
||||
'Size of cache:': 'Size of cache:',
|
||||
'starts with': 'starts with',
|
||||
'state': 'stato',
|
||||
'Statistics': 'Statistics',
|
||||
'Stylesheet': 'Foglio di stile (stylesheet)',
|
||||
'submit': 'submit',
|
||||
'Submit': 'Submit',
|
||||
@@ -168,8 +206,11 @@
|
||||
'The Views': 'The Views',
|
||||
'This App': 'This App',
|
||||
'This is a copy of the scaffolding application': "Questa è una copia dell'applicazione di base (scaffold)",
|
||||
'Time in Cache (h:m:s)': 'Time in Cache (h:m:s)',
|
||||
'Timestamp': 'Ora (timestamp)',
|
||||
'too short': 'too short',
|
||||
'TSV (Excel compatible)': 'TSV (Excel compatible)',
|
||||
'TSV (Excel compatible, hidden cols)': 'TSV (Excel compatible, hidden cols)',
|
||||
'Twitter': 'Twitter',
|
||||
'unable to parse csv file': 'non riesco a decodificare questo file CSV',
|
||||
'Update': 'Update',
|
||||
@@ -177,8 +218,12 @@
|
||||
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Per costruire richieste (query) più complesse si usano (...)&(...) come "e" (AND), (...)|(...) come "o" (OR), e ~(...) come negazione (NOT).',
|
||||
'User %(id)s Logged-in': 'User %(id)s Logged-in',
|
||||
'User %(id)s Logged-out': 'User %(id)s Logged-out',
|
||||
'User %(id)s Password changed': 'User %(id)s Password changed',
|
||||
'User %(id)s Password reset': 'User %(id)s Password reset',
|
||||
'User %(id)s Profile updated': 'User %(id)s Profile updated',
|
||||
'User %(id)s Registered': 'User %(id)s Registered',
|
||||
'User ID': 'ID Utente',
|
||||
'value already in database or empty': 'value already in database or empty',
|
||||
'Verify Password': 'Verify Password',
|
||||
'Videos': 'Videos',
|
||||
'View': 'Vista',
|
||||
@@ -187,6 +232,7 @@
|
||||
'Welcome to web2py': 'Benvenuto su web2py',
|
||||
'Welcome to web2py!': 'Welcome to web2py!',
|
||||
'Which called the function %s located in the file %s': 'che ha chiamato la funzione %s presente nel file %s',
|
||||
'XML': 'XML',
|
||||
'You are successfully running web2py': 'Stai eseguendo web2py con successo',
|
||||
'You can modify this application and adapt it to your needs': 'Puoi modificare questa applicazione adattandola alle tue necessità',
|
||||
'You visited the url %s': "Hai visitato l'URL %s",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
{
|
||||
'!langcode!': 'nl',
|
||||
'!langname!': 'Nederlands',
|
||||
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN',
|
||||
'%(nrows)s records found': '%(nrows)s records gevonden',
|
||||
'%d days ago': '%d dagen geleden',
|
||||
'%d weeks ago': '%d weken gelden',
|
||||
@@ -95,7 +96,6 @@
|
||||
'customize me!': 'pas me aan!',
|
||||
'data uploaded': 'data geupload',
|
||||
'Database': 'Database',
|
||||
'Database': 'Database',
|
||||
'Database %s select': 'Database %s select',
|
||||
'database administration': 'database administratie',
|
||||
'Date and Time': 'Datum en Tijd',
|
||||
@@ -181,8 +181,8 @@
|
||||
'Introduction': 'Introductie',
|
||||
'Invalid action': 'Ongeldige actie',
|
||||
'Invalid email': 'Ongeldig emailadres',
|
||||
'Invalid password': 'Ongeldig wachtwoord',
|
||||
'invalid password': 'ongeldig wachtwoord',
|
||||
'Invalid password': 'Ongeldig wachtwoord',
|
||||
'Invalid Query': 'Ongeldige Query',
|
||||
'invalid request': 'ongeldige request',
|
||||
'invalid ticket': 'ongeldige ticket',
|
||||
@@ -262,8 +262,8 @@
|
||||
'Recipes': 'Recepten',
|
||||
'Record': 'Record',
|
||||
'record does not exist': 'record bestaat niet',
|
||||
'Record id': 'Record id',
|
||||
'Record ID': 'Record ID',
|
||||
'Record id': 'Record id',
|
||||
'register': 'registreer',
|
||||
'Register': 'Registreer',
|
||||
'Registration identifier': 'Registratie identifier',
|
||||
|
||||
@@ -3,107 +3,169 @@
|
||||
'!langcode!': 'pl',
|
||||
'!langname!': 'Polska',
|
||||
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"Uaktualnij" jest dodatkowym wyrażeniem postaci "pole1=\'nowawartość\'". Nie możesz uaktualnić lub usunąć wyników z JOIN:',
|
||||
'%Y-%m-%d': '%Y-%m-%d',
|
||||
'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
|
||||
'%s %%{row} deleted': 'Wierszy usuniętych: %s',
|
||||
'%s %%{row} updated': 'Wierszy uaktualnionych: %s',
|
||||
'%s selected': '%s wybranych',
|
||||
'%Y-%m-%d': '%Y-%m-%d',
|
||||
'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
|
||||
'About': 'About',
|
||||
'Access Control': 'Access Control',
|
||||
'Administrative Interface': 'Administrative Interface',
|
||||
'Administrative interface': 'Kliknij aby przejść do panelu administracyjnego',
|
||||
'Ajax Recipes': 'Ajax Recipes',
|
||||
'appadmin is disabled because insecure channel': 'administracja aplikacji wyłączona z powodu braku bezpiecznego połączenia',
|
||||
'Are you sure you want to delete this object?': 'Are you sure you want to delete this object?',
|
||||
'Authentication': 'Uwierzytelnienie',
|
||||
'Available Databases and Tables': 'Dostępne bazy danych i tabele',
|
||||
'Buy this book': 'Buy this book',
|
||||
'cache': 'cache',
|
||||
'Cache': 'Cache',
|
||||
'Cache Keys': 'Cache Keys',
|
||||
'Cannot be empty': 'Nie może być puste',
|
||||
'Change Password': 'Zmień hasło',
|
||||
'change password': 'change password',
|
||||
'Check to delete': 'Zaznacz aby usunąć',
|
||||
'Check to delete:': 'Zaznacz aby usunąć:',
|
||||
'Clear CACHE?': 'Clear CACHE?',
|
||||
'Clear DISK': 'Clear DISK',
|
||||
'Clear RAM': 'Clear RAM',
|
||||
'Client IP': 'IP klienta',
|
||||
'Community': 'Community',
|
||||
'Components and Plugins': 'Components and Plugins',
|
||||
'Controller': 'Kontroler',
|
||||
'Copyright': 'Copyright',
|
||||
'Current request': 'Aktualne żądanie',
|
||||
'Current response': 'Aktualna odpowiedź',
|
||||
'Current session': 'Aktualna sesja',
|
||||
'DB Model': 'Model bazy danych',
|
||||
'Database': 'Baza danych',
|
||||
'Delete:': 'Usuń:',
|
||||
'Description': 'Opis',
|
||||
'E-mail': 'Adres e-mail',
|
||||
'Edit': 'Edycja',
|
||||
'Edit Profile': 'Edytuj profil',
|
||||
'Edit This App': 'Edytuj tę aplikację',
|
||||
'Edit current record': 'Edytuj obecny rekord',
|
||||
'First name': 'Imię',
|
||||
'Function disabled': 'Funkcja wyłączona',
|
||||
'Group ID': 'ID grupy',
|
||||
'Hello World': 'Witaj Świecie',
|
||||
'Import/Export': 'Importuj/eksportuj',
|
||||
'Index': 'Indeks',
|
||||
'Internal State': 'Stan wewnętrzny',
|
||||
'Invalid Query': 'Błędne zapytanie',
|
||||
'Invalid email': 'Błędny adres email',
|
||||
'Last name': 'Nazwisko',
|
||||
'Layout': 'Układ',
|
||||
'Login': 'Zaloguj',
|
||||
'Logout': 'Wyloguj',
|
||||
'Lost Password': 'Przypomnij hasło',
|
||||
'Main Menu': 'Menu główne',
|
||||
'Menu Model': 'Model menu',
|
||||
'Name': 'Nazwa',
|
||||
'New Record': 'Nowy rekord',
|
||||
'No databases in this application': 'Brak baz danych w tej aplikacji',
|
||||
'Online examples': 'Kliknij aby przejść do interaktywnych przykładów',
|
||||
'Origin': 'Źródło',
|
||||
'Password': 'Hasło',
|
||||
"Password fields don't match": 'Pola hasła nie są zgodne ze sobą',
|
||||
'Powered by': 'Zasilane przez',
|
||||
'Query:': 'Zapytanie:',
|
||||
'Record ID': 'ID rekordu',
|
||||
'Register': 'Zarejestruj',
|
||||
'Registration key': 'Klucz rejestracji',
|
||||
'Role': 'Rola',
|
||||
'Rows in Table': 'Wiersze w tabeli',
|
||||
'Rows selected': 'Wybrane wiersze',
|
||||
'Stylesheet': 'Arkusz stylów',
|
||||
'Submit': 'Wyślij',
|
||||
'Sure you want to delete this object?': 'Czy na pewno chcesz usunąć ten obiekt?',
|
||||
'Table name': 'Nazwa tabeli',
|
||||
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': '"Zapytanie" jest warunkiem postaci "db.tabela1.pole1==\'wartość\'". Takie coś jak "db.tabela1.pole1==db.tabela2.pole2" oznacza SQL JOIN.',
|
||||
'The output of the file is a dictionary that was rendered by the view %s': 'The output of the file is a dictionary that was rendered by the view %s',
|
||||
'Timestamp': 'Znacznik czasu',
|
||||
'Update:': 'Uaktualnij:',
|
||||
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Użyj (...)&(...) jako AND, (...)|(...) jako OR oraz ~(...) jako NOT do tworzenia bardziej skomplikowanych zapytań.',
|
||||
'User %(id)s Registered': 'Użytkownik %(id)s został zarejestrowany',
|
||||
'User ID': 'ID użytkownika',
|
||||
'Verify Password': 'Potwierdź hasło',
|
||||
'View': 'Widok',
|
||||
'Welcome %s': 'Welcome %s',
|
||||
'Welcome to web2py': 'Witaj w web2py',
|
||||
'Which called the function %s located in the file %s': 'Which called the function %s located in the file %s',
|
||||
'You visited the url %s': 'You visited the url %s',
|
||||
'appadmin is disabled because insecure channel': 'administracja aplikacji wyłączona z powodu braku bezpiecznego połączenia',
|
||||
'cache': 'cache',
|
||||
'change password': 'change password',
|
||||
'customize me!': 'dostosuj mnie!',
|
||||
'data uploaded': 'dane wysłane',
|
||||
'Database': 'baza danych',
|
||||
'Database %s select': 'wybór z bazy danych %s',
|
||||
'db': 'baza danych',
|
||||
'DB Model': 'Model bazy danych',
|
||||
'Delete:': 'Usuń:',
|
||||
'Demo': 'Demo',
|
||||
'Deployment Recipes': 'Deployment Recipes',
|
||||
'Description': 'Opis',
|
||||
'design': 'projektuj',
|
||||
'DISK': 'DISK',
|
||||
'Disk Cache Keys': 'Disk Cache Keys',
|
||||
'Disk Cleared': 'Disk Cleared',
|
||||
'Documentation': 'Documentation',
|
||||
"Don't know what to do?": "Don't know what to do?",
|
||||
'done!': 'zrobione!',
|
||||
'Download': 'Download',
|
||||
'E-mail': 'Adres e-mail',
|
||||
'Edit': 'Edycja',
|
||||
'Edit current record': 'Edytuj obecny rekord',
|
||||
'edit profile': 'edit profile',
|
||||
'Edit Profile': 'Edytuj profil',
|
||||
'Edit This App': 'Edytuj tę aplikację',
|
||||
'Email and SMS': 'Email and SMS',
|
||||
'Errors': 'Errors',
|
||||
'export as csv file': 'eksportuj jako plik csv',
|
||||
'FAQ': 'FAQ',
|
||||
'First name': 'Imię',
|
||||
'Forms and Validators': 'Forms and Validators',
|
||||
'Free Applications': 'Free Applications',
|
||||
'Function disabled': 'Funkcja wyłączona',
|
||||
'Group ID': 'ID grupy',
|
||||
'Groups': 'Groups',
|
||||
'Hello World': 'Witaj Świecie',
|
||||
'Home': 'Home',
|
||||
'How did you get here?': 'How did you get here?',
|
||||
'import': 'import',
|
||||
'Import/Export': 'Importuj/eksportuj',
|
||||
'Index': 'Indeks',
|
||||
'insert new': 'wstaw nowy rekord tabeli',
|
||||
'insert new %s': 'wstaw nowy rekord do tabeli %s',
|
||||
'Internal State': 'Stan wewnętrzny',
|
||||
'Introduction': 'Introduction',
|
||||
'Invalid email': 'Błędny adres email',
|
||||
'Invalid Query': 'Błędne zapytanie',
|
||||
'invalid request': 'Błędne żądanie',
|
||||
'Key': 'Key',
|
||||
'Last name': 'Nazwisko',
|
||||
'Layout': 'Układ',
|
||||
'Layout Plugins': 'Layout Plugins',
|
||||
'Layouts': 'Layouts',
|
||||
'Live Chat': 'Live Chat',
|
||||
'login': 'login',
|
||||
'Login': 'Zaloguj',
|
||||
'logout': 'logout',
|
||||
'Logout': 'Wyloguj',
|
||||
'Lost Password': 'Przypomnij hasło',
|
||||
'Main Menu': 'Menu główne',
|
||||
'Manage Cache': 'Manage Cache',
|
||||
'Menu Model': 'Model menu',
|
||||
'My Sites': 'My Sites',
|
||||
'Name': 'Nazwa',
|
||||
'New Record': 'Nowy rekord',
|
||||
'new record inserted': 'nowy rekord został wstawiony',
|
||||
'next 100 rows': 'następne 100 wierszy',
|
||||
'No databases in this application': 'Brak baz danych w tej aplikacji',
|
||||
'Online examples': 'Kliknij aby przejść do interaktywnych przykładów',
|
||||
'or import from csv file': 'lub zaimportuj z pliku csv',
|
||||
'Origin': 'Źródło',
|
||||
'Other Plugins': 'Other Plugins',
|
||||
'Other Recipes': 'Other Recipes',
|
||||
'Overview': 'Overview',
|
||||
'Password': 'Hasło',
|
||||
"Password fields don't match": 'Pola hasła nie są zgodne ze sobą',
|
||||
'Plugins': 'Plugins',
|
||||
'Powered by': 'Zasilane przez',
|
||||
'Preface': 'Preface',
|
||||
'previous 100 rows': 'poprzednie 100 wierszy',
|
||||
'Python': 'Python',
|
||||
'Query:': 'Zapytanie:',
|
||||
'Quick Examples': 'Quick Examples',
|
||||
'RAM': 'RAM',
|
||||
'RAM Cache Keys': 'RAM Cache Keys',
|
||||
'Ram Cleared': 'Ram Cleared',
|
||||
'Recipes': 'Recipes',
|
||||
'Record': 'rekord',
|
||||
'record does not exist': 'rekord nie istnieje',
|
||||
'Record ID': 'ID rekordu',
|
||||
'Record id': 'id rekordu',
|
||||
'Register': 'Zarejestruj',
|
||||
'register': 'register',
|
||||
'Registration key': 'Klucz rejestracji',
|
||||
'Role': 'Rola',
|
||||
'Rows in Table': 'Wiersze w tabeli',
|
||||
'Rows selected': 'Wybrane wiersze',
|
||||
'Semantic': 'Semantic',
|
||||
'Services': 'Services',
|
||||
'Size of cache:': 'Size of cache:',
|
||||
'state': 'stan',
|
||||
'Statistics': 'Statistics',
|
||||
'Stylesheet': 'Arkusz stylów',
|
||||
'submit': 'submit',
|
||||
'Submit': 'Wyślij',
|
||||
'Support': 'Support',
|
||||
'Sure you want to delete this object?': 'Czy na pewno chcesz usunąć ten obiekt?',
|
||||
'Table': 'tabela',
|
||||
'Table name': 'Nazwa tabeli',
|
||||
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': '"Zapytanie" jest warunkiem postaci "db.tabela1.pole1==\'wartość\'". Takie coś jak "db.tabela1.pole1==db.tabela2.pole2" oznacza SQL JOIN.',
|
||||
'The Core': 'The Core',
|
||||
'The output of the file is a dictionary that was rendered by the view %s': 'The output of the file is a dictionary that was rendered by the view %s',
|
||||
'The Views': 'The Views',
|
||||
'This App': 'This App',
|
||||
'Time in Cache (h:m:s)': 'Time in Cache (h:m:s)',
|
||||
'Timestamp': 'Znacznik czasu',
|
||||
'Twitter': 'Twitter',
|
||||
'unable to parse csv file': 'nie można sparsować pliku csv',
|
||||
'Update:': 'Uaktualnij:',
|
||||
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Użyj (...)&(...) jako AND, (...)|(...) jako OR oraz ~(...) jako NOT do tworzenia bardziej skomplikowanych zapytań.',
|
||||
'User %(id)s Registered': 'Użytkownik %(id)s został zarejestrowany',
|
||||
'User ID': 'ID użytkownika',
|
||||
'Verify Password': 'Potwierdź hasło',
|
||||
'Videos': 'Videos',
|
||||
'View': 'Widok',
|
||||
'Welcome %s': 'Welcome %s',
|
||||
'Welcome to web2py': 'Witaj w web2py',
|
||||
'Welcome to web2py!': 'Welcome to web2py!',
|
||||
'Which called the function %s located in the file %s': 'Which called the function %s located in the file %s',
|
||||
'You are successfully running web2py': 'You are successfully running web2py',
|
||||
'You can modify this application and adapt it to your needs': 'You can modify this application and adapt it to your needs',
|
||||
'You visited the url %s': 'You visited the url %s',
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
'book': ['books'],
|
||||
'is': ['are'],
|
||||
'man': ['men'],
|
||||
'miss': ['misses'],
|
||||
'person': ['people'],
|
||||
'quark': ['quarks'],
|
||||
'shop': ['shops'],
|
||||
|
||||
@@ -3,39 +3,63 @@
|
||||
'!langcode!': 'pt-br',
|
||||
'!langname!': 'Português (do Brasil)',
|
||||
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"update" é uma expressão opcional como "campo1=\'novovalor\'". Você não pode atualizar ou apagar os resultados de um JOIN',
|
||||
'%Y-%m-%d': '%d-%m-%Y',
|
||||
'%Y-%m-%d %H:%M:%S': '%d-%m-%Y %H:%M:%S',
|
||||
'%s %%{row} deleted': '%s linhas apagadas',
|
||||
'%s %%{row} updated': '%s linhas atualizadas',
|
||||
'%s selected': '%s selecionado',
|
||||
'%Y-%m-%d': '%d-%m-%Y',
|
||||
'%Y-%m-%d %H:%M:%S': '%d-%m-%Y %H:%M:%S',
|
||||
'About': 'About',
|
||||
'Access Control': 'Access Control',
|
||||
'Administrative Interface': 'Administrative Interface',
|
||||
'Administrative interface': 'Interface administrativa',
|
||||
'Ajax Recipes': 'Ajax Recipes',
|
||||
'appadmin is disabled because insecure channel': 'Administração desativada devido ao canal inseguro',
|
||||
'Are you sure you want to delete this object?': 'Are you sure you want to delete this object?',
|
||||
'Available Databases and Tables': 'Bancos de dados e tabelas disponíveis',
|
||||
'Buy this book': 'Buy this book',
|
||||
'cache': 'cache',
|
||||
'Cache': 'Cache',
|
||||
'Cache Keys': 'Cache Keys',
|
||||
'Cannot be empty': 'Não pode ser vazio',
|
||||
'change password': 'modificar senha',
|
||||
'Check to delete': 'Marque para apagar',
|
||||
'Clear CACHE?': 'Clear CACHE?',
|
||||
'Clear DISK': 'Clear DISK',
|
||||
'Clear RAM': 'Clear RAM',
|
||||
'Client IP': 'Client IP',
|
||||
'Community': 'Community',
|
||||
'Components and Plugins': 'Components and Plugins',
|
||||
'Controller': 'Controlador',
|
||||
'Copyright': 'Copyright',
|
||||
'Current request': 'Requisição atual',
|
||||
'Current response': 'Resposta atual',
|
||||
'Current session': 'Sessão atual',
|
||||
'customize me!': 'Personalize-me!',
|
||||
'data uploaded': 'dados enviados',
|
||||
'Database': 'banco de dados',
|
||||
'Database %s select': 'Selecionar banco de dados %s',
|
||||
'db': 'bd',
|
||||
'DB Model': 'Modelo BD',
|
||||
'Database': 'Banco de dados',
|
||||
'Delete:': 'Apagar:',
|
||||
'Demo': 'Demo',
|
||||
'Deployment Recipes': 'Deployment Recipes',
|
||||
'Description': 'Description',
|
||||
'design': 'design',
|
||||
'DISK': 'DISK',
|
||||
'Disk Cache Keys': 'Disk Cache Keys',
|
||||
'Disk Cleared': 'Disk Cleared',
|
||||
'Documentation': 'Documentation',
|
||||
"Don't know what to do?": "Don't know what to do?",
|
||||
'done!': 'concluído!',
|
||||
'Download': 'Download',
|
||||
'E-mail': 'E-mail',
|
||||
'Edit': 'Editar',
|
||||
'Edit This App': 'Edit This App',
|
||||
'Edit current record': 'Editar o registro atual',
|
||||
'edit profile': 'editar perfil',
|
||||
'Edit This App': 'Edit This App',
|
||||
'Email and SMS': 'Email and SMS',
|
||||
'Errors': 'Errors',
|
||||
'export as csv file': 'exportar como um arquivo csv',
|
||||
'FAQ': 'FAQ',
|
||||
'First name': 'First name',
|
||||
'Forms and Validators': 'Forms and Validators',
|
||||
@@ -44,37 +68,62 @@
|
||||
'Groups': 'Groups',
|
||||
'Hello World': 'Olá Mundo',
|
||||
'Home': 'Home',
|
||||
'How did you get here?': 'How did you get here?',
|
||||
'import': 'import',
|
||||
'Import/Export': 'Importar/Exportar',
|
||||
'Index': 'Início',
|
||||
'insert new': 'inserir novo',
|
||||
'insert new %s': 'inserir novo %s',
|
||||
'Internal State': 'Estado Interno',
|
||||
'Introduction': 'Introduction',
|
||||
'Invalid Query': 'Consulta Inválida',
|
||||
'Invalid email': 'Invalid email',
|
||||
'Invalid Query': 'Consulta Inválida',
|
||||
'invalid request': 'requisição inválida',
|
||||
'Key': 'Key',
|
||||
'Last name': 'Last name',
|
||||
'Layout': 'Layout',
|
||||
'Layout Plugins': 'Layout Plugins',
|
||||
'Layouts': 'Layouts',
|
||||
'Live chat': 'Live chat',
|
||||
'Live Chat': 'Live Chat',
|
||||
'login': 'Entrar',
|
||||
'Login': 'Autentique-se',
|
||||
'logout': 'Sair',
|
||||
'Lost Password': 'Esqueceu sua senha?',
|
||||
'lost password?': 'lost password?',
|
||||
'Main Menu': 'Menu Principal',
|
||||
'Manage Cache': 'Manage Cache',
|
||||
'Menu Model': 'Modelo de Menu',
|
||||
'My Sites': 'My Sites',
|
||||
'Name': 'Name',
|
||||
'New Record': 'Novo Registro',
|
||||
'new record inserted': 'novo registro inserido',
|
||||
'next 100 rows': 'próximas 100 linhas',
|
||||
'No databases in this application': 'Sem bancos de dados nesta aplicação',
|
||||
'Online examples': 'Alguns exemplos',
|
||||
'or import from csv file': 'ou importar de um arquivo csv',
|
||||
'Origin': 'Origin',
|
||||
'Other Plugins': 'Other Plugins',
|
||||
'Other Recipes': 'Other Recipes',
|
||||
'Overview': 'Overview',
|
||||
'Password': 'Password',
|
||||
'Plugins': 'Plugins',
|
||||
'Powered by': 'Powered by',
|
||||
'Preface': 'Preface',
|
||||
'previous 100 rows': '100 linhas anteriores',
|
||||
'Python': 'Python',
|
||||
'Query:': 'Consulta:',
|
||||
'Quick Examples': 'Quick Examples',
|
||||
'RAM': 'RAM',
|
||||
'RAM Cache Keys': 'RAM Cache Keys',
|
||||
'Ram Cleared': 'Ram Cleared',
|
||||
'Recipes': 'Recipes',
|
||||
'Record': 'registro',
|
||||
'record does not exist': 'registro não existe',
|
||||
'Record ID': 'Record ID',
|
||||
'Record id': 'id do registro',
|
||||
'Register': 'Registre-se',
|
||||
'register': 'Registre-se',
|
||||
'Registration key': 'Registration key',
|
||||
'Reset Password key': 'Reset Password key',
|
||||
'Resources': 'Resources',
|
||||
@@ -83,18 +132,25 @@
|
||||
'Rows selected': 'Linhas selecionadas',
|
||||
'Semantic': 'Semantic',
|
||||
'Services': 'Services',
|
||||
'Size of cache:': 'Size of cache:',
|
||||
'state': 'estado',
|
||||
'Statistics': 'Statistics',
|
||||
'Stylesheet': 'Stylesheet',
|
||||
'submit': 'submit',
|
||||
'Support': 'Support',
|
||||
'Sure you want to delete this object?': 'Está certo(a) que deseja apagar esse objeto ?',
|
||||
'Table': 'tabela',
|
||||
'Table name': 'Table name',
|
||||
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'Uma "consulta" é uma condição como "db.tabela1.campo1==\'valor\'". Expressões como "db.tabela1.campo1==db.tabela2.campo2" resultam em um JOIN SQL.',
|
||||
'The Core': 'The Core',
|
||||
'The Views': 'The Views',
|
||||
'The output of the file is a dictionary that was rendered by the view %s': 'The output of the file is a dictionary that was rendered by the view %s',
|
||||
'The Views': 'The Views',
|
||||
'This App': 'This App',
|
||||
'This is a copy of the scaffolding application': 'This is a copy of the scaffolding application',
|
||||
'Time in Cache (h:m:s)': 'Time in Cache (h:m:s)',
|
||||
'Timestamp': 'Timestamp',
|
||||
'Twitter': 'Twitter',
|
||||
'unable to parse csv file': 'não foi possível analisar arquivo csv',
|
||||
'Update:': 'Atualizar:',
|
||||
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Use (...)&(...) para AND, (...)|(...) para OR, e ~(...) para NOT para construir consultas mais complexas.',
|
||||
'User ID': 'User ID',
|
||||
@@ -105,38 +161,10 @@
|
||||
'Welcome': 'Welcome',
|
||||
'Welcome %s': 'Vem vindo %s',
|
||||
'Welcome to web2py': 'Bem vindo ao web2py',
|
||||
'Welcome to web2py!': 'Welcome to web2py!',
|
||||
'Which called the function %s located in the file %s': 'Which called the function %s located in the file %s',
|
||||
'You are successfully running web2py': 'You are successfully running web2py',
|
||||
'You are successfully running web2py.': 'You are successfully running web2py.',
|
||||
'You can modify this application and adapt it to your needs': 'You can modify this application and adapt it to your needs',
|
||||
'You visited the url %s': 'You visited the url %s',
|
||||
'appadmin is disabled because insecure channel': 'Administração desativada devido ao canal inseguro',
|
||||
'cache': 'cache',
|
||||
'change password': 'modificar senha',
|
||||
'customize me!': 'Personalize-me!',
|
||||
'data uploaded': 'dados enviados',
|
||||
'Database': 'banco de dados',
|
||||
'Database %s select': 'Selecionar banco de dados %s',
|
||||
'db': 'bd',
|
||||
'design': 'design',
|
||||
'done!': 'concluído!',
|
||||
'edit profile': 'editar perfil',
|
||||
'export as csv file': 'exportar como um arquivo csv',
|
||||
'insert new': 'inserir novo',
|
||||
'insert new %s': 'inserir novo %s',
|
||||
'invalid request': 'requisição inválida',
|
||||
'login': 'Entrar',
|
||||
'logout': 'Sair',
|
||||
'lost password?': 'lost password?',
|
||||
'new record inserted': 'novo registro inserido',
|
||||
'next 100 rows': 'próximas 100 linhas',
|
||||
'or import from csv file': 'ou importar de um arquivo csv',
|
||||
'previous 100 rows': '100 linhas anteriores',
|
||||
'Record': 'registro',
|
||||
'record does not exist': 'registro não existe',
|
||||
'Record id': 'id do registro',
|
||||
'register': 'Registre-se',
|
||||
'state': 'estado',
|
||||
'Table': 'tabela',
|
||||
'unable to parse csv file': 'não foi possível analisar arquivo csv',
|
||||
}
|
||||
|
||||
@@ -3,119 +3,182 @@
|
||||
'!langcode!': 'pt',
|
||||
'!langname!': 'Português',
|
||||
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"update" é uma expressão opcional como "field1=\'newvalue\'". Não pode actualizar ou eliminar os resultados de um JOIN',
|
||||
'%Y-%m-%d': '%Y-%m-%d',
|
||||
'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
|
||||
'%s %%{row} deleted': '%s linhas eliminadas',
|
||||
'%s %%{row} updated': '%s linhas actualizadas',
|
||||
'%s selected': '%s seleccionado(s)',
|
||||
'%Y-%m-%d': '%Y-%m-%d',
|
||||
'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
|
||||
'About': 'About',
|
||||
'Access Control': 'Access Control',
|
||||
'Administrative Interface': 'Administrative Interface',
|
||||
'Administrative interface': 'Painel administrativo',
|
||||
'Ajax Recipes': 'Ajax Recipes',
|
||||
'appadmin is disabled because insecure channel': 'appadmin está desactivada pois o canal é inseguro',
|
||||
'Are you sure you want to delete this object?': 'Are you sure you want to delete this object?',
|
||||
'Author Reference Auth User': 'Author Reference Auth User',
|
||||
'Author Reference Auth User.username': 'Author Reference Auth User.username',
|
||||
'Available Databases and Tables': 'bases de dados e tabelas disponíveis',
|
||||
'Buy this book': 'Buy this book',
|
||||
'cache': 'cache',
|
||||
'Cache': 'Cache',
|
||||
'Cache Keys': 'Cache Keys',
|
||||
'Cannot be empty': 'não pode ser vazio',
|
||||
'Category Create': 'Category Create',
|
||||
'Category Select': 'Category Select',
|
||||
'change password': 'alterar palavra-chave',
|
||||
'Check to delete': 'seleccione para eliminar',
|
||||
'Clear CACHE?': 'Clear CACHE?',
|
||||
'Clear DISK': 'Clear DISK',
|
||||
'Clear RAM': 'Clear RAM',
|
||||
'Comment Create': 'Comment Create',
|
||||
'Comment Select': 'Comment Select',
|
||||
'Community': 'Community',
|
||||
'Components and Plugins': 'Components and Plugins',
|
||||
'Content': 'Content',
|
||||
'Controller': 'Controlador',
|
||||
'Copyright': 'Direitos de cópia',
|
||||
'create new category': 'create new category',
|
||||
'create new comment': 'create new comment',
|
||||
'create new post': 'create new post',
|
||||
'Created By': 'Created By',
|
||||
'Created On': 'Created On',
|
||||
'Current request': 'pedido currente',
|
||||
'Current response': 'resposta currente',
|
||||
'Current session': 'sessão currente',
|
||||
'DB Model': 'Modelo de BD',
|
||||
'Database': 'Base de dados',
|
||||
'Delete:': 'Eliminar:',
|
||||
'Edit': 'Editar',
|
||||
'Edit This App': 'Edite esta aplicação',
|
||||
'Edit current record': 'Edição de registo currente',
|
||||
'Email': 'Email',
|
||||
'First Name': 'First Name',
|
||||
'For %s #%s': 'For %s #%s',
|
||||
'Hello World': 'Olá Mundo',
|
||||
'Import/Export': 'Importar/Exportar',
|
||||
'Index': 'Índice',
|
||||
'Internal State': 'Estado interno',
|
||||
'Invalid Query': 'Consulta Inválida',
|
||||
'Last Name': 'Last Name',
|
||||
'Layout': 'Esboço',
|
||||
'Main Menu': 'Menu Principal',
|
||||
'Menu Model': 'Menu do Modelo',
|
||||
'Modified By': 'Modified By',
|
||||
'Modified On': 'Modified On',
|
||||
'Name': 'Name',
|
||||
'New Record': 'Novo Registo',
|
||||
'No Data': 'No Data',
|
||||
'No databases in this application': 'Não há bases de dados nesta aplicação',
|
||||
'Online examples': 'Exemplos online',
|
||||
'Password': 'Password',
|
||||
'Post Create': 'Post Create',
|
||||
'Post Select': 'Post Select',
|
||||
'Powered by': 'Suportado por',
|
||||
'Query:': 'Interrogação:',
|
||||
'Replyto Reference Post': 'Replyto Reference Post',
|
||||
'Rows in Table': 'Linhas numa tabela',
|
||||
'Rows selected': 'Linhas seleccionadas',
|
||||
'Stylesheet': 'Folha de estilo',
|
||||
'Sure you want to delete this object?': 'Tem a certeza que deseja eliminar este objecto?',
|
||||
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'A "query" é uma condição do tipo "db.table1.field1==\'value\'". Algo como "db.table1.field1==db.table2.field2" resultaria num SQL JOIN.',
|
||||
'The output of the file is a dictionary that was rendered by the view %s': 'The output of the file is a dictionary that was rendered by the view %s',
|
||||
'Title': 'Title',
|
||||
'Update:': 'Actualização:',
|
||||
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Utilize (...)&(...) para AND, (...)|(...) para OR, e ~(...) para NOT para construir interrogações mais complexas.',
|
||||
'Username': 'Username',
|
||||
'View': 'Vista',
|
||||
'Welcome %s': 'Bem-vindo(a) %s',
|
||||
'Welcome to Gluonization': 'Bem vindo ao Web2py',
|
||||
'Welcome to web2py': 'Bem-vindo(a) ao web2py',
|
||||
'When': 'When',
|
||||
'Which called the function %s located in the file %s': 'Which called the function %s located in the file %s',
|
||||
'You visited the url %s': 'You visited the url %s',
|
||||
'appadmin is disabled because insecure channel': 'appadmin está desactivada pois o canal é inseguro',
|
||||
'cache': 'cache',
|
||||
'change password': 'alterar palavra-chave',
|
||||
'create new category': 'create new category',
|
||||
'create new comment': 'create new comment',
|
||||
'create new post': 'create new post',
|
||||
'customize me!': 'Personaliza-me!',
|
||||
'data uploaded': 'informação enviada',
|
||||
'Database': 'base de dados',
|
||||
'Database %s select': 'selecção de base de dados %s',
|
||||
'db': 'bd',
|
||||
'DB Model': 'Modelo de BD',
|
||||
'Delete:': 'Eliminar:',
|
||||
'Demo': 'Demo',
|
||||
'Deployment Recipes': 'Deployment Recipes',
|
||||
'design': 'design',
|
||||
'DISK': 'DISK',
|
||||
'Disk Cache Keys': 'Disk Cache Keys',
|
||||
'Disk Cleared': 'Disk Cleared',
|
||||
'Documentation': 'Documentation',
|
||||
"Don't know what to do?": "Don't know what to do?",
|
||||
'done!': 'concluído!',
|
||||
'Download': 'Download',
|
||||
'Edit': 'Editar',
|
||||
'edit category': 'edit category',
|
||||
'edit comment': 'edit comment',
|
||||
'Edit current record': 'Edição de registo currente',
|
||||
'edit post': 'edit post',
|
||||
'edit profile': 'Editar perfil',
|
||||
'Edit This App': 'Edite esta aplicação',
|
||||
'Email': 'Email',
|
||||
'Email and SMS': 'Email and SMS',
|
||||
'Errors': 'Errors',
|
||||
'export as csv file': 'exportar como ficheiro csv',
|
||||
'FAQ': 'FAQ',
|
||||
'First Name': 'First Name',
|
||||
'For %s #%s': 'For %s #%s',
|
||||
'Forms and Validators': 'Forms and Validators',
|
||||
'Free Applications': 'Free Applications',
|
||||
'Groups': 'Groups',
|
||||
'Hello World': 'Olá Mundo',
|
||||
'Home': 'Home',
|
||||
'How did you get here?': 'How did you get here?',
|
||||
'import': 'import',
|
||||
'Import/Export': 'Importar/Exportar',
|
||||
'Index': 'Índice',
|
||||
'insert new': 'inserir novo',
|
||||
'insert new %s': 'inserir novo %s',
|
||||
'Internal State': 'Estado interno',
|
||||
'Introduction': 'Introduction',
|
||||
'Invalid Query': 'Consulta Inválida',
|
||||
'invalid request': 'Pedido Inválido',
|
||||
'Key': 'Key',
|
||||
'Last Name': 'Last Name',
|
||||
'Layout': 'Esboço',
|
||||
'Layout Plugins': 'Layout Plugins',
|
||||
'Layouts': 'Layouts',
|
||||
'Live Chat': 'Live Chat',
|
||||
'login': 'login',
|
||||
'logout': 'logout',
|
||||
'Lost Password': 'Lost Password',
|
||||
'Main Menu': 'Menu Principal',
|
||||
'Manage Cache': 'Manage Cache',
|
||||
'Menu Model': 'Menu do Modelo',
|
||||
'Modified By': 'Modified By',
|
||||
'Modified On': 'Modified On',
|
||||
'My Sites': 'My Sites',
|
||||
'Name': 'Name',
|
||||
'New Record': 'Novo Registo',
|
||||
'new record inserted': 'novo registo inserido',
|
||||
'next 100 rows': 'próximas 100 linhas',
|
||||
'No Data': 'No Data',
|
||||
'No databases in this application': 'Não há bases de dados nesta aplicação',
|
||||
'Online examples': 'Exemplos online',
|
||||
'or import from csv file': 'ou importe a partir de ficheiro csv',
|
||||
'Other Plugins': 'Other Plugins',
|
||||
'Other Recipes': 'Other Recipes',
|
||||
'Overview': 'Overview',
|
||||
'Password': 'Password',
|
||||
'Plugins': 'Plugins',
|
||||
'Post Create': 'Post Create',
|
||||
'Post Select': 'Post Select',
|
||||
'Powered by': 'Suportado por',
|
||||
'Preface': 'Preface',
|
||||
'previous 100 rows': '100 linhas anteriores',
|
||||
'Python': 'Python',
|
||||
'Query:': 'Interrogação:',
|
||||
'Quick Examples': 'Quick Examples',
|
||||
'RAM': 'RAM',
|
||||
'RAM Cache Keys': 'RAM Cache Keys',
|
||||
'Ram Cleared': 'Ram Cleared',
|
||||
'Recipes': 'Recipes',
|
||||
'Record': 'registo',
|
||||
'record does not exist': 'registo inexistente',
|
||||
'Record id': 'id de registo',
|
||||
'Register': 'Register',
|
||||
'register': 'register',
|
||||
'Replyto Reference Post': 'Replyto Reference Post',
|
||||
'Rows in Table': 'Linhas numa tabela',
|
||||
'Rows selected': 'Linhas seleccionadas',
|
||||
'search category': 'search category',
|
||||
'search comment': 'search comment',
|
||||
'search post': 'search post',
|
||||
'select category': 'select category',
|
||||
'select comment': 'select comment',
|
||||
'select post': 'select post',
|
||||
'Semantic': 'Semantic',
|
||||
'Services': 'Services',
|
||||
'show category': 'show category',
|
||||
'show comment': 'show comment',
|
||||
'show post': 'show post',
|
||||
'Size of cache:': 'Size of cache:',
|
||||
'state': 'estado',
|
||||
'Statistics': 'Statistics',
|
||||
'Stylesheet': 'Folha de estilo',
|
||||
'submit': 'submit',
|
||||
'Support': 'Support',
|
||||
'Sure you want to delete this object?': 'Tem a certeza que deseja eliminar este objecto?',
|
||||
'Table': 'tabela',
|
||||
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'A "query" é uma condição do tipo "db.table1.field1==\'value\'". Algo como "db.table1.field1==db.table2.field2" resultaria num SQL JOIN.',
|
||||
'The Core': 'The Core',
|
||||
'The output of the file is a dictionary that was rendered by the view %s': 'The output of the file is a dictionary that was rendered by the view %s',
|
||||
'The Views': 'The Views',
|
||||
'This App': 'This App',
|
||||
'Time in Cache (h:m:s)': 'Time in Cache (h:m:s)',
|
||||
'Title': 'Title',
|
||||
'Twitter': 'Twitter',
|
||||
'unable to parse csv file': 'não foi possível carregar ficheiro csv',
|
||||
'Update:': 'Actualização:',
|
||||
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Utilize (...)&(...) para AND, (...)|(...) para OR, e ~(...) para NOT para construir interrogações mais complexas.',
|
||||
'Username': 'Username',
|
||||
'Videos': 'Videos',
|
||||
'View': 'Vista',
|
||||
'Welcome %s': 'Bem-vindo(a) %s',
|
||||
'Welcome to Gluonization': 'Bem vindo ao Web2py',
|
||||
'Welcome to web2py': 'Bem-vindo(a) ao web2py',
|
||||
'Welcome to web2py!': 'Welcome to web2py!',
|
||||
'When': 'When',
|
||||
'Which called the function %s located in the file %s': 'Which called the function %s located in the file %s',
|
||||
'You are successfully running web2py': 'You are successfully running web2py',
|
||||
'You can modify this application and adapt it to your needs': 'You can modify this application and adapt it to your needs',
|
||||
'You visited the url %s': 'You visited the url %s',
|
||||
}
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
'Available Databases and Tables': 'Baze de date și tabele disponibile',
|
||||
'Back': 'Înapoi',
|
||||
'Buy this book': 'Cumpără această carte',
|
||||
'Cache': 'Cache',
|
||||
'cache': 'cache',
|
||||
'Cache Keys': 'Chei cache',
|
||||
'cache, errors and sessions cleaned': 'cache, erori și sesiuni golite',
|
||||
@@ -70,6 +71,9 @@
|
||||
'Check to delete': 'Coșați pentru a șterge',
|
||||
'clean': 'golire',
|
||||
'Clear': 'Golește',
|
||||
'Clear CACHE?': 'Clear CACHE?',
|
||||
'Clear DISK': 'Clear DISK',
|
||||
'Clear RAM': 'Clear RAM',
|
||||
'click to check for upgrades': 'Clic pentru a verifica dacă există upgrade-uri',
|
||||
'Client IP': 'IP client',
|
||||
'Community': 'Comunitate',
|
||||
@@ -91,7 +95,6 @@
|
||||
'currently saved or': 'în prezent salvat sau',
|
||||
'customize me!': 'Personalizează-mă!',
|
||||
'data uploaded': 'date încărcate',
|
||||
'Database': 'Baza de date',
|
||||
'Database': 'bază de date',
|
||||
'Database %s select': 'selectare bază de date %s',
|
||||
'database administration': 'administrare bază de date',
|
||||
@@ -110,7 +113,9 @@
|
||||
'design': 'design',
|
||||
'DESIGN': 'DESIGN',
|
||||
'Design for': 'Design pentru',
|
||||
'DISK': 'DISK',
|
||||
'Disk Cache Keys': 'Chei cache de disc',
|
||||
'Disk Cleared': 'Disk Cleared',
|
||||
'Documentation': 'Documentație',
|
||||
"Don't know what to do?": 'Nu știți ce să faceți?',
|
||||
'done!': 'gata!',
|
||||
@@ -164,6 +169,7 @@
|
||||
'Home': 'Acasă',
|
||||
'How did you get here?': 'Cum ați ajuns aici?',
|
||||
'htmledit': 'editare html',
|
||||
'import': 'import',
|
||||
'Import/Export': 'Import/Export',
|
||||
'includes': 'include',
|
||||
'Index': 'Index',
|
||||
@@ -180,6 +186,7 @@
|
||||
'Invalid Query': 'Interogare invalidă',
|
||||
'invalid request': 'cerere invalidă',
|
||||
'invalid ticket': 'tichet invalid',
|
||||
'Key': 'Key',
|
||||
'language file "%(filename)s" created/updated': 'fișier de limbă "%(filename)s" creat/actualizat',
|
||||
'Language files (static strings) updated': 'Fișierele de limbă (șirurile statice de caractere) actualizate',
|
||||
'languages': 'limbi',
|
||||
@@ -203,6 +210,7 @@
|
||||
'Lost Password': 'Parolă pierdută',
|
||||
'Lost password?': 'Parolă pierdută?',
|
||||
'Main Menu': 'Meniu principal',
|
||||
'Manage Cache': 'Manage Cache',
|
||||
'Menu Model': 'Model meniu',
|
||||
'merge': 'unește',
|
||||
'Models': 'Modele',
|
||||
@@ -245,12 +253,14 @@
|
||||
'Query': 'Interogare',
|
||||
'Query:': 'Interogare:',
|
||||
'Quick Examples': 'Exemple rapide',
|
||||
'RAM': 'RAM',
|
||||
'RAM Cache Keys': 'Chei cache RAM',
|
||||
'Ram Cleared': 'Ram Cleared',
|
||||
'Recipes': 'Rețete',
|
||||
'Record': 'înregistrare',
|
||||
'record does not exist': 'înregistrare inexistentă',
|
||||
'Record id': 'id înregistrare',
|
||||
'Record ID': 'ID înregistrare',
|
||||
'Record id': 'id înregistrare',
|
||||
'register': 'înregistrare',
|
||||
'Register': 'Înregistrare',
|
||||
'Registration identifier': 'Identificator de autentificare',
|
||||
@@ -275,13 +285,16 @@
|
||||
'session expired': 'sesiune expirată',
|
||||
'shell': 'line de commandă',
|
||||
'site': 'site',
|
||||
'Size of cache:': 'Size of cache:',
|
||||
'some files could not be removed': 'anumite fișiere n-au putut fi șterse',
|
||||
'starts with': 'începe cu',
|
||||
'state': 'stare',
|
||||
'static': 'static',
|
||||
'Static files': 'Fișiere statice',
|
||||
'Statistics': 'Statistics',
|
||||
'Stylesheet': 'Foaie de stiluri',
|
||||
'Submit': 'Înregistrează',
|
||||
'submit': 'submit',
|
||||
'Support': 'Suport',
|
||||
'Sure you want to delete this object?': 'Sigur ștergeți acest obiect?',
|
||||
'Table': 'tabel',
|
||||
@@ -306,6 +319,7 @@
|
||||
'This is a copy of the scaffolding application': 'Aceasta este o copie a aplicației schelet',
|
||||
'This is the %(filename)s template': 'Aceasta este șablonul fișierului %(filename)s',
|
||||
'Ticket': 'Tichet',
|
||||
'Time in Cache (h:m:s)': 'Time in Cache (h:m:s)',
|
||||
'Timestamp': 'Moment în timp (timestamp)',
|
||||
'to previous version.': 'la versiunea anterioară.',
|
||||
'too short': 'prea scurt',
|
||||
|
||||
@@ -27,14 +27,20 @@
|
||||
'Administrative Interface': 'Administrative Interface',
|
||||
'Administrative interface': 'административный интерфейс',
|
||||
'Ajax Recipes': 'Ajax Recipes',
|
||||
'appadmin is disabled because insecure channel': 'appadmin is disabled because insecure channel',
|
||||
'Are you sure you want to delete this object?': 'Вы уверены, что хотите удалить этот объект?',
|
||||
'Available Databases and Tables': 'Базы данных и таблицы',
|
||||
'Buy this book': 'Buy this book',
|
||||
'cache': 'cache',
|
||||
'Cache': 'Cache',
|
||||
'Cache Keys': 'Cache Keys',
|
||||
'Cannot be empty': 'Пустое значение недопустимо',
|
||||
'Change Password': 'Смените пароль',
|
||||
'Check to delete': 'Удалить',
|
||||
'Check to delete:': 'Удалить:',
|
||||
'Clear CACHE?': 'Clear CACHE?',
|
||||
'Clear DISK': 'Clear DISK',
|
||||
'Clear RAM': 'Clear RAM',
|
||||
'Client IP': 'Client IP',
|
||||
'Community': 'Community',
|
||||
'Components and Plugins': 'Components and Plugins',
|
||||
@@ -45,7 +51,6 @@
|
||||
'Current session': 'Текущая сессия',
|
||||
'customize me!': 'настройте внешний вид!',
|
||||
'data uploaded': 'данные загружены',
|
||||
'Database': 'база данных',
|
||||
'Database': 'Database',
|
||||
'Database %s select': 'выбор базы данных %s',
|
||||
'db': 'БД',
|
||||
@@ -55,6 +60,9 @@
|
||||
'Deployment Recipes': 'Deployment Recipes',
|
||||
'Description': 'Описание',
|
||||
'design': 'дизайн',
|
||||
'DISK': 'DISK',
|
||||
'Disk Cache Keys': 'Disk Cache Keys',
|
||||
'Disk Cleared': 'Disk Cleared',
|
||||
'Documentation': 'Documentation',
|
||||
"Don't know what to do?": "Don't know what to do?",
|
||||
'done!': 'готово!',
|
||||
@@ -86,6 +94,7 @@
|
||||
'Invalid password': 'Неверный пароль',
|
||||
'Invalid Query': 'Неверный запрос',
|
||||
'invalid request': 'неверный запрос',
|
||||
'Key': 'Key',
|
||||
'Last name': 'Фамилия',
|
||||
'Layout': 'Layout',
|
||||
'Layout Plugins': 'Layout Plugins',
|
||||
@@ -99,6 +108,7 @@
|
||||
'Logout': 'Выход',
|
||||
'Lost Password': 'Забыли пароль?',
|
||||
'Lost password?': 'Lost password?',
|
||||
'Manage Cache': 'Manage Cache',
|
||||
'Menu Model': 'Menu Model',
|
||||
'My Sites': 'My Sites',
|
||||
'Name': 'Name',
|
||||
@@ -116,8 +126,8 @@
|
||||
'Other Plugins': 'Other Plugins',
|
||||
'Other Recipes': 'Other Recipes',
|
||||
'Overview': 'Overview',
|
||||
'password': 'пароль',
|
||||
'Password': 'Пароль',
|
||||
'password': 'пароль',
|
||||
"Password fields don't match": 'Пароли не совпадают',
|
||||
'Plugins': 'Plugins',
|
||||
'Powered by': 'Powered by',
|
||||
@@ -127,10 +137,14 @@
|
||||
'Python': 'Python',
|
||||
'Query:': 'Запрос:',
|
||||
'Quick Examples': 'Quick Examples',
|
||||
'RAM': 'RAM',
|
||||
'RAM Cache Keys': 'RAM Cache Keys',
|
||||
'Ram Cleared': 'Ram Cleared',
|
||||
'Recipes': 'Recipes',
|
||||
'Record': 'Record',
|
||||
'record does not exist': 'запись не найдена',
|
||||
'Record id': 'id записи',
|
||||
'Record ID': 'ID записи',
|
||||
'Record id': 'id записи',
|
||||
'Register': 'Зарегистрироваться',
|
||||
'Registration identifier': 'Registration identifier',
|
||||
'Registration key': 'Ключ регистрации',
|
||||
@@ -141,8 +155,11 @@
|
||||
'Rows selected': 'Выделено строк',
|
||||
'Semantic': 'Semantic',
|
||||
'Services': 'Services',
|
||||
'Size of cache:': 'Size of cache:',
|
||||
'state': 'состояние',
|
||||
'Statistics': 'Statistics',
|
||||
'Stylesheet': 'Stylesheet',
|
||||
'submit': 'submit',
|
||||
'Submit': 'Отправить',
|
||||
'Support': 'Support',
|
||||
'Sure you want to delete this object?': 'Подтвердите удаление объекта',
|
||||
@@ -153,6 +170,7 @@
|
||||
'The output of the file is a dictionary that was rendered by the view %s': 'The output of the file is a dictionary that was rendered by the view %s',
|
||||
'The Views': 'The Views',
|
||||
'This App': 'This App',
|
||||
'Time in Cache (h:m:s)': 'Time in Cache (h:m:s)',
|
||||
'Timestamp': 'Отметка времени',
|
||||
'Twitter': 'Twitter',
|
||||
'unable to parse csv file': 'нечитаемый csv-файл',
|
||||
|
||||
@@ -3,69 +3,154 @@
|
||||
'!langcode!': 'sk',
|
||||
'!langname!': 'Slovenský',
|
||||
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"update" je voliteľný výraz ako "field1=\'newvalue\'". Nemôžete upravovať alebo zmazať výsledky JOINu',
|
||||
'%Y-%m-%d': '%d.%m.%Y',
|
||||
'%Y-%m-%d %H:%M:%S': '%d.%m.%Y %H:%M:%S',
|
||||
'%s %%{row} deleted': '%s zmazaných záznamov',
|
||||
'%s %%{row} updated': '%s upravených záznamov',
|
||||
'%s selected': '%s označených',
|
||||
'%Y-%m-%d': '%d.%m.%Y',
|
||||
'%Y-%m-%d %H:%M:%S': '%d.%m.%Y %H:%M:%S',
|
||||
'About': 'About',
|
||||
'Access Control': 'Access Control',
|
||||
'Administrative Interface': 'Administrative Interface',
|
||||
'Administrative interface': 'pre administrátorské rozhranie kliknite sem',
|
||||
'Ajax Recipes': 'Ajax Recipes',
|
||||
'appadmin is disabled because insecure channel': 'appadmin je zakázaný bez zabezpečeného spojenia',
|
||||
'Are you sure you want to delete this object?': 'Are you sure you want to delete this object?',
|
||||
'Available Databases and Tables': 'Dostupné databázy a tabuľky',
|
||||
'Buy this book': 'Buy this book',
|
||||
'cache': 'cache',
|
||||
'Cache': 'Cache',
|
||||
'Cache Keys': 'Cache Keys',
|
||||
'Cannot be empty': 'Nemôže byť prázdne',
|
||||
'Check to delete': 'Označiť na zmazanie',
|
||||
'Clear CACHE?': 'Clear CACHE?',
|
||||
'Clear DISK': 'Clear DISK',
|
||||
'Clear RAM': 'Clear RAM',
|
||||
'Community': 'Community',
|
||||
'Components and Plugins': 'Components and Plugins',
|
||||
'Controller': 'Controller',
|
||||
'Copyright': 'Copyright',
|
||||
'Current request': 'Aktuálna požiadavka',
|
||||
'Current response': 'Aktuálna odpoveď',
|
||||
'Current session': 'Aktuálne sedenie',
|
||||
'customize me!': 'prispôsob ma!',
|
||||
'data uploaded': 'údaje naplnené',
|
||||
'Database': 'databáza',
|
||||
'Database %s select': 'databáza %s výber',
|
||||
'db': 'db',
|
||||
'DB Model': 'DB Model',
|
||||
'Database': 'Databáza',
|
||||
'Delete:': 'Zmazať:',
|
||||
'Demo': 'Demo',
|
||||
'Deployment Recipes': 'Deployment Recipes',
|
||||
'Description': 'Popis',
|
||||
'design': 'návrh',
|
||||
'DISK': 'DISK',
|
||||
'Disk Cache Keys': 'Disk Cache Keys',
|
||||
'Disk Cleared': 'Disk Cleared',
|
||||
'Documentation': 'Dokumentácia',
|
||||
"Don't know what to do?": "Don't know what to do?",
|
||||
'done!': 'hotovo!',
|
||||
'Download': 'Download',
|
||||
'Edit': 'Upraviť',
|
||||
'Edit Profile': 'Upraviť profil',
|
||||
'Edit current record': 'Upraviť aktuálny záznam',
|
||||
'Edit Profile': 'Upraviť profil',
|
||||
'Email and SMS': 'Email and SMS',
|
||||
'Errors': 'Errors',
|
||||
'export as csv file': 'exportovať do csv súboru',
|
||||
'FAQ': 'FAQ',
|
||||
'First name': 'Krstné meno',
|
||||
'Forms and Validators': 'Forms and Validators',
|
||||
'Free Applications': 'Free Applications',
|
||||
'Group ID': 'ID skupiny',
|
||||
'Groups': 'Groups',
|
||||
'Hello World': 'Ahoj svet',
|
||||
'Home': 'Home',
|
||||
'How did you get here?': 'How did you get here?',
|
||||
'import': 'import',
|
||||
'Import/Export': 'Import/Export',
|
||||
'Index': 'Index',
|
||||
'insert new': 'vložiť nový záznam ',
|
||||
'insert new %s': 'vložiť nový záznam %s',
|
||||
'Internal State': 'Vnútorný stav',
|
||||
'Invalid Query': 'Neplatná otázka',
|
||||
'Introduction': 'Introduction',
|
||||
'Invalid email': 'Neplatný email',
|
||||
'Invalid password': 'Nesprávne heslo',
|
||||
'Invalid Query': 'Neplatná otázka',
|
||||
'invalid request': 'Neplatná požiadavka',
|
||||
'Key': 'Key',
|
||||
'Last name': 'Priezvisko',
|
||||
'Layout': 'Layout',
|
||||
'Layout Plugins': 'Layout Plugins',
|
||||
'Layouts': 'Layouts',
|
||||
'Live Chat': 'Live Chat',
|
||||
'Logged in': 'Prihlásený',
|
||||
'Logged out': 'Odhlásený',
|
||||
'login': 'prihlásiť',
|
||||
'logout': 'odhlásiť',
|
||||
'Lost Password': 'Stratené heslo?',
|
||||
'lost password?': 'stratené heslo?',
|
||||
'Manage Cache': 'Manage Cache',
|
||||
'Menu Model': 'Menu Model',
|
||||
'My Sites': 'My Sites',
|
||||
'Name': 'Meno',
|
||||
'New Record': 'Nový záznam',
|
||||
'New password': 'Nové heslo',
|
||||
'New Record': 'Nový záznam',
|
||||
'new record inserted': 'nový záznam bol vložený',
|
||||
'next 100 rows': 'ďalších 100 riadkov',
|
||||
'No databases in this application': 'V tejto aplikácii nie sú databázy',
|
||||
'Old password': 'Staré heslo',
|
||||
'Online examples': 'pre online príklady kliknite sem',
|
||||
'or import from csv file': 'alebo naimportovať z csv súboru',
|
||||
'Origin': 'Pôvod',
|
||||
'Other Plugins': 'Other Plugins',
|
||||
'Other Recipes': 'Other Recipes',
|
||||
'Overview': 'Overview',
|
||||
'password': 'heslo',
|
||||
'Password': 'Heslo',
|
||||
'Plugins': 'Plugins',
|
||||
'Powered by': 'Powered by',
|
||||
'Preface': 'Preface',
|
||||
'previous 100 rows': 'predchádzajúcich 100 riadkov',
|
||||
'Python': 'Python',
|
||||
'Query:': 'Otázka:',
|
||||
'Quick Examples': 'Quick Examples',
|
||||
'RAM': 'RAM',
|
||||
'RAM Cache Keys': 'RAM Cache Keys',
|
||||
'Ram Cleared': 'Ram Cleared',
|
||||
'Recipes': 'Recipes',
|
||||
'Record': 'záznam',
|
||||
'record does not exist': 'záznam neexistuje',
|
||||
'Record ID': 'ID záznamu',
|
||||
'Record id': 'id záznamu',
|
||||
'Register': 'Zaregistrovať sa',
|
||||
'register': 'registrovať',
|
||||
'Registration key': 'Registračný kľúč',
|
||||
'Remember me (for 30 days)': 'Zapamätaj si ma (na 30 dní)',
|
||||
'Reset Password key': 'Nastaviť registračný kľúč',
|
||||
'Role': 'Rola',
|
||||
'Rows in Table': 'riadkov v tabuľke',
|
||||
'Rows selected': 'označených riadkov',
|
||||
'Semantic': 'Semantic',
|
||||
'Services': 'Services',
|
||||
'Size of cache:': 'Size of cache:',
|
||||
'state': 'stav',
|
||||
'Statistics': 'Statistics',
|
||||
'Stylesheet': 'Stylesheet',
|
||||
'submit': 'submit',
|
||||
'Submit': 'Odoslať',
|
||||
'Support': 'Support',
|
||||
'Sure you want to delete this object?': 'Ste si istí, že chcete zmazať tento objekt?',
|
||||
'Table': 'tabuľka',
|
||||
'Table name': 'Názov tabuľky',
|
||||
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': '"query" je podmienka ako "db.table1.field1==\'value\'". Niečo ako "db.table1.field1==db.table2.field2" má za výsledok SQL JOIN.',
|
||||
'The Core': 'The Core',
|
||||
'The output of the file is a dictionary that was rendered by the view %s': 'Výstup zo súboru je slovník, ktorý bol zobrazený vo view %s',
|
||||
'The Views': 'The Views',
|
||||
'This App': 'This App',
|
||||
'This is a copy of the scaffolding application': 'Toto je kópia skeletu aplikácie',
|
||||
'Time in Cache (h:m:s)': 'Time in Cache (h:m:s)',
|
||||
'Timestamp': 'Časová pečiatka',
|
||||
'Twitter': 'Twitter',
|
||||
'unable to parse csv file': 'nedá sa načítať csv súbor',
|
||||
'Update:': 'Upraviť:',
|
||||
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Použite (...)&(...) pre AND, (...)|(...) pre OR a ~(...) pre NOT na poskladanie komplexnejších otázok.',
|
||||
'User %(id)s Logged-in': 'Používateľ %(id)s prihlásený',
|
||||
@@ -75,38 +160,12 @@
|
||||
'User %(id)s Registered': 'Používateľ %(id)s sa zaregistroval',
|
||||
'User ID': 'ID používateľa',
|
||||
'Verify Password': 'Zopakujte heslo',
|
||||
'Videos': 'Videos',
|
||||
'View': 'Zobraziť',
|
||||
'Welcome to web2py': 'Vitajte vo web2py',
|
||||
'Welcome to web2py!': 'Welcome to web2py!',
|
||||
'Which called the function %s located in the file %s': 'Ktorý zavolal funkciu %s nachádzajúci sa v súbore %s',
|
||||
'You are successfully running web2py': 'Úspešne ste spustili web2py',
|
||||
'You can modify this application and adapt it to your needs': 'Môžete upraviť túto aplikáciu a prispôsobiť ju svojim potrebám',
|
||||
'You visited the url %s': 'Navštívili ste URL %s',
|
||||
'appadmin is disabled because insecure channel': 'appadmin je zakázaný bez zabezpečeného spojenia',
|
||||
'cache': 'cache',
|
||||
'customize me!': 'prispôsob ma!',
|
||||
'data uploaded': 'údaje naplnené',
|
||||
'Database': 'databáza',
|
||||
'Database %s select': 'databáza %s výber',
|
||||
'db': 'db',
|
||||
'design': 'návrh',
|
||||
'done!': 'hotovo!',
|
||||
'export as csv file': 'exportovať do csv súboru',
|
||||
'insert new': 'vložiť nový záznam ',
|
||||
'insert new %s': 'vložiť nový záznam %s',
|
||||
'invalid request': 'Neplatná požiadavka',
|
||||
'login': 'prihlásiť',
|
||||
'logout': 'odhlásiť',
|
||||
'lost password?': 'stratené heslo?',
|
||||
'new record inserted': 'nový záznam bol vložený',
|
||||
'next 100 rows': 'ďalších 100 riadkov',
|
||||
'or import from csv file': 'alebo naimportovať z csv súboru',
|
||||
'password': 'heslo',
|
||||
'previous 100 rows': 'predchádzajúcich 100 riadkov',
|
||||
'Record': 'záznam',
|
||||
'record does not exist': 'záznam neexistuje',
|
||||
'Record id': 'id záznamu',
|
||||
'register': 'registrovať',
|
||||
'state': 'stav',
|
||||
'Table': 'tabuľka',
|
||||
'unable to parse csv file': 'nedá sa načítať csv súbor',
|
||||
}
|
||||
|
||||
@@ -53,12 +53,13 @@
|
||||
'Components and Plugins': 'Компоненти та втулки',
|
||||
'Controller': 'Контролер',
|
||||
'Copyright': 'Правовласник',
|
||||
'Created By': 'Створив(ла)',
|
||||
'Created On': 'Створено в',
|
||||
'Current request': 'Поточний запит (current request)',
|
||||
'Current response': 'Поточна відповідь (current response)',
|
||||
'Current session': 'Поточна сесія (current session)',
|
||||
'customize me!': 'причепуріть мене!',
|
||||
'data uploaded': 'дані завантажено',
|
||||
'Database': 'база даних',
|
||||
'Database': 'База даних',
|
||||
'Database %s select': 'Вибірка з бази даних %s',
|
||||
'db': 'база даних',
|
||||
@@ -108,6 +109,7 @@
|
||||
'Invalid password': 'Невірний пароль',
|
||||
'Invalid Query': 'Помилковий запит',
|
||||
'invalid request': 'хибний запит',
|
||||
'Is Active': 'Активна',
|
||||
'Key': 'Ключ',
|
||||
'Last name': 'Прізвище',
|
||||
'Layout': 'Макет (Layout)',
|
||||
@@ -122,6 +124,8 @@
|
||||
'Lost password?': 'Забули пароль?',
|
||||
'Manage Cache': 'Управління кешем',
|
||||
'Menu Model': 'Модель меню',
|
||||
'Modified By': 'Зміни провадив(ла)',
|
||||
'Modified On': 'Змінено в',
|
||||
'My Sites': 'Сайт (усі додатки)',
|
||||
'Name': "Ім'я",
|
||||
'New password': 'Новий пароль',
|
||||
@@ -160,8 +164,8 @@
|
||||
'Record': 'запис',
|
||||
'Record %(id)s updated': 'Запис %(id)s змінено',
|
||||
'record does not exist': 'запису не існує',
|
||||
'Record id': 'ід. запису',
|
||||
'Record ID': 'Ід.запису',
|
||||
'Record id': 'ід. запису',
|
||||
'Record Updated': 'Запис змінено',
|
||||
'Register': 'Реєстрація',
|
||||
'Registration identifier': 'Реєстраційний ідентифікатор',
|
||||
@@ -180,7 +184,7 @@
|
||||
'state': 'стан',
|
||||
'Statistics': 'Статистика',
|
||||
'Stylesheet': 'CSS-стилі',
|
||||
'submit': 'submit',
|
||||
'submit': 'застосувати',
|
||||
'Submit': 'Застосувати',
|
||||
'Support': 'Підтримка',
|
||||
'Table': 'Таблиця',
|
||||
|
||||
@@ -3,34 +3,50 @@
|
||||
'!langcode!': 'zh-cn',
|
||||
'!langname!': '中文',
|
||||
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"更新" 是選擇性的條件式, 格式就像 "欄位1=\'值\'". 但是 JOIN 的資料不可以使用 update 或是 delete"',
|
||||
'%Y-%m-%d': '%Y-%m-%d',
|
||||
'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
|
||||
'%s %%{row} deleted': '已刪除 %s 筆',
|
||||
'%s %%{row} updated': '已更新 %s 筆',
|
||||
'%s selected': '%s 已選擇',
|
||||
'%Y-%m-%d': '%Y-%m-%d',
|
||||
'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
|
||||
'(something like "it-it")': '(格式類似 "zh-tw")',
|
||||
'A new version of web2py is available': '新版的 web2py 已發行',
|
||||
'A new version of web2py is available: %s': '新版的 web2py 已發行: %s',
|
||||
'about': '關於',
|
||||
'About': '關於',
|
||||
'About application': '關於本應用程式',
|
||||
'Access Control': 'Access Control',
|
||||
'Admin is disabled because insecure channel': '管理功能(Admin)在不安全連線環境下自動關閉',
|
||||
'Admin is disabled because unsecure channel': '管理功能(Admin)在不安全連線環境下自動關閉',
|
||||
'Administrative Interface': 'Administrative Interface',
|
||||
'Administrative interface': '點此處進入管理介面',
|
||||
'Administrator Password:': '管理員密碼:',
|
||||
'Ajax Recipes': 'Ajax Recipes',
|
||||
'appadmin is disabled because insecure channel': '因為來自非安全通道,管理介面關閉',
|
||||
'Are you sure you want to delete file "%s"?': '確定要刪除檔案"%s"?',
|
||||
'Are you sure you want to delete this object?': 'Are you sure you want to delete this object?',
|
||||
'Are you sure you want to uninstall application "%s"': '確定要移除應用程式 "%s"',
|
||||
'Are you sure you want to uninstall application "%s"?': '確定要移除應用程式 "%s"',
|
||||
'ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.': '注意: 登入管理帳號需要安全連線(HTTPS)或是在本機連線(localhost).',
|
||||
'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.': '注意: 因為在測試模式不保證多執行緒安全性,也就是說不可以同時執行多個測試案例',
|
||||
'ATTENTION: you cannot edit the running application!': '注意:不可編輯正在執行的應用程式!',
|
||||
'About': '關於',
|
||||
'About application': '關於本應用程式',
|
||||
'Admin is disabled because insecure channel': '管理功能(Admin)在不安全連線環境下自動關閉',
|
||||
'Admin is disabled because unsecure channel': '管理功能(Admin)在不安全連線環境下自動關閉',
|
||||
'Administrative interface': '點此處進入管理介面',
|
||||
'Administrator Password:': '管理員密碼:',
|
||||
'Are you sure you want to delete file "%s"?': '確定要刪除檔案"%s"?',
|
||||
'Are you sure you want to uninstall application "%s"': '確定要移除應用程式 "%s"',
|
||||
'Are you sure you want to uninstall application "%s"?': '確定要移除應用程式 "%s"',
|
||||
'Authentication': '驗證',
|
||||
'Available Databases and Tables': '可提供的資料庫和資料表',
|
||||
'Buy this book': 'Buy this book',
|
||||
'cache': '快取記憶體',
|
||||
'Cache': 'Cache',
|
||||
'Cache Keys': 'Cache Keys',
|
||||
'Cannot be empty': '不可空白',
|
||||
'Cannot compile: there are errors in your app. Debug it, correct errors and try again.': '無法編譯:應用程式中含有錯誤,請除錯後再試一次.',
|
||||
'Change Password': '變更密碼',
|
||||
'change password': '變更密碼',
|
||||
'Check to delete': '打勾代表刪除',
|
||||
'Check to delete:': '點選以示刪除:',
|
||||
'Clear CACHE?': 'Clear CACHE?',
|
||||
'Clear DISK': 'Clear DISK',
|
||||
'Clear RAM': 'Clear RAM',
|
||||
'Client IP': '客戶端網址(IP)',
|
||||
'Community': 'Community',
|
||||
'Components and Plugins': 'Components and Plugins',
|
||||
'Controller': '控件',
|
||||
'Controllers': '控件',
|
||||
'Copyright': '版權所有',
|
||||
@@ -38,64 +54,120 @@
|
||||
'Current request': '目前網路資料要求(request)',
|
||||
'Current response': '目前網路資料回應(response)',
|
||||
'Current session': '目前網路連線資訊(session)',
|
||||
'DB Model': '資料庫模組',
|
||||
'DESIGN': '設計',
|
||||
'customize me!': '請調整我!',
|
||||
'data uploaded': '資料已上傳',
|
||||
'Database': '資料庫',
|
||||
'Database %s select': '已選擇 %s 資料庫',
|
||||
'Date and Time': '日期和時間',
|
||||
'db': 'db',
|
||||
'DB Model': '資料庫模組',
|
||||
'Delete': '刪除',
|
||||
'Delete:': '刪除:',
|
||||
'Demo': 'Demo',
|
||||
'Deploy on Google App Engine': '配置到 Google App Engine',
|
||||
'Deployment Recipes': 'Deployment Recipes',
|
||||
'Description': '描述',
|
||||
'DESIGN': '設計',
|
||||
'design': '設計',
|
||||
'Design for': '設計為了',
|
||||
'DISK': 'DISK',
|
||||
'Disk Cache Keys': 'Disk Cache Keys',
|
||||
'Disk Cleared': 'Disk Cleared',
|
||||
'Documentation': 'Documentation',
|
||||
"Don't know what to do?": "Don't know what to do?",
|
||||
'done!': '完成!',
|
||||
'Download': 'Download',
|
||||
'E-mail': '電子郵件',
|
||||
'EDIT': '編輯',
|
||||
'Edit': '編輯',
|
||||
'Edit Profile': '編輯設定檔',
|
||||
'Edit This App': '編輯本應用程式',
|
||||
'Edit application': '編輯應用程式',
|
||||
'Edit current record': '編輯當前紀錄',
|
||||
'edit profile': '編輯設定檔',
|
||||
'Edit Profile': '編輯設定檔',
|
||||
'Edit This App': '編輯本應用程式',
|
||||
'Editing file': '編輯檔案',
|
||||
'Editing file "%s"': '編輯檔案"%s"',
|
||||
'Email and SMS': 'Email and SMS',
|
||||
'Error logs for "%(app)s"': '"%(app)s"的錯誤紀錄',
|
||||
'Errors': 'Errors',
|
||||
'export as csv file': '以逗號分隔檔(csv)格式匯出',
|
||||
'FAQ': 'FAQ',
|
||||
'First name': '名',
|
||||
'Forms and Validators': 'Forms and Validators',
|
||||
'Free Applications': 'Free Applications',
|
||||
'Functions with no doctests will result in [passed] tests.': '沒有 doctests 的函式會顯示 [passed].',
|
||||
'Group ID': '群組編號',
|
||||
'Groups': 'Groups',
|
||||
'Hello World': '嗨! 世界',
|
||||
'Home': 'Home',
|
||||
'How did you get here?': 'How did you get here?',
|
||||
'import': 'import',
|
||||
'Import/Export': '匯入/匯出',
|
||||
'Index': '索引',
|
||||
'insert new': '插入新資料',
|
||||
'insert new %s': '插入新資料 %s',
|
||||
'Installed applications': '已安裝應用程式',
|
||||
'Internal State': '內部狀態',
|
||||
'Invalid Query': '不合法的查詢',
|
||||
'Introduction': 'Introduction',
|
||||
'Invalid action': '不合法的動作(action)',
|
||||
'Invalid email': '不合法的電子郵件',
|
||||
'Invalid Query': '不合法的查詢',
|
||||
'invalid request': '不合法的網路要求(request)',
|
||||
'Key': 'Key',
|
||||
'Language files (static strings) updated': '語言檔已更新',
|
||||
'Languages': '各國語言',
|
||||
'Last name': '姓',
|
||||
'Last saved on:': '最後儲存時間:',
|
||||
'Layout': '網頁配置',
|
||||
'Layout Plugins': 'Layout Plugins',
|
||||
'Layouts': 'Layouts',
|
||||
'License for': '軟體版權為',
|
||||
'Live Chat': 'Live Chat',
|
||||
'login': '登入',
|
||||
'Login': '登入',
|
||||
'Login to the Administrative Interface': '登入到管理員介面',
|
||||
'logout': '登出',
|
||||
'Logout': '登出',
|
||||
'Lost Password': '密碼遺忘',
|
||||
'Main Menu': '主選單',
|
||||
'Manage Cache': 'Manage Cache',
|
||||
'Menu Model': '選單模組(menu)',
|
||||
'Models': '資料模組',
|
||||
'Modules': '程式模組',
|
||||
'NO': '否',
|
||||
'My Sites': 'My Sites',
|
||||
'Name': '名字',
|
||||
'New Record': '新紀錄',
|
||||
'new record inserted': '已插入新紀錄',
|
||||
'next 100 rows': '往後 100 筆',
|
||||
'NO': '否',
|
||||
'No databases in this application': '這應用程式不含資料庫',
|
||||
'Online examples': '點此處進入線上範例',
|
||||
'or import from csv file': '或是從逗號分隔檔(CSV)匯入',
|
||||
'Origin': '原文',
|
||||
'Original/Translation': '原文/翻譯',
|
||||
'Other Plugins': 'Other Plugins',
|
||||
'Other Recipes': 'Other Recipes',
|
||||
'Overview': 'Overview',
|
||||
'Password': '密碼',
|
||||
"Password fields don't match": '密碼欄不匹配',
|
||||
'Peeking at file': '選擇檔案',
|
||||
'Plugins': 'Plugins',
|
||||
'Powered by': '基於以下技術構建:',
|
||||
'Preface': 'Preface',
|
||||
'previous 100 rows': '往前 100 筆',
|
||||
'Python': 'Python',
|
||||
'Query:': '查詢:',
|
||||
'Quick Examples': 'Quick Examples',
|
||||
'RAM': 'RAM',
|
||||
'RAM Cache Keys': 'RAM Cache Keys',
|
||||
'Ram Cleared': 'Ram Cleared',
|
||||
'Recipes': 'Recipes',
|
||||
'Record': '紀錄',
|
||||
'record does not exist': '紀錄不存在',
|
||||
'Record ID': '紀錄編號',
|
||||
'Record id': '紀錄編號',
|
||||
'Register': '註冊',
|
||||
'register': '註冊',
|
||||
'Registration key': '註冊金鑰',
|
||||
'Remember me (for 30 days)': '記住我(30 天)',
|
||||
'Reset Password key': '重設密碼',
|
||||
@@ -104,26 +176,40 @@
|
||||
'Rows in Table': '在資料表裏的資料',
|
||||
'Rows selected': '筆資料被選擇',
|
||||
'Saved file hash:': '檔案雜湊值已紀錄:',
|
||||
'Semantic': 'Semantic',
|
||||
'Services': 'Services',
|
||||
'Size of cache:': 'Size of cache:',
|
||||
'state': '狀態',
|
||||
'Static files': '靜態檔案',
|
||||
'Statistics': 'Statistics',
|
||||
'Stylesheet': '網頁風格檔',
|
||||
'submit': 'submit',
|
||||
'Submit': '傳送',
|
||||
'Support': 'Support',
|
||||
'Sure you want to delete this object?': '確定要刪除此物件?',
|
||||
'Table': '資料表',
|
||||
'Table name': '資料表名稱',
|
||||
'Testing application': '測試中的應用程式',
|
||||
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': '"查詢"是一個像 "db.表1.欄位1==\'值\'" 的條件式. 以"db.表1.欄位1==db.表2.欄位2"方式則相當於執行 JOIN SQL.',
|
||||
'The Core': 'The Core',
|
||||
'The output of the file is a dictionary that was rendered by the view %s': 'The output of the file is a dictionary that was rendered by the view %s',
|
||||
'The Views': 'The Views',
|
||||
'There are no controllers': '沒有控件(controllers)',
|
||||
'There are no models': '沒有資料庫模組(models)',
|
||||
'There are no modules': '沒有程式模組(modules)',
|
||||
'There are no static files': '沒有靜態檔案',
|
||||
'There are no translators, only default language is supported': '沒有翻譯檔,只支援原始語言',
|
||||
'There are no views': '沒有視圖',
|
||||
'This App': 'This App',
|
||||
'This is the %(filename)s template': '這是%(filename)s檔案的樣板(template)',
|
||||
'Ticket': '問題單',
|
||||
'Time in Cache (h:m:s)': 'Time in Cache (h:m:s)',
|
||||
'Timestamp': '時間標記',
|
||||
'Twitter': 'Twitter',
|
||||
'Unable to check for upgrades': '無法做升級檢查',
|
||||
'Unable to download': '無法下載',
|
||||
'Unable to download app': '無法下載應用程式',
|
||||
'unable to parse csv file': '無法解析逗號分隔檔(csv)',
|
||||
'Update:': '更新:',
|
||||
'Upload existing application': '更新存在的應用程式',
|
||||
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': '使用下列方式來組合更複雜的條件式, (...)&(...) 代表同時存在的條件, (...)|(...) 代表擇一的條件, ~(...)則代表反向條件.',
|
||||
@@ -131,40 +217,15 @@
|
||||
'User %(id)s Registered': '使用者 %(id)s 已註冊',
|
||||
'User ID': '使用者編號',
|
||||
'Verify Password': '驗證密碼',
|
||||
'Videos': 'Videos',
|
||||
'View': '視圖',
|
||||
'Views': '視圖',
|
||||
'Welcome %s': '歡迎 %s',
|
||||
'Welcome to web2py': '歡迎使用 web2py',
|
||||
'Welcome to web2py!': 'Welcome to web2py!',
|
||||
'Which called the function %s located in the file %s': 'Which called the function %s located in the file %s',
|
||||
'YES': '是',
|
||||
'You are successfully running web2py': 'You are successfully running web2py',
|
||||
'You can modify this application and adapt it to your needs': 'You can modify this application and adapt it to your needs',
|
||||
'You visited the url %s': 'You visited the url %s',
|
||||
'about': '關於',
|
||||
'appadmin is disabled because insecure channel': '因為來自非安全通道,管理介面關閉',
|
||||
'cache': '快取記憶體',
|
||||
'change password': '變更密碼',
|
||||
'customize me!': '請調整我!',
|
||||
'data uploaded': '資料已上傳',
|
||||
'Database': '資料庫',
|
||||
'Database %s select': '已選擇 %s 資料庫',
|
||||
'db': 'db',
|
||||
'design': '設計',
|
||||
'done!': '完成!',
|
||||
'edit profile': '編輯設定檔',
|
||||
'export as csv file': '以逗號分隔檔(csv)格式匯出',
|
||||
'insert new': '插入新資料',
|
||||
'insert new %s': '插入新資料 %s',
|
||||
'invalid request': '不合法的網路要求(request)',
|
||||
'login': '登入',
|
||||
'logout': '登出',
|
||||
'new record inserted': '已插入新紀錄',
|
||||
'next 100 rows': '往後 100 筆',
|
||||
'or import from csv file': '或是從逗號分隔檔(CSV)匯入',
|
||||
'previous 100 rows': '往前 100 筆',
|
||||
'Record': '紀錄',
|
||||
'record does not exist': '紀錄不存在',
|
||||
'Record id': '紀錄編號',
|
||||
'register': '註冊',
|
||||
'state': '狀態',
|
||||
'Table': '資料表',
|
||||
'unable to parse csv file': '無法解析逗號分隔檔(csv)',
|
||||
}
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
sha512:e5b75f2b-4ce9-41c0-a93b-b03f0135cd2c
|
||||
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
@@ -10,7 +10,7 @@ h3 {font-size:2.00em}
|
||||
h4 {font-size:1.50em}
|
||||
h5 {font-size:1.25em}
|
||||
h6 {font-size:1.12em}
|
||||
th,label {font-weight:bold; white-space:nowrap}
|
||||
th,label {font-weight:bold; white-space:nowrap;}
|
||||
td,th {text-align:left; padding:2px 5px 2px 5px}
|
||||
th {vertical-align:middle; border-right:1px solid white}
|
||||
td {vertical-align:top}
|
||||
@@ -69,7 +69,6 @@ fieldset {padding:16px; border-top:1px #DEDEDE solid}
|
||||
fieldset legend {text-transform:uppercase; font-weight:bold; padding:4px 16px 4px 16px; background:#f1f1f1}
|
||||
|
||||
/* fix ie problem with menu */
|
||||
.ie-lte7 .topbar .container {z-index:2}
|
||||
|
||||
td.w2p_fw {padding-bottom:1px}
|
||||
td.w2p_fl,td.w2p_fw,td.w2p_fc {vertical-align:top}
|
||||
@@ -95,25 +94,42 @@ div.flash {
|
||||
top:48px;
|
||||
right:50px;
|
||||
min-width:280px;
|
||||
opacity:0.85;
|
||||
opacity:0.95;
|
||||
margin:0px 0px 10px 10px;
|
||||
color:#fff;
|
||||
vertical-align:middle;
|
||||
cursor:pointer;
|
||||
background:#000;
|
||||
color:#fff;
|
||||
background-color:#000;
|
||||
border:2px solid #fff;
|
||||
border-radius:5px;
|
||||
-moz-border-radius:5px;
|
||||
-webkit-border-radius:5px;
|
||||
border-radius:8px;
|
||||
-o-border-radius: 8px;
|
||||
-moz-border-radius:8px;
|
||||
-webkit-border-radius:8px;
|
||||
background-image: -webkit-linear-gradient(top,#222,#000);
|
||||
background-image: -o-linear-gradient(top,#222,#000);
|
||||
background-image: -moz-linear-gradient(90deg, #222, #000);
|
||||
background-image: linear-gradient(top,#222,#000);
|
||||
background-repeat: repeat-x;
|
||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
z-index:2000;
|
||||
}
|
||||
|
||||
div.flash:hover { opacity:0.25; }
|
||||
|
||||
div.error_wrapper {display:block}
|
||||
div.error {
|
||||
background-color:red;
|
||||
width: 298px;
|
||||
background:red;
|
||||
border: 2px solid #d00;
|
||||
color:white;
|
||||
padding:3px;
|
||||
display:inline-block;
|
||||
padding:5px;
|
||||
display:inline-block;
|
||||
background-image: -webkit-linear-gradient(left,#f00,#fdd);
|
||||
background-image: -o-linear-gradient(left,#f00,#fdd);
|
||||
background-image: -moz-linear-gradient(0deg, #f00, #fdd);
|
||||
background-image: linear-gradient(left,#f00,#fdd);
|
||||
background-repeat: repeat-y;
|
||||
}
|
||||
|
||||
.topbar {
|
||||
@@ -159,19 +175,6 @@ div.error {
|
||||
|
||||
/* #MEDIA QUERIES SECTION */
|
||||
|
||||
/* All Mobile Sizes (devices and browser) */
|
||||
@media only screen and (max-width:767px) {
|
||||
/* removed because of bootswatch
|
||||
.topbar {text-align:center}
|
||||
#navbar,#menu {float:none}
|
||||
#navbar {font-size:1.2em; padding:.6em 0 1.2em}
|
||||
#menu {padding:0 0 1.5em}
|
||||
#menu select {font-size:1.2em; margin:0; padding:0}
|
||||
|
||||
div.flash {top:110px; right:10px}
|
||||
*/
|
||||
}
|
||||
|
||||
/*
|
||||
*Grid
|
||||
*
|
||||
@@ -183,10 +186,7 @@ div.error {
|
||||
.web2py_paginator {}
|
||||
.web2py_grid {width:100%}
|
||||
.web2py_grid table {width:100%}
|
||||
.web2py_grid tbody td {
|
||||
padding:2px 5px 2px 5px;
|
||||
vertical-align:middle;
|
||||
}
|
||||
.web2py_grid tbody td {padding:2px 5px 2px 5px; vertical-align: middle;}
|
||||
|
||||
.web2py_grid thead th,.web2py_grid tfoot td {
|
||||
background-color:#EAEAEA;
|
||||
@@ -223,7 +223,7 @@ div.error {
|
||||
margin:0;
|
||||
}
|
||||
|
||||
.web2py_search_actions{
|
||||
.web2py_search_actions {
|
||||
float:left;
|
||||
text-align:left;
|
||||
}
|
||||
@@ -247,13 +247,13 @@ div.error {
|
||||
.web2py_console input[type=button],
|
||||
.web2py_console button {
|
||||
line-height:20px;
|
||||
margin-right:5px; display:inline-block;
|
||||
margin-right:2px; display:inline-block;
|
||||
padding:3px 5px 3px 5px;
|
||||
}
|
||||
|
||||
.web2py_counter {
|
||||
margin-top:5px;
|
||||
margin-right:5px;
|
||||
margin-right:2px;
|
||||
width:35%;
|
||||
float:right;
|
||||
text-align:right;
|
||||
@@ -291,10 +291,20 @@ li.w2p_grid_breadcrumb_elem {
|
||||
display:inline-block;
|
||||
}
|
||||
|
||||
.ie9 #query_panel {padding-bottom:2px}
|
||||
.web2py_console form { vertical-align: middle; }
|
||||
.web2py_console input, .web2py_console select,
|
||||
.web2py_console a { margin: 2px; }
|
||||
|
||||
|
||||
#wiki_page_body {
|
||||
width: 600px;
|
||||
height: auto;
|
||||
min-height: 400px;
|
||||
}
|
||||
}
|
||||
|
||||
/* fix some IE problems */
|
||||
|
||||
.ie-lte7 .topbar .container {z-index:2}
|
||||
.ie-lte8 div.flash{ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#222222', endColorstr='#000000', GradientType=0 ); }
|
||||
.ie-lte8 div.flash:hover {filter:alpha(opacity=25);}
|
||||
.ie9 #w2p_query_panel {padding-bottom:2px}
|
||||
|
||||
@@ -1,130 +1,211 @@
|
||||
body {
|
||||
padding-top: 60px;
|
||||
/*=============================================================
|
||||
CUSTOM RULES
|
||||
==============================================================*/
|
||||
|
||||
body{height:auto;} /* to avoid vertical scroll bar */
|
||||
div.flash.flash-center{left:25%;right:25%;}
|
||||
div.flash.flash-top,div.flash.flash-top:hover{
|
||||
position:relative;
|
||||
display:block;
|
||||
margin:0;
|
||||
padding:1em;
|
||||
top:0;
|
||||
left:0;
|
||||
width:100%;
|
||||
text-align:center;
|
||||
text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);
|
||||
color:#865100;
|
||||
background:#feea9a;
|
||||
border:1px solid;
|
||||
border-top:0px;
|
||||
border-left:0px;
|
||||
border-right:0px;
|
||||
border-radius:0;
|
||||
opacity:1;
|
||||
}
|
||||
|
||||
#navbar .auth_navbar, #navbar .auth_navbar a {color:inherit;}
|
||||
|
||||
/* bootstrap dropdown */
|
||||
|
||||
.dropdown-menu ul {
|
||||
left: 100%;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
visibility: hidden;
|
||||
margin-top: -1px;
|
||||
}
|
||||
|
||||
.dropdown-menu li:hover ul {
|
||||
visibility: visible;
|
||||
}
|
||||
|
||||
#header{margin-top:60px;}
|
||||
.mastheader h1 {
|
||||
margin-bottom: 9px;
|
||||
font-size: 81px;
|
||||
font-weight: bold;
|
||||
letter-spacing: -1px;
|
||||
line-height: 1;
|
||||
margin-bottom:9px;
|
||||
font-size:81px;
|
||||
font-weight:bold;
|
||||
letter-spacing:-1px;
|
||||
line-height:1;
|
||||
font-size:54px;
|
||||
}
|
||||
|
||||
.mastheader h1 {
|
||||
font-size: 54px;
|
||||
}
|
||||
|
||||
.mastheader small {
|
||||
font-size: 20px;
|
||||
font-weight: 300;
|
||||
font-size:20px;
|
||||
font-weight:300;
|
||||
}
|
||||
|
||||
.navbar .dropdown-menu ul:before {
|
||||
border-bottom: 7px solid transparent;
|
||||
border-left: none;
|
||||
border-right: 7px solid rgba(0, 0, 0, 0.2);
|
||||
border-top: 7px solid transparent;
|
||||
left: -7px;
|
||||
top: 5px;
|
||||
}
|
||||
|
||||
.navbar .dropdown-menu ul:after {
|
||||
border-top: 6px solid transparent;
|
||||
border-left: none;
|
||||
border-right: 6px solid #fff;
|
||||
border-bottom: 6px solid transparent;
|
||||
left: 10px;
|
||||
top: 6px;
|
||||
left: -6px;
|
||||
}
|
||||
|
||||
.dropdown-menu span{
|
||||
/* auth navbar - primitive style */
|
||||
.auth_navbar,.auth_navbar a{color:inherit;}
|
||||
.ie-lte7 .auth_navbar,.auth_navbar a{color:expression(this.parentNode.currentStyle['color']); /* ie7 doesn't support inherit */}
|
||||
.auth_navbar a{white-space:nowrap;} /* to avoid the nav split on more lines */
|
||||
.auth_navbar a:hover{color:white;text-decoration:none;}
|
||||
ul#navbar>.auth_navbar{
|
||||
display:inline-block;
|
||||
padding:5px;
|
||||
}
|
||||
/* form errors message box customization */
|
||||
div.error_wrapper{margin-bottom:9px;}
|
||||
div.error{
|
||||
border-radius: 4px;
|
||||
-o-border-radius: 4px;
|
||||
-moz-border-radius: 4px;
|
||||
-webkit-border-radius: 4px;
|
||||
}
|
||||
/* below rules are only for formstyle = bootstrap
|
||||
trying to make errors look like bootstrap ones */
|
||||
div.controls .error_wrapper{
|
||||
display:inline-block;
|
||||
margin-bottom:0;
|
||||
vertical-align:middle;
|
||||
}
|
||||
div.controls .error{
|
||||
min-width:5px;
|
||||
background:inherit;
|
||||
color:#B94A48;
|
||||
border:none;
|
||||
padding:0;
|
||||
margin:0;
|
||||
//display:inline; /* uncommenting this, the animation effect is lost */
|
||||
}
|
||||
div.controls .inline-help{color:#3A87AD;}
|
||||
div.controls .error_wrapper+.inline-help{margin-left:-99999px}
|
||||
|
||||
.chevron-right {
|
||||
border-left: 4px solid #000;
|
||||
border-right: 4px solid transparent;
|
||||
border-bottom: 4px solid transparent;
|
||||
border-top: 4px solid transparent;
|
||||
content: "";
|
||||
/*=============================================================
|
||||
OVERRIDING WEB2PY.CSS RULES
|
||||
==============================================================*/
|
||||
|
||||
/* reset to default */
|
||||
a{white-space:normal;}
|
||||
li{margin-bottom:0;}
|
||||
textarea,button{display:block;}
|
||||
/*reset ul padding */
|
||||
ul#navbar{padding:0;}
|
||||
/* label aligned to related input */
|
||||
td.w2p_fl,td.w2p_fc {padding:0;}
|
||||
#web2py_user_form td{vertical-align:middle;}
|
||||
|
||||
/*=============================================================
|
||||
OVERRIDING BOOTSTRAP.CSS RULES
|
||||
==============================================================*/
|
||||
|
||||
/* right folder for bootstrap black images/icons */
|
||||
[class^="icon-"],[class*=" icon-"]{
|
||||
background-image:url("../images/glyphicons-halflings.png")
|
||||
}
|
||||
/* right folder for bootstrap white images/icons */
|
||||
.icon-white,
|
||||
.nav-tabs > .active > a > [class^="icon-"],
|
||||
.nav-tabs > .active > a > [class*=" icon-"],
|
||||
.nav-pills > .active > a > [class^="icon-"],
|
||||
.nav-pills > .active > a > [class*=" icon-"],
|
||||
.nav-list > .active > a > [class^="icon-"],
|
||||
.nav-list > .active > a > [class*=" icon-"],
|
||||
.navbar-inverse .nav > .active > a > [class^="icon-"],
|
||||
.navbar-inverse .nav > .active > a > [class*=" icon-"],
|
||||
.dropdown-menu > li > a:hover > [class^="icon-"],
|
||||
.dropdown-menu > li > a:hover > [class*=" icon-"],
|
||||
.dropdown-menu > .active > a > [class^="icon-"],
|
||||
.dropdown-menu > .active > a > [class*=" icon-"] {
|
||||
background-image:url("../images/glyphicons-halflings-white.png");
|
||||
}
|
||||
/* bootstrap has a label as input's wrapper while web2py has a div */
|
||||
div>input[type="radio"],div>input[type="checkbox"]{margin:0;}
|
||||
/* bootstrap has button instead of input */
|
||||
input[type="button"], input[type="submit"]{margin-right:8px;}
|
||||
|
||||
/*=============================================================
|
||||
RULES FOR SOLVING CONFLICTS BETWEEN WEB2PY.CSS AND BOOTSTRAP.CSS
|
||||
==============================================================*/
|
||||
|
||||
/*when formstyle=table3cols*/
|
||||
tr#auth_user_remember__row>td.w2p_fw>div{padding-bottom:8px;}
|
||||
td.w2p_fw div>label{vertical-align:middle;}
|
||||
td.w2p_fc {padding-bottom:5px;}
|
||||
/*when formstyle=divs*/
|
||||
div#auth_user_remember__row{margin-top:4px;}
|
||||
div#auth_user_remember__row>.w2p_fl{display:none;}
|
||||
div#auth_user_remember__row>.w2p_fw{min-height:39px;}
|
||||
div.w2p_fw,div.w2p_fc{
|
||||
display:inline-block;
|
||||
vertical-align:middle;
|
||||
margin-bottom:0;
|
||||
}
|
||||
div.w2p_fc{
|
||||
padding-left:5px;
|
||||
margin-top:-8px;
|
||||
}
|
||||
/*when formstyle=ul*/
|
||||
form>ul{
|
||||
list-style:none;
|
||||
margin:0;
|
||||
}
|
||||
li#auth_user_remember__row{margin-top:4px;}
|
||||
li#auth_user_remember__row>.w2p_fl{display:none;}
|
||||
li#auth_user_remember__row>.w2p_fw{min-height:39px;}
|
||||
/*when formstyle=bootstrap*/
|
||||
#auth_user_remember__row label.checkbox{display:block;}
|
||||
span.inline-help{display:inline-block;}
|
||||
input[type="text"].input-xlarge,input[type="password"].input-xlarge{width:270px;}
|
||||
/*when recaptcha is used*/
|
||||
#recaptcha{min-height:30px;display:inline-block;margin-bottom:0;line-height:30px;vertical-align:middle;}
|
||||
td>#recaptcha{margin-bottom:6px;}
|
||||
div>#recaptcha{margin-bottom:9px;}
|
||||
|
||||
/*=============================================================
|
||||
OTHER RULES
|
||||
==============================================================*/
|
||||
|
||||
.navbar-inner{
|
||||
position:relative; /*unnecessary ??*/
|
||||
}
|
||||
/* Massimo Di Pierro fixed alignment in forms with list:string */
|
||||
form table tr{margin-bottom:9px;}
|
||||
td.w2p_fw ul{margin-left:0px;}
|
||||
|
||||
/* web2py_console in grid and smartgrid */
|
||||
.hidden{visibility:visible;}
|
||||
.web2py_console input{
|
||||
display: inline-block;
|
||||
height: 0;
|
||||
opacity: 0.7;
|
||||
vertical-align: top;
|
||||
width: 0;
|
||||
margin-right:-13px;
|
||||
margin-top: 7px;
|
||||
float:right;
|
||||
margin-bottom: 0;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.open > .dropdown-menu ul { /* fix menu issue when BS2.0.4 is applied */
|
||||
display: block;
|
||||
.web2py_console input[type="submit"],
|
||||
.web2py_console input[type="button"],
|
||||
.web2py_console button{
|
||||
padding-top:4px;
|
||||
padding-bottom:4px;
|
||||
margin:3px 0 0 2px;
|
||||
}
|
||||
|
||||
.ie-lte7 #navbar .auth_navbar, #navbar .auth_navbar a {color:expression(this.parentNode.currentStyle['color']); /* ie7 doesn't support inherit */}
|
||||
|
||||
#navbar .auth_navbar a:hover {color:white;text-decoration:none;} /* this overwrite bootswatch */
|
||||
|
||||
body {
|
||||
height:auto; /*to avoid vertical scroll bar*/
|
||||
.web2py_console a,
|
||||
.web2py_console select,
|
||||
.web2py_console input
|
||||
{
|
||||
margin:3px 0 0 2px;
|
||||
}
|
||||
.web2py_grid form table{width:auto;}
|
||||
|
||||
h1,h2,h3,h4,h5,h6 {font-family: inherit;}
|
||||
/*=============================================================
|
||||
MEDIA QUERIES
|
||||
==============================================================*/
|
||||
|
||||
li {margin-bottom: 0;} /*bootswatch*/
|
||||
|
||||
.auth_navbar, .navbar .btn-group { padding:0; }
|
||||
|
||||
[class^="icon-"],[class*=" icon-"]{background-image:url("../images/glyphicons-halflings.png")} /* right folder for bootstrap black images/icons */
|
||||
.icon-white{background-image:url("../images/glyphicons-halflings-white.png");} /* right folder for bootstrap white images/icons */
|
||||
|
||||
@media only screen and (max-width: 979px) {
|
||||
body {
|
||||
padding-top: 0px;
|
||||
}
|
||||
|
||||
.navbar-inner{position:relative;}
|
||||
@media only screen and (max-width:979px){
|
||||
body{padding-top:0px;}
|
||||
#navbar{bottom:-10px;left:4px;}
|
||||
|
||||
div.flash {
|
||||
right: 5px;
|
||||
}
|
||||
|
||||
.dropdown-menu ul {
|
||||
visibility: visible;
|
||||
}
|
||||
|
||||
div.flash{right:5px;}
|
||||
.dropdown-menu ul{visibility:visible;}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 479px) {
|
||||
body {
|
||||
padding-left: 10px;
|
||||
padding-right: 10px;
|
||||
@media only screen and (max-width:479px){
|
||||
body{
|
||||
padding-left:10px;
|
||||
padding-right:10px;
|
||||
}
|
||||
|
||||
.navbar-fixed-top, .navbar-fixed-bottom {
|
||||
margin-left: -10px;
|
||||
margin-right: -10px;
|
||||
.navbar-fixed-top,.navbar-fixed-bottom {
|
||||
margin-left:-10px;
|
||||
margin-right:-10px;
|
||||
}
|
||||
|
||||
input[type="text"], input[type="password"], select {
|
||||
width: 95%;
|
||||
input[type="text"],input[type="password"],select{
|
||||
width:95%;
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 12 KiB |
+1
-1
File diff suppressed because one or more lines are too long
@@ -21,7 +21,7 @@ jQuery(function(){
|
||||
var title = escape(jQuery('title').text());
|
||||
var twit = 'http://twitter.com/home?status='+title+'%20'+url;
|
||||
var facebook = 'http://www.facebook.com/sharer.php?u='+url;
|
||||
var buzz = 'http://www.google.com/reader/link?url='+url+'&title='+title+'&srcURL='+host;
|
||||
var buzz = 'https://plus.google.com/share?url='+url;
|
||||
var tbar = '<div id="socialdrawer"><span>Share<br/></span><div id="sicons"><a href="'+twit+'" id="twit" title="Share on twitter"><img src="'+path+'/twitter.png" alt="Share on Twitter" width="32" height="32" /></a><a href="'+facebook+'" id="facebook" title="Share on Facebook"><img src="'+path+'/facebook.png" alt="Share on facebook" width="32" height="32" /></a><a href="'+buzz+'" id="buzz" title="Share on Buzz"><img src="'+path+'/google-buzz.png" alt="Share on Buzz" width="32" height="32" /></a></div></div>';
|
||||
// Add the share tool bar.
|
||||
jQuery('body').append(tbar);
|
||||
|
||||
@@ -39,7 +39,7 @@ function web2py_ajax_init(target) {
|
||||
|
||||
function web2py_event_handlers() {
|
||||
var doc = jQuery(document)
|
||||
doc.on('click', '.flash', function(e){jQuery(this).fadeOut('slow'); e.preventDefault();});
|
||||
doc.on('click', '.flash', function(e){var t=jQuery(this); if(t.css('top')=='0px') t.slideUp('slow'); else t.fadeOut(); e.preventDefault();});
|
||||
doc.on('keyup', 'input.integer', function(){this.value=this.value.reverse().replace(/[^0-9\-]|\-(?=.)/g,'').reverse();});
|
||||
doc.on('keyup', 'input.double, input.decimal', function(){this.value=this.value.reverse().replace(/[^0-9\-\.,]|[\-](?=.)|[\.,](?=[0-9]*[\.,])/g,'').reverse();});
|
||||
var confirm_message = (typeof w2p_ajax_confirm_message != 'undefined') ? w2p_ajax_confirm_message : "Are you sure you want to delete this object?";
|
||||
@@ -55,7 +55,7 @@ function web2py_event_handlers() {
|
||||
jQuery(function() {
|
||||
var flash = jQuery('.flash');
|
||||
flash.hide();
|
||||
if(flash.html()) flash.slideDown();
|
||||
if(flash.html()) flash.append('<span style="float:right;">×</span>').slideDown();
|
||||
web2py_ajax_init(document);
|
||||
web2py_event_handlers();
|
||||
});
|
||||
|
||||
@@ -149,7 +149,7 @@
|
||||
<h4>{{=T("RAM")}}</h4>
|
||||
<p>{{=T.M("Number of entries: **%s**", ram['entries'])}}</p>
|
||||
{{if ram['entries'] > 0:}}
|
||||
<p>{{=T.M("Hit Ratio: **%(ratio)s%%** (**%(hits)s** %{hit(hits)} and **%(misses)s** %%{miss(misses)})",
|
||||
<p>{{=T.M("Hit Ratio: **%(ratio)s%%** (**%(hits)s** %%{hit(hits)} and **%(misses)s** %%{miss(misses)})",
|
||||
dict( ratio=ram['ratio'], hits=ram['hits'], misses=ram['misses']))}}
|
||||
</p>
|
||||
<p>
|
||||
|
||||
@@ -4,10 +4,10 @@
|
||||
{{
|
||||
if request.args(0)=='login':
|
||||
if not 'register' in auth.settings.actions_disabled:
|
||||
form.add_button(T('Register'),URL(args='register'))
|
||||
form.add_button(T('Register'),URL(args='register'),_class='btn')
|
||||
pass
|
||||
if not 'request_reset_password' in auth.settings.actions_disabled:
|
||||
form.add_button(T('Lost Password'),URL(args='request_reset_password'))
|
||||
form.add_button(T('Lost Password'),URL(args='request_reset_password'),_class='btn')
|
||||
pass
|
||||
pass
|
||||
=form
|
||||
|
||||
@@ -1,177 +1,183 @@
|
||||
<!DOCTYPE html>
|
||||
<!-- paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither/ -->
|
||||
<!--[if lt IE 7]><html class="ie ie6 ie-lte9 ie-lte8 ie-lte7 no-js" lang="{{=T.accepted_language or 'en'}}"> <![endif]-->
|
||||
<!--[if IE 7]><html class="ie ie7 ie-lte9 ie-lte8 ie-lte7 no-js" lang="{{=T.accepted_language or 'en'}}"> <![endif]-->
|
||||
<!--[if IE 8]><html class="ie ie8 ie-lte9 ie-lte8 no-js" lang="{{=T.accepted_language or 'en'}}"> <![endif]-->
|
||||
<!--[if IE 9]><html class="ie9 ie-lte9 no-js" lang="{{=T.accepted_language or 'en'}}"> <![endif]-->
|
||||
<!--[if (gt IE 9)|!(IE)]><!--> <html class="no-js" lang="{{=T.accepted_language or 'en'}}"> <!--<![endif]-->
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<!-- www.phpied.com/conditional-comments-block-downloads/ -->
|
||||
<!-- Always force latest IE rendering engine
|
||||
(even in intranet) & Chrome Frame
|
||||
Remove this if you use the .htaccess -->
|
||||
<!--[if IE]>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge{{=not request.is_local and ',chrome=1' or ''}}">
|
||||
<![endif]-->
|
||||
|
||||
<title>{{=response.title or request.application}}</title>
|
||||
|
||||
<!-- http://dev.w3.org/html5/markup/meta.name.html -->
|
||||
<meta name="application-name" content="{{=request.application}}" />
|
||||
|
||||
<!-- Speaking of Google, don't forget to set your site up:
|
||||
http://google.com/webmasters -->
|
||||
<meta name="google-site-verification" content="" />
|
||||
|
||||
<!-- Mobile Viewport Fix
|
||||
j.mp/mobileviewport & davidbcalhoun.com/2010/viewport-metatag
|
||||
device-width: Occupy full width of the screen in its current orientation
|
||||
initial-scale = 1.0 retains dimensions instead of zooming out if page height > device height
|
||||
user-scalable = yes allows the user to zoom in -->
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
|
||||
<link rel="shortcut icon" href="{{=URL('static','images/favicon.ico')}}" type="image/x-icon">
|
||||
<link rel="apple-touch-icon" href="{{=URL('static','images/favicon.png')}}">
|
||||
|
||||
<!-- All JavaScript at the bottom, except for Modernizr which enables
|
||||
HTML5 elements & feature detects -->
|
||||
<script src="{{=URL('static','js/modernizr.custom.js')}}"></script>
|
||||
|
||||
<!-- include stylesheets -->
|
||||
{{
|
||||
response.files.append(URL('static','css/bootstrap.min.css'))
|
||||
response.files.append(URL('static','css/bootstrap-responsive.min.css'))
|
||||
response.files.append(URL('static','css/web2py.css'))
|
||||
response.files.append(URL('static','css/web2py_bootstrap.css'))
|
||||
}}
|
||||
|
||||
{{include 'web2py_ajax.html'}}
|
||||
|
||||
{{
|
||||
# using sidebars need to know what sidebar you want to use
|
||||
left_sidebar_enabled = globals().get('left_sidebar_enabled',False)
|
||||
right_sidebar_enabled = globals().get('right_sidebar_enabled',False)
|
||||
middle_columns = {0:'span12',1:'span9',2:'span6'}[
|
||||
(left_sidebar_enabled and 1 or 0)+(right_sidebar_enabled and 1 or 0)]
|
||||
}}
|
||||
|
||||
<!-- uncomment here to load jquery-ui
|
||||
<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/themes/base/jquery-ui.css" type="text/css" media="all" />
|
||||
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js" type="text/javascript"></script>
|
||||
uncomment to load jquery-ui //-->
|
||||
<noscript><link href="{{=URL('static', 'css/web2py_bootstrap_nojs.css')}}" rel="stylesheet" type="text/css" /></noscript>
|
||||
{{block head}}{{end}}
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- Navbar ================================================== -->
|
||||
<div class="navbar navbar-fixed-top">
|
||||
<div class="navbar-inner">
|
||||
<div class="container">
|
||||
<!-- the next tag is necessary for bootstrap menus, do not remove -->
|
||||
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</a>
|
||||
<a class="brand" href="#">web2py™ </a>
|
||||
<div id="navbar">{{='auth' in globals() and auth.navbar() or ''}}</div>
|
||||
<div class="nav-collapse">
|
||||
{{is_mobile=request.user_agent().is_mobile}}
|
||||
{{if response.menu:}}
|
||||
{{=MENU(response.menu, _class='mobile-menu nav' if is_mobile else 'nav',mobile=is_mobile,li_class='dropdown',ul_class='dropdown-menu')}}
|
||||
{{pass}}
|
||||
</div><!--/.nav-collapse -->
|
||||
</div>
|
||||
</div>
|
||||
</div><!--/top navbar -->
|
||||
|
||||
<div class="container">
|
||||
<div class="flash">{{=response.flash or ''}}</div>
|
||||
|
||||
<!-- Masthead ================================================== -->
|
||||
<header class="mastheader" id="header">
|
||||
<div class="page-header">
|
||||
<h1>
|
||||
{{=response.title or request.application}}
|
||||
<small>{{=response.subtitle or ''}}</small>
|
||||
</h1>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<section id="main" class="main span12">
|
||||
<div class="row">
|
||||
{{if left_sidebar_enabled:}}
|
||||
<div class="span3 left-sidebar">
|
||||
{{block left_sidebar}}
|
||||
<h3>Left Sidebar</h3>
|
||||
<p></p>
|
||||
{{end}}
|
||||
</div>
|
||||
{{pass}}
|
||||
|
||||
<div class="{{=middle_columns}}">
|
||||
{{block center}}
|
||||
{{include}}
|
||||
{{end}}
|
||||
</div>
|
||||
|
||||
{{if right_sidebar_enabled:}}
|
||||
<div class="span3">
|
||||
{{block right_sidebar}}
|
||||
<h3>Right Sidebar</h3>
|
||||
<p></p>
|
||||
{{end}}
|
||||
</div>
|
||||
{{pass}}
|
||||
</div><!--/row-->
|
||||
</section><!--/main-->
|
||||
|
||||
<!-- Footer ================================================== -->
|
||||
<footer class="footer" id="footer">
|
||||
{{block footer}} <!-- this is default footer -->
|
||||
<div class="footer-content">
|
||||
<div class="copyright pull-left">{{=T('Copyright')}} © {{=request.now.year}}</div>
|
||||
<div id="poweredBy" class="pull-right">
|
||||
{{=T('Powered by')}}
|
||||
<a href="http://www.web2py.com/">web2py</a>
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
</footer>
|
||||
|
||||
</div> <!-- /container -->
|
||||
|
||||
<!-- The javascript =============================================
|
||||
(Placed at the end of the document so the pages load faster) -->
|
||||
<script>
|
||||
// this code improves bootstrap menus and adds dropdown support
|
||||
jQuery(function(){
|
||||
jQuery('.nav>li>a').each(function(){
|
||||
if(jQuery(this).parent().find('ul').length)
|
||||
jQuery(this).attr({'class':'dropdown-toggle','data-toggle':'dropdown'}).append('<b class="caret"></b>');
|
||||
});
|
||||
jQuery('.nav li li').each(function(){
|
||||
if(jQuery(this).find('ul').length)
|
||||
jQuery(this).children('a').contents().before('<i class="chevron-right"></i>');
|
||||
});
|
||||
if(jQuery(document).width()>=980) {
|
||||
jQuery('ul.nav li.dropdown').hover(function() {
|
||||
jQuery(this).find('.dropdown-menu').stop(true, true).delay(200).fadeIn();
|
||||
}, function() {
|
||||
jQuery(this).find('.dropdown-menu').stop(true, true).delay(200).fadeOut();
|
||||
});
|
||||
}
|
||||
jQuery('ul.nav li.dropdown a').click(function(){window.location=jQuery(this).attr('href');});
|
||||
});
|
||||
</script>
|
||||
<script src="{{=URL('static','js/bootstrap.min.js')}}"></script>
|
||||
<!--[if lt IE 7 ]>
|
||||
<script src="{{=URL('static','js/dd_belatedpng.js')}}"></script>
|
||||
<script> DD_belatedPNG.fix('img, .png_bg'); //fix any <img> or .png_bg background-images </script>
|
||||
<![endif]-->
|
||||
{{if response.google_analytics_id:}}<script type="text/javascript"> var _gaq = _gaq || []; _gaq.push(['_setAccount', '{{=response.google_analytics_id}}']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); </script> {{pass}}
|
||||
<script src="{{=URL('static','js/share.js',vars=dict(static=URL('static','images')))}}"></script>
|
||||
</body>
|
||||
</html>
|
||||
<!DOCTYPE html>
|
||||
<!-- paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither/ -->
|
||||
<!--[if lt IE 7]><html class="ie ie6 ie-lte9 ie-lte8 ie-lte7 no-js" lang="{{=T.accepted_language or 'en'}}"> <![endif]-->
|
||||
<!--[if IE 7]><html class="ie ie7 ie-lte9 ie-lte8 ie-lte7 no-js" lang="{{=T.accepted_language or 'en'}}"> <![endif]-->
|
||||
<!--[if IE 8]><html class="ie ie8 ie-lte9 ie-lte8 no-js" lang="{{=T.accepted_language or 'en'}}"> <![endif]-->
|
||||
<!--[if IE 9]><html class="ie9 ie-lte9 no-js" lang="{{=T.accepted_language or 'en'}}"> <![endif]-->
|
||||
<!--[if (gt IE 9)|!(IE)]><!--> <html class="no-js" lang="{{=T.accepted_language or 'en'}}"> <!--<![endif]-->
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<!-- www.phpied.com/conditional-comments-block-downloads/ -->
|
||||
<!-- Always force latest IE rendering engine
|
||||
(even in intranet) & Chrome Frame
|
||||
Remove this if you use the .htaccess -->
|
||||
<!--[if IE]>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge{{=not request.is_local and ',chrome=1' or ''}}">
|
||||
<![endif]-->
|
||||
|
||||
<title>{{=response.title or request.application}}</title>
|
||||
|
||||
<!-- http://dev.w3.org/html5/markup/meta.name.html -->
|
||||
<meta name="application-name" content="{{=request.application}}" />
|
||||
|
||||
<!-- Speaking of Google, don't forget to set your site up:
|
||||
http://google.com/webmasters -->
|
||||
<meta name="google-site-verification" content="" />
|
||||
|
||||
<!-- Mobile Viewport Fix
|
||||
j.mp/mobileviewport & davidbcalhoun.com/2010/viewport-metatag
|
||||
device-width: Occupy full width of the screen in its current orientation
|
||||
initial-scale = 1.0 retains dimensions instead of zooming out if page height > device height
|
||||
user-scalable = yes allows the user to zoom in -->
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
|
||||
<link rel="shortcut icon" href="{{=URL('static','images/favicon.ico')}}" type="image/x-icon">
|
||||
<link rel="apple-touch-icon" href="{{=URL('static','images/favicon.png')}}">
|
||||
|
||||
<!-- All JavaScript at the bottom, except for Modernizr which enables
|
||||
HTML5 elements & feature detects -->
|
||||
<script src="{{=URL('static','js/modernizr.custom.js')}}"></script>
|
||||
|
||||
<!-- include stylesheets -->
|
||||
{{
|
||||
response.files.append(URL('static','css/web2py.css'))
|
||||
response.files.append(URL('static','css/bootstrap.min.css'))
|
||||
response.files.append(URL('static','css/bootstrap-responsive.min.css'))
|
||||
response.files.append(URL('static','css/web2py_bootstrap.css'))
|
||||
}}
|
||||
|
||||
{{include 'web2py_ajax.html'}}
|
||||
|
||||
{{
|
||||
# using sidebars need to know what sidebar you want to use
|
||||
left_sidebar_enabled = globals().get('left_sidebar_enabled',False)
|
||||
right_sidebar_enabled = globals().get('right_sidebar_enabled',False)
|
||||
middle_columns = {0:'span12',1:'span9',2:'span6'}[
|
||||
(left_sidebar_enabled and 1 or 0)+(right_sidebar_enabled and 1 or 0)]
|
||||
}}
|
||||
|
||||
<!-- uncomment here to load jquery-ui
|
||||
<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/themes/base/jquery-ui.css" type="text/css" media="all" />
|
||||
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js" type="text/javascript"></script>
|
||||
uncomment to load jquery-ui //-->
|
||||
<noscript><link href="{{=URL('static', 'css/web2py_bootstrap_nojs.css')}}" rel="stylesheet" type="text/css" /></noscript>
|
||||
{{block head}}{{end}}
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- Navbar ================================================== -->
|
||||
<div class="navbar navbar-inverse navbar-fixed-top">
|
||||
<div class="flash">{{=response.flash or ''}}</div>
|
||||
<div class="navbar-inner">
|
||||
<div class="container">
|
||||
<!-- the next tag is necessary for bootstrap menus, do not remove -->
|
||||
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</a>
|
||||
<a class="brand" href="http://www.web2py.com/">web2py™ </a>
|
||||
<ul id="navbar" class="nav pull-right">{{='auth' in globals() and auth.navbar(mode="dropdown") or ''}}</ul>
|
||||
<div class="nav-collapse">
|
||||
{{is_mobile=request.user_agent().is_mobile}}
|
||||
{{if response.menu:}}
|
||||
{{=MENU(response.menu, _class='mobile-menu nav' if is_mobile else 'nav',mobile=is_mobile,li_class='dropdown',ul_class='dropdown-menu')}}
|
||||
{{pass}}
|
||||
</div><!--/.nav-collapse -->
|
||||
</div>
|
||||
</div>
|
||||
</div><!--/top navbar -->
|
||||
|
||||
<div class="container">
|
||||
<!-- Masthead ================================================== -->
|
||||
<header class="mastheader row" id="header">
|
||||
<div class="span12">
|
||||
<div class="page-header">
|
||||
<h1>
|
||||
{{=response.title or request.application}}
|
||||
<small>{{=response.subtitle or ''}}</small>
|
||||
</h1>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<section id="main" class="main row">
|
||||
{{if left_sidebar_enabled:}}
|
||||
<div class="span3 left-sidebar">
|
||||
{{block left_sidebar}}
|
||||
<h3>Left Sidebar</h3>
|
||||
<p></p>
|
||||
{{end}}
|
||||
</div>
|
||||
{{pass}}
|
||||
|
||||
<div class="{{=middle_columns}}">
|
||||
{{block center}}
|
||||
{{include}}
|
||||
{{end}}
|
||||
</div>
|
||||
|
||||
{{if right_sidebar_enabled:}}
|
||||
<div class="span3">
|
||||
{{block right_sidebar}}
|
||||
<h3>Right Sidebar</h3>
|
||||
<p></p>
|
||||
{{end}}
|
||||
</div>
|
||||
{{pass}}
|
||||
</section><!--/main-->
|
||||
|
||||
<!-- Footer ================================================== -->
|
||||
<div class="row">
|
||||
<footer class="footer span12" id="footer">
|
||||
<div class="footer-content">
|
||||
{{block footer}} <!-- this is default footer -->
|
||||
<div class="copyright pull-left">{{=T('Copyright')}} © {{=request.now.year}}</div>
|
||||
<div id="poweredBy" class="pull-right">
|
||||
{{=T('Powered by')}}
|
||||
<a href="http://www.web2py.com/">web2py</a>
|
||||
</div>
|
||||
{{end}}
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
</div> <!-- /container -->
|
||||
|
||||
<!-- The javascript =============================================
|
||||
(Placed at the end of the document so the pages load faster) -->
|
||||
<script>
|
||||
// this code improves bootstrap menus and adds dropdown support
|
||||
jQuery(function(){
|
||||
jQuery('.nav>li>a').each(function(){
|
||||
if(jQuery(this).parent().find('ul').length)
|
||||
jQuery(this).attr({'class':'dropdown-toggle','data-toggle':'dropdown'}).append('<b class="caret"></b>');
|
||||
});
|
||||
jQuery('.nav li li').each(function(){
|
||||
if(jQuery(this).find('ul').length)
|
||||
jQuery(this).addClass('dropdown-submenu');
|
||||
});
|
||||
if(jQuery(document).width()>=980) {
|
||||
jQuery('ul.nav a.dropdown-toggle').parent().hover(function() {
|
||||
mi = jQuery(this);
|
||||
mi.children('.dropdown-menu').stop(true, true).delay(200).fadeIn(400,function(){mi.addClass('open')});
|
||||
}, function() {
|
||||
mi = jQuery(this);
|
||||
mi.children('.dropdown-menu').stop(true, true).delay(200).fadeOut(function(){mi.removeClass('open')});
|
||||
});
|
||||
}
|
||||
jQuery('ul.nav li.dropdown a').click(function(){window.location=jQuery(this).attr('href');});
|
||||
// make all buttons bootstrap buttons
|
||||
jQuery('button, form input[type="submit"], form input[type="button"]').addClass('btn');
|
||||
});
|
||||
</script>
|
||||
<script src="{{=URL('static','js/bootstrap.min.js')}}"></script>
|
||||
<!--[if lt IE 7 ]>
|
||||
<script src="{{=URL('static','js/dd_belatedpng.js')}}"></script>
|
||||
<script> DD_belatedPNG.fix('img, .png_bg'); //fix any <img> or .png_bg background-images </script>
|
||||
<![endif]-->
|
||||
{{if response.google_analytics_id:}}<script type="text/javascript"> var _gaq = _gaq || []; _gaq.push(['_setAccount', '{{=response.google_analytics_id}}']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); </script> {{pass}}
|
||||
<script src="{{=URL('static','js/share.js',vars=dict(static=URL('static','images')))}}"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
+1
-1
@@ -60,7 +60,7 @@ def app_pack(app, request, raise_ex=False):
|
||||
"""
|
||||
try:
|
||||
app_cleanup(app, request)
|
||||
filename = apath('../deposit/%s.w2p' % app, request)
|
||||
filename = apath('../deposit/web2py.app.%s.w2p' % app, request)
|
||||
w2p_pack(filename, apath(app, request))
|
||||
return filename
|
||||
except Exception, e:
|
||||
|
||||
@@ -479,6 +479,17 @@ class Cache(object):
|
||||
return CacheAction(func,key,time_expire,self,cache_model)
|
||||
return tmp
|
||||
|
||||
@staticmethod
|
||||
def with_prefix(cache_model, prefix):
|
||||
"""
|
||||
allow replacing cache.ram with cache.with_prefix(cache.ram,'prefix')
|
||||
it will add prefix to all the cache keys used.
|
||||
"""
|
||||
return lambda key, f, time_expire=DEFAULT_TIME_EXPIRE, prefix=prefix:\
|
||||
cache_model(prefix + key, f, time_expire)
|
||||
|
||||
|
||||
|
||||
def lazy_cache(key=None,time_expire=None,cache_model='ram'):
|
||||
"""
|
||||
can be used to cache any function including in modules,
|
||||
|
||||
+2
-2
@@ -12,7 +12,7 @@ Functions required to execute app components
|
||||
FOR INTERNAL USE ONLY
|
||||
"""
|
||||
|
||||
import os
|
||||
from os import stat
|
||||
import thread
|
||||
import logging
|
||||
from fileutils import read_file
|
||||
@@ -35,7 +35,7 @@ def getcfs(key, filename, filter=None):
|
||||
This is used on Google App Engine since pyc files cannot be saved.
|
||||
"""
|
||||
try:
|
||||
t = os.stat(filename).st_mtime
|
||||
t = stat(filename).st_mtime
|
||||
except OSError:
|
||||
return filter() if callable(filter) else ''
|
||||
cfs_lock.acquire()
|
||||
|
||||
@@ -47,10 +47,12 @@ class MemcacheClient(Client):
|
||||
self.set((time.time(), value))
|
||||
return value
|
||||
|
||||
def clear(self, key):
|
||||
key = '%s/%s' % (self.request.application, key)
|
||||
self.delete(key)
|
||||
|
||||
def clear(self, key = None):
|
||||
if key:
|
||||
key = '%s/%s' % (self.request.application, key)
|
||||
self.delete(key)
|
||||
else:
|
||||
self.flush_all()
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -107,7 +107,7 @@ server for requests. It can be used for the optional"scope" parameters for Face
|
||||
path_info = next
|
||||
else:
|
||||
path_info = r.env.path_info
|
||||
uri = '%s://%s%s' %(url_scheme, http_host, path_info)
|
||||
uri = '%s://%s%s' % (url_scheme, http_host, path_info)
|
||||
if r.get_vars and not next:
|
||||
uri += '?' + urlencode(r.get_vars)
|
||||
return uri
|
||||
|
||||
@@ -540,7 +540,7 @@ regex_strong=re.compile(r'\*\*(?P<t>[^\s*]+( +[^\s*]+)*)\*\*')
|
||||
regex_del=re.compile(r'~~(?P<t>[^\s*]+( +[^\s*]+)*)~~')
|
||||
regex_em=re.compile(r"''(?P<t>[^\s']+(?: +[^\s']+)*)''")
|
||||
regex_num=re.compile(r"^\s*[+-]?((\d+(\.\d*)?)|\.\d+)([eE][+-]?[0-9]+)?\s*$")
|
||||
regex_list=re.compile('^(?:(?:(#{1,6})|(?:(\.+|\++|\-+)(\.)?))\s+)?(.*)$')
|
||||
regex_list=re.compile('^(?:(?:(#{1,6})|(?:(\.+|\++|\-+)(\.)?))\s*)?(.*)$')
|
||||
regex_bq_headline=re.compile('^(?:(\.+|\++|\-+)(\.)?\s+)?(-{3}-*)$')
|
||||
regex_tq=re.compile('^(-{3}-*)(?::(?P<c>[a-zA-Z][_a-zA-Z\-\d]*)(?:\[(?P<p>[a-zA-Z][_a-zA-Z\-\d]*)\])?)?$')
|
||||
regex_proto = re.compile(r'(?<!["\w>/=])(?P<p>\w+):(?P<k>\w+://[\w\d\-+=?%&/:.]+)', re.M)
|
||||
@@ -1165,17 +1165,17 @@ def render(text,
|
||||
(lev, mtag, lineno)= parse_list(t2, p, ss, 'ol', lev, mtag, lineno)
|
||||
lineno+=1
|
||||
continue
|
||||
elif c0 == '-': # unordered list
|
||||
(lev, mtag, lineno) = parse_list(t2, p, ss, 'ul', lev, mtag, lineno)
|
||||
lineno+=1
|
||||
continue
|
||||
elif c0 == '-': # unordered list, table or blockquote
|
||||
if p or ss:
|
||||
(lev, mtag, lineno) = parse_list(t2, p, ss, 'ul', lev, mtag, lineno)
|
||||
lineno+=1
|
||||
continue
|
||||
else:
|
||||
(s, mtag, lineno) = parse_table_or_blockquote(s, mtag, lineno)
|
||||
elif lev>0: # and c0 == '.' # paragraph in lists
|
||||
(lev, mtag, lineno) = parse_point(t2, ss, lev, mtag, lineno)
|
||||
lineno+=1
|
||||
continue
|
||||
else:
|
||||
if c0 == '-': # table or blockquote?
|
||||
(s, mtag, lineno) = parse_table_or_blockquote(s, mtag, lineno)
|
||||
|
||||
if lev == 0 and (mtag == 'q' or s == META):
|
||||
# new paragraph
|
||||
|
||||
@@ -17,7 +17,7 @@ DEFAULT_TIME_EXPIRE = 300 # seconds (must be the same as cache.ram)
|
||||
def MemcacheClient(*a, **b):
|
||||
if not hasattr(current,'__mc_instance'):
|
||||
current.__memcache_client = MemcacheClientObj(*a, **b)
|
||||
return current.__memecache_client
|
||||
return current.__memcache_client
|
||||
|
||||
class MemcacheClientObj(Client):
|
||||
|
||||
@@ -61,7 +61,7 @@ class MemcacheClientObj(Client):
|
||||
if item:
|
||||
if not isinstance(item,(list,tuple)):
|
||||
value = item
|
||||
elif (item[0] < now - dt): # value expired
|
||||
elif (item[0] < now - time_expire): # value expired
|
||||
item = None # value to be computed
|
||||
else:
|
||||
value = item[1]
|
||||
|
||||
@@ -11,6 +11,7 @@ Modified by: Massimo Di Pierro <massimo.dipierro@gmail.com>
|
||||
import cssmin
|
||||
import jsmin
|
||||
import os
|
||||
import hashlib
|
||||
|
||||
def read_binary_file(filename):
|
||||
f = open(filename,'rb')
|
||||
@@ -23,9 +24,9 @@ def write_binary_file(filename,data):
|
||||
f.write(data)
|
||||
f.close()
|
||||
|
||||
def fix_links(css,static_path):
|
||||
return css.replace('../',static_path+'/')
|
||||
|
||||
def fix_links(css,static_path):
|
||||
return css.replace('../',static_path+'../')
|
||||
|
||||
def minify(files, path_info, folder, optimize_css, optimize_js,
|
||||
ignore_concat = [],
|
||||
ignore_minify = ['/jquery.js', '/anytime.js']):
|
||||
@@ -56,6 +57,7 @@ def minify(files, path_info, folder, optimize_css, optimize_js,
|
||||
new_files = []
|
||||
css = []
|
||||
js = []
|
||||
processed = []
|
||||
for k,filename in enumerate(files):
|
||||
if not filename.startswith('/') or \
|
||||
any(filename.endswith(x) for x in ignore_concat):
|
||||
@@ -66,8 +68,20 @@ def minify(files, path_info, folder, optimize_css, optimize_js,
|
||||
filename[len(static_path)+1:])
|
||||
|
||||
if filename.lower().endswith('.css'):
|
||||
processed.append(filename)
|
||||
spath_info, sfilename = path_info.split('/'), filename.split('/')
|
||||
u = 0
|
||||
for i,a in enumerate(sfilename):
|
||||
try:
|
||||
if a != spath_info[i]:
|
||||
u = i
|
||||
break
|
||||
except:
|
||||
pass
|
||||
if concat_css:
|
||||
contents = read_binary_file(abs_filename)
|
||||
replacement = '../'*len(spath_info[u:]) + '/'.join(sfilename[u:-1]) + '/'
|
||||
contents = fix_links(contents, replacement)
|
||||
if minify_css:
|
||||
css.append(cssmin.cssmin(contents))
|
||||
else:
|
||||
@@ -75,6 +89,7 @@ def minify(files, path_info, folder, optimize_css, optimize_js,
|
||||
else:
|
||||
css.append(filename)
|
||||
elif filename.lower().endswith('.js'):
|
||||
processed.append(filename)
|
||||
if concat_js:
|
||||
contents = read_binary_file(abs_filename)
|
||||
if minify_js and not filename.endswith('.min.js') and \
|
||||
@@ -84,19 +99,19 @@ def minify(files, path_info, folder, optimize_css, optimize_js,
|
||||
js.append(contents)
|
||||
else:
|
||||
js.append(filename)
|
||||
dest_key = hashlib.md5(repr(processed)).hexdigest()
|
||||
if css and concat_css:
|
||||
css = '\n\n'.join(contents for contents in css)
|
||||
if inline_css:
|
||||
css = ('css:inline',fix_links(css,static_path))
|
||||
else:
|
||||
if not inline_css:
|
||||
temppath = os.path.join(folder,'static',temp)
|
||||
if not os.path.exists(temppath): os.mkdir(temppath)
|
||||
tempfile = os.path.join(temppath,'compressed.css')
|
||||
dest = "compressed_%s.css" % dest_key
|
||||
tempfile = os.path.join(temppath, dest)
|
||||
write_binary_file(tempfile,css)
|
||||
css = path_info+'/compressed.css'
|
||||
css = path_info+'/%s' % dest
|
||||
new_files.append(css)
|
||||
else:
|
||||
new_files += css
|
||||
new_files += css
|
||||
if js and concat_js:
|
||||
js = '\n'.join(contents for contents in js)
|
||||
if inline_js:
|
||||
@@ -104,9 +119,10 @@ def minify(files, path_info, folder, optimize_css, optimize_js,
|
||||
else:
|
||||
temppath = os.path.join(folder,'static',temp)
|
||||
if not os.path.exists(temppath): os.mkdir(temppath)
|
||||
tempfile = os.path.join(folder,'static',temp,'compressed.js')
|
||||
dest = "compressed_%s.js" % dest_key
|
||||
tempfile = os.path.join(folder,'static',temp,dest)
|
||||
write_binary_file(tempfile,js)
|
||||
js = path_info+'/compressed.js'
|
||||
js = path_info+'/%s' % dest
|
||||
new_files.append(js)
|
||||
else:
|
||||
new_files += js
|
||||
|
||||
+139
-93
@@ -40,7 +40,7 @@ Example of usage:
|
||||
>>> # from dal import DAL, Field
|
||||
|
||||
### create DAL connection (and create DB if it doesn't exist)
|
||||
>>> db = DAL(('sqlite://storage.sqlite','mysql://a:b@localhost/x'),
|
||||
>>> db = DAL(('sqlite://storage.sqlite','mysql://a:b@localhost/x'),
|
||||
... folder=None)
|
||||
|
||||
### define a table 'person' (create/alter as necessary)
|
||||
@@ -185,6 +185,7 @@ SELECT_ARGS = set(
|
||||
('orderby', 'groupby', 'limitby','required', 'cache', 'left',
|
||||
'distinct', 'having', 'join','for_update', 'processor','cacheable'))
|
||||
|
||||
|
||||
ogetattr = object.__getattribute__
|
||||
osetattr = object.__setattr__
|
||||
exists = os.path.exists
|
||||
@@ -241,7 +242,7 @@ REGEX_SEARCH_PATTERN = re.compile('^{[^\.]+\.[^\.]+(\.(lt|gt|le|ge|eq|ne|contain
|
||||
REGEX_SQUARE_BRACKETS = re.compile('^.+\[.+\]$')
|
||||
REGEX_STORE_PATTERN = re.compile('\.(?P<e>\w{1,5})$')
|
||||
REGEX_QUOTES = re.compile("'[^']*'")
|
||||
REGEX_ALPHANUMERIC = re.compile('^[a-zA-Z]\w*$')
|
||||
REGEX_ALPHANUMERIC = re.compile('^[0-9a-zA-Z]\w*$')
|
||||
|
||||
# list of drivers will be built on the fly
|
||||
# and lists only what is available
|
||||
@@ -329,7 +330,7 @@ if not 'google' in DRIVERS:
|
||||
DRIVERS.append('Sybase(Sybase)')
|
||||
except ImportError:
|
||||
logger.debug('no Sybase driver')
|
||||
|
||||
|
||||
try:
|
||||
import kinterbasdb
|
||||
DRIVERS.append('Interbase(kinterbasdb)')
|
||||
@@ -341,7 +342,7 @@ if not 'google' in DRIVERS:
|
||||
import fdb
|
||||
DRIVERS.append('Firbird(fdb)')
|
||||
except ImportError:
|
||||
logger.debug('no Firebird driver fdb')
|
||||
logger.debug('no Firebird driver fdb')
|
||||
#####
|
||||
try:
|
||||
import firebirdsql
|
||||
@@ -659,7 +660,7 @@ class BaseAdapter(ConnectionPool):
|
||||
|
||||
def find_driver(self,adapter_args,uri=None):
|
||||
if hasattr(self,'driver') and self.driver!=None:
|
||||
return
|
||||
return
|
||||
drivers_available = [driver for driver in self.drivers
|
||||
if driver in globals()]
|
||||
if uri:
|
||||
@@ -667,7 +668,7 @@ class BaseAdapter(ConnectionPool):
|
||||
request_driver = items[1] if len(items)>1 else None
|
||||
else:
|
||||
request_driver = None
|
||||
request_driver = request_driver or adapter_args.get('driver')
|
||||
request_driver = request_driver or adapter_args.get('driver')
|
||||
if request_driver:
|
||||
if request_driver in drivers_available:
|
||||
self.driver_name = request_driver
|
||||
@@ -679,7 +680,7 @@ class BaseAdapter(ConnectionPool):
|
||||
self.driver = globals().get(self.driver_name)
|
||||
else:
|
||||
raise RuntimeError, "no driver available %s", self.drivers
|
||||
|
||||
|
||||
|
||||
def __init__(self, db,uri,pool_size=0, folder=None, db_codec='UTF-8',
|
||||
credential_decoder=IDENTITY, driver_args={},
|
||||
@@ -798,7 +799,7 @@ class BaseAdapter(ConnectionPool):
|
||||
else:
|
||||
schema = parms[0]
|
||||
ftype = "SELECT AddGeometryColumn ('%%(schema)s', '%%(tablename)s', '%%(fieldname)s', %%(srid)s, '%s', %%(dimension)s);" % types[geotype]
|
||||
ftype = ftype % dict(schema=schema,
|
||||
ftype = ftype % dict(schema=schema,
|
||||
tablename=tablename,
|
||||
fieldname=field_name, srid=srid,
|
||||
dimension=dimension)
|
||||
@@ -889,7 +890,7 @@ class BaseAdapter(ConnectionPool):
|
||||
else:
|
||||
table._dbt = pjoin(
|
||||
dbpath, '%s_%s.table' % (table._db._uri_hash, tablename))
|
||||
|
||||
|
||||
if table._dbt:
|
||||
table._loggername = pjoin(dbpath, 'sql.log')
|
||||
logfile = self.file_open(table._loggername, 'a')
|
||||
@@ -1001,7 +1002,7 @@ class BaseAdapter(ConnectionPool):
|
||||
query = ['ALTER TABLE %s DROP %s;' % (tablename, key)]
|
||||
metadata_change = True
|
||||
elif sql_fields[key]['sql'] != sql_fields_old[key]['sql'] \
|
||||
and not (key in table.fields and
|
||||
and not (key in table.fields and
|
||||
isinstance(table[key].type, SQLCustomType)) \
|
||||
and not sql_fields[key]['type'].startswith('reference')\
|
||||
and not sql_fields[key]['type'].startswith('double')\
|
||||
@@ -1072,6 +1073,9 @@ class BaseAdapter(ConnectionPool):
|
||||
def EXTRACT(self, first, what):
|
||||
return "EXTRACT(%s FROM %s)" % (what, self.expand(first))
|
||||
|
||||
def EPOCH(self, first):
|
||||
return self.EXTRACT(first, 'epoch')
|
||||
|
||||
def AGGREGATE(self, first, what):
|
||||
return "%s(%s)" % (what, self.expand(first))
|
||||
|
||||
@@ -1272,7 +1276,7 @@ class BaseAdapter(ConnectionPool):
|
||||
first = expression.first
|
||||
second = expression.second
|
||||
op = expression.op
|
||||
if not second is None:
|
||||
if not second is None:
|
||||
return op(first, second)
|
||||
elif not first is None:
|
||||
return op(first)
|
||||
@@ -1453,6 +1457,8 @@ class BaseAdapter(ConnectionPool):
|
||||
having = args_get('having', False)
|
||||
limitby = args_get('limitby', False)
|
||||
for_update = args_get('for_update', False)
|
||||
if not distinct is True and not distinct is False and not groupby:
|
||||
distinct, groupby = False, distinct
|
||||
if self.can_select_for_update is False and for_update is True:
|
||||
raise SyntaxError, 'invalid select attribute: for_update'
|
||||
if distinct is True:
|
||||
@@ -1579,14 +1585,14 @@ class BaseAdapter(ConnectionPool):
|
||||
"""
|
||||
sql = self._select(query, fields, attributes)
|
||||
cache = attributes.get('cache', None)
|
||||
if cache and attributes.get('cacheable',False):
|
||||
if cache and attributes.get('cacheable',False):
|
||||
del attributes['cache']
|
||||
(cache_model, time_expire) = cache
|
||||
key = self.uri + '/' + sql
|
||||
if len(key)>200: key = hashlib.md5(key).hexdigest()
|
||||
args = (sql,fields,attributes)
|
||||
return cache_model(
|
||||
key,
|
||||
key,
|
||||
lambda self=self,args=args:self._select_aux(*args),
|
||||
time_expire)
|
||||
else:
|
||||
@@ -1613,15 +1619,16 @@ class BaseAdapter(ConnectionPool):
|
||||
self.execute(self._count(query, distinct))
|
||||
return self.cursor.fetchone()[0]
|
||||
|
||||
def tables(self, query):
|
||||
def tables(self, *queries):
|
||||
tables = set()
|
||||
if isinstance(query, Field):
|
||||
tables.add(query.tablename)
|
||||
elif isinstance(query, (Expression, Query)):
|
||||
if not query.first is None:
|
||||
tables = tables.union(self.tables(query.first))
|
||||
if not query.second is None:
|
||||
tables = tables.union(self.tables(query.second))
|
||||
for query in queries:
|
||||
if isinstance(query, Field):
|
||||
tables.add(query.tablename)
|
||||
elif isinstance(query, (Expression, Query)):
|
||||
if not query.first is None:
|
||||
tables = tables.union(self.tables(query.first))
|
||||
if not query.second is None:
|
||||
tables = tables.union(self.tables(query.second))
|
||||
return list(tables)
|
||||
|
||||
def commit(self):
|
||||
@@ -1685,9 +1692,9 @@ class BaseAdapter(ConnectionPool):
|
||||
elif not isinstance(obj, (list, tuple)):
|
||||
obj = [obj]
|
||||
if field_is_type('list:string'):
|
||||
obj = [str(item) for item in obj]
|
||||
obj = map(str,obj)
|
||||
else:
|
||||
obj = [int(item) for item in obj]
|
||||
obj = map(int,obj)
|
||||
if isinstance(obj, (list, tuple)):
|
||||
obj = bar_encode(obj)
|
||||
if obj is None:
|
||||
@@ -1904,7 +1911,7 @@ class BaseAdapter(ConnectionPool):
|
||||
for (i,row) in enumerate(rows):
|
||||
new_row = Row()
|
||||
for (j,colname) in enumerate(colnames):
|
||||
value = row[j]
|
||||
value = row[j]
|
||||
tmp = tmps[j]
|
||||
if tmp:
|
||||
(tablename,fieldname,table,field,ft) = tmp
|
||||
@@ -1918,14 +1925,14 @@ class BaseAdapter(ConnectionPool):
|
||||
if field.filter_out:
|
||||
value = field.filter_out(value)
|
||||
colset[fieldname] = value
|
||||
|
||||
|
||||
# for backward compatibility
|
||||
if ft=='id' and fieldname!='id' and \
|
||||
not 'id' in table.fields:
|
||||
colset['id'] = value
|
||||
|
||||
if ft == 'id' and not cacheable:
|
||||
# temporary hack to deal with
|
||||
# temporary hack to deal with
|
||||
# GoogleDatastoreAdapter
|
||||
# references
|
||||
if isinstance(self, GoogleDatastoreAdapter):
|
||||
@@ -2025,8 +2032,11 @@ class SQLiteAdapter(BaseAdapter):
|
||||
'second': (17, 19),
|
||||
}
|
||||
try:
|
||||
(i, j) = table[lookup]
|
||||
return int(s[i:j])
|
||||
if lookup != 'epoch':
|
||||
(i, j) = table[lookup]
|
||||
return int(s[i:j])
|
||||
else:
|
||||
return time.mktime(datetime.datetime.strptime(s, '%Y-%m-%d %H:%M:%S').timetuple())
|
||||
except:
|
||||
return None
|
||||
|
||||
@@ -2278,6 +2288,9 @@ class MySQLAdapter(BaseAdapter):
|
||||
return 'SUBSTRING(%s,%s,%s)' % (self.expand(field),
|
||||
parameters[0], parameters[1])
|
||||
|
||||
def EPOCH(self, first):
|
||||
return "UNIX_TIMESTAMP(%s)" % self.expand(first)
|
||||
|
||||
def _drop(self,table,mode):
|
||||
# breaks db integrity but without this mysql does not drop table
|
||||
return ['SET FOREIGN_KEY_CHECKS=0;','DROP TABLE %s;' % table,
|
||||
@@ -2641,9 +2654,9 @@ class NewPostgreSQLAdapter(PostgreSQLAdapter):
|
||||
elif not isinstance(obj, (list, tuple)):
|
||||
obj = [obj]
|
||||
if field_is_type('list:string'):
|
||||
obj = [str(item) for item in obj]
|
||||
obj = map(str,obj)
|
||||
else:
|
||||
obj = [int(item) for item in obj]
|
||||
obj = map(int,obj)
|
||||
return 'ARRAY[%s]' % ','.join(repr(item) for item in obj)
|
||||
return BaseAdapter.represent(self, obj, fieldtype)
|
||||
|
||||
@@ -2982,7 +2995,7 @@ class MSSQLAdapter(BaseAdapter):
|
||||
# (in the form of arg1=value1&arg2=value2&...)
|
||||
# Default values (drivers like FreeTDS insist on uppercase parameter keys)
|
||||
argsdict = { 'DRIVER':'{SQL Server}' }
|
||||
urlargs = m.group('urlargs') or ''
|
||||
urlargs = m.group('urlargs') or ''
|
||||
for argmatch in self.REGEX_ARGPATTERN.finditer(urlargs):
|
||||
argsdict[str(argmatch.group('argkey')).upper()] = argmatch.group('argvalue')
|
||||
urlargs = ';'.join(['%s=%s' % (ak, av) for (ak, av) in argsdict.iteritems()])
|
||||
@@ -3007,6 +3020,9 @@ class MSSQLAdapter(BaseAdapter):
|
||||
return rows[minimum:]
|
||||
return rows[minimum:maximum]
|
||||
|
||||
def EPOCH(self, first):
|
||||
return "DATEDIFF(second, '1970-01-01 00:00:00', %s)" % self.expand(first)
|
||||
|
||||
# GIS functions
|
||||
|
||||
# No STAsGeoJSON in MSSQL
|
||||
@@ -3154,7 +3170,7 @@ class SybaseAdapter(MSSQLAdapter):
|
||||
logger.error('NdGpatch error')
|
||||
raise e
|
||||
else:
|
||||
m = self.REGEX_URI.match(uri)
|
||||
m = self.REGEX_URI.match(uri)
|
||||
if not m:
|
||||
raise SyntaxError, \
|
||||
"Invalid URI string in DAL: %s" % self.uri
|
||||
@@ -3226,6 +3242,9 @@ class FireBirdAdapter(BaseAdapter):
|
||||
def RANDOM(self):
|
||||
return 'RAND()'
|
||||
|
||||
def EPOCH(self, first):
|
||||
return "DATEDIFF(second, '1970-01-01 00:00:00', %s)" % self.expand(first)
|
||||
|
||||
def NOT_NULL(self,default,field_type):
|
||||
return 'DEFAULT %s NOT NULL' % self.represent(default,field_type)
|
||||
|
||||
@@ -3250,7 +3269,7 @@ class FireBirdAdapter(BaseAdapter):
|
||||
|
||||
def __init__(self,db,uri,pool_size=0,folder=None,db_codec ='UTF-8',
|
||||
credential_decoder=IDENTITY, driver_args={},
|
||||
adapter_args={}):
|
||||
adapter_args={}):
|
||||
self.db = db
|
||||
self.dbengine = "firebird"
|
||||
self.uri = uri
|
||||
@@ -3281,7 +3300,7 @@ class FireBirdAdapter(BaseAdapter):
|
||||
user = credential_decoder(user),
|
||||
password = credential_decoder(password),
|
||||
charset = charset)
|
||||
|
||||
|
||||
def connect(driver_args=driver_args):
|
||||
return self.driver.connect(**driver_args)
|
||||
self.pool_connection(connect)
|
||||
@@ -3341,7 +3360,7 @@ class FireBirdEmbeddedAdapter(FireBirdAdapter):
|
||||
user=credential_decoder(user),
|
||||
password=credential_decoder(password),
|
||||
charset=charset)
|
||||
|
||||
|
||||
def connect(driver_args=driver_args):
|
||||
return self.driver.connect(**driver_args)
|
||||
self.pool_connection(connect)
|
||||
@@ -4008,8 +4027,8 @@ class GoogleSQLAdapter(UseDatabaseStoredFile,MySQLAdapter):
|
||||
self.execute("SET FOREIGN_KEY_CHECKS=1;")
|
||||
self.execute("SET sql_mode='NO_BACKSLASH_ESCAPES';")
|
||||
|
||||
def execute(self,a):
|
||||
return self.log_execute(a.decode('utf8'))
|
||||
def execute(self, command, *a, **b):
|
||||
return self.log_execute(command.decode('utf8'), *a, **b)
|
||||
|
||||
class NoSQLAdapter(BaseAdapter):
|
||||
can_select_for_update = False
|
||||
@@ -4347,7 +4366,7 @@ class GoogleDatastoreAdapter(NoSQLAdapter):
|
||||
if first.type != 'id':
|
||||
return [GAEF(first.name,'in',self.represent(second,first.type),lambda a,b:a in b)]
|
||||
else:
|
||||
second = [Key.from_path(first._tablename, i) for i in second]
|
||||
second = [Key.from_path(first._tablename, int(i)) for i in second]
|
||||
return [GAEF(first.name,'in',second,lambda a,b:a in b)]
|
||||
|
||||
def CONTAINS(self,first,second):
|
||||
@@ -4389,7 +4408,7 @@ class GoogleDatastoreAdapter(NoSQLAdapter):
|
||||
tablename = self.get_table(query)
|
||||
elif fields:
|
||||
tablename = fields[0].tablename
|
||||
query = fields[0].table._id>0
|
||||
query = fields[0].table._id != None
|
||||
else:
|
||||
raise SyntaxError, "Unable to determine a tablename"
|
||||
|
||||
@@ -4414,7 +4433,7 @@ class GoogleDatastoreAdapter(NoSQLAdapter):
|
||||
else:
|
||||
projection.append(f.name)
|
||||
|
||||
# projection's can't include 'id'.
|
||||
# projection's can't include 'id'.
|
||||
# it will be added to the result later
|
||||
query_projection = [
|
||||
p for p in projection if \
|
||||
@@ -4678,9 +4697,7 @@ class CouchDBAdapter(NoSQLAdapter):
|
||||
def _select(self,query,fields,attributes):
|
||||
if not isinstance(query,Query):
|
||||
raise SyntaxError, "Not Supported"
|
||||
for key in set(attributes.keys())-set(('orderby','groupby','limitby',
|
||||
'required','cache','left',
|
||||
'distinct', 'having', 'processor')):
|
||||
for key in set(attributes.keys())-SELECT_ARGS:
|
||||
raise SyntaxError, 'invalid select attribute: %s' % key
|
||||
new_fields=[]
|
||||
for item in fields:
|
||||
@@ -4912,7 +4929,7 @@ class MongoDBAdapter(NoSQLAdapter):
|
||||
print "in expand and this is a query"
|
||||
# any query using 'id':=
|
||||
# set name as _id (as per pymongo/mongodb primary key)
|
||||
# convert second arg to an objectid field
|
||||
# convert second arg to an objectid field
|
||||
# (if its not already)
|
||||
# if second arg is 0 convert to objectid
|
||||
if isinstance(expression.first,Field) and \
|
||||
@@ -4922,9 +4939,9 @@ class MongoDBAdapter(NoSQLAdapter):
|
||||
not isinstance(expression.second,ObjectId):
|
||||
if isinstance(expression.second,int):
|
||||
try:
|
||||
# Because the reference field is by default
|
||||
# an integer and therefore this must be an
|
||||
# integer to be able to work with other
|
||||
# Because the reference field is by default
|
||||
# an integer and therefore this must be an
|
||||
# integer to be able to work with other
|
||||
# databases
|
||||
expression.second = ObjectId(("%X" % expression.second))
|
||||
except:
|
||||
@@ -5212,27 +5229,27 @@ class MongoDBAdapter(NoSQLAdapter):
|
||||
return result
|
||||
|
||||
def ADD(self, first, second):
|
||||
raise NotImplementedError, "This must yet be replaced with javescript in order to accomplish this. Sorry"
|
||||
raise NotImplementedError, "This must yet be replaced with javascript in order to accomplish this. Sorry"
|
||||
return '%s + %s' % (self.expand(first), self.expand(second, first.type))
|
||||
|
||||
def SUB(self, first, second):
|
||||
raise NotImplementedError, "This must yet be replaced with javescript in order to accomplish this. Sorry"
|
||||
raise NotImplementedError, "This must yet be replaced with javascript in order to accomplish this. Sorry"
|
||||
return '(%s - %s)' % (self.expand(first), self.expand(second, first.type))
|
||||
|
||||
def MUL(self, first, second):
|
||||
raise NotImplementedError, "This must yet be replaced with javescript in order to accomplish this. Sorry"
|
||||
raise NotImplementedError, "This must yet be replaced with javascript in order to accomplish this. Sorry"
|
||||
return '(%s * %s)' % (self.expand(first), self.expand(second, first.type))
|
||||
|
||||
def DIV(self, first, second):
|
||||
raise NotImplementedError, "This must yet be replaced with javescript in order to accomplish this. Sorry"
|
||||
raise NotImplementedError, "This must yet be replaced with javascript in order to accomplish this. Sorry"
|
||||
return '(%s / %s)' % (self.expand(first), self.expand(second, first.type))
|
||||
|
||||
def MOD(self, first, second):
|
||||
raise NotImplementedError, "This must yet be replaced with javescript in order to accomplish this. Sorry"
|
||||
raise NotImplementedError, "This must yet be replaced with javascript in order to accomplish this. Sorry"
|
||||
return '(%s %% %s)' % (self.expand(first), self.expand(second, first.type))
|
||||
|
||||
def AS(self, first, second):
|
||||
raise NotImplementedError, "This must yet be replaced with javescript in order to accomplish this. Sorry"
|
||||
raise NotImplementedError, "This must yet be replaced with javascript in order to accomplish this. Sorry"
|
||||
return '%s AS %s' % (self.expand(first), second)
|
||||
|
||||
#We could implement an option that simulates a full featured SQL database. But I think the option should be set explicit or implemented as another library.
|
||||
@@ -5344,31 +5361,31 @@ class MongoDBAdapter(NoSQLAdapter):
|
||||
|
||||
#TODO javascript has math
|
||||
def ADD(self, first, second):
|
||||
raise NotImplementedError, "This must yet be replaced with javescript in order to accomplish this. Sorry"
|
||||
raise NotImplementedError, "This must yet be replaced with javascript in order to accomplish this. Sorry"
|
||||
return '%s + %s' % (self.expand(first), self.expand(second, first.type))
|
||||
|
||||
#TODO javascript has math
|
||||
def SUB(self, first, second):
|
||||
raise NotImplementedError, "This must yet be replaced with javescript in order to accomplish this. Sorry"
|
||||
raise NotImplementedError, "This must yet be replaced with javascript in order to accomplish this. Sorry"
|
||||
return '(%s - %s)' % (self.expand(first), self.expand(second, first.type))
|
||||
|
||||
#TODO javascript has math
|
||||
def MUL(self, first, second):
|
||||
raise NotImplementedError, "This must yet be replaced with javescript in order to accomplish this. Sorry"
|
||||
raise NotImplementedError, "This must yet be replaced with javascript in order to accomplish this. Sorry"
|
||||
return '(%s * %s)' % (self.expand(first), self.expand(second, first.type))
|
||||
#TODO javascript has math
|
||||
|
||||
def DIV(self, first, second):
|
||||
raise NotImplementedError, "This must yet be replaced with javescript in order to accomplish this. Sorry"
|
||||
raise NotImplementedError, "This must yet be replaced with javascript in order to accomplish this. Sorry"
|
||||
return '(%s / %s)' % (self.expand(first), self.expand(second, first.type))
|
||||
#TODO javascript has math
|
||||
def MOD(self, first, second):
|
||||
raise NotImplementedError, "This must yet be replaced with javescript in order to accomplish this. Sorry"
|
||||
raise NotImplementedError, "This must yet be replaced with javascript in order to accomplish this. Sorry"
|
||||
return '(%s %% %s)' % (self.expand(first), self.expand(second, first.type))
|
||||
|
||||
#TODO javascript can do this
|
||||
def AS(self, first, second):
|
||||
raise NotImplementedError, "This must yet be replaced with javescript in order to accomplish this. Sorry"
|
||||
raise NotImplementedError, "This must yet be replaced with javascript in order to accomplish this. Sorry"
|
||||
return '%s AS %s' % (self.expand(first), second)
|
||||
|
||||
#We could implement an option that simulates a full featured SQL database. But I think the option should be set explicit or implemented as another library.
|
||||
@@ -5487,13 +5504,15 @@ class IMAPAdapter(NoSQLAdapter):
|
||||
# directly with set.update(deleted=True)
|
||||
|
||||
|
||||
# This objects give access
|
||||
# This object give access
|
||||
# to the adapter auto mailbox
|
||||
# mapped names (which native
|
||||
# mailbox has what table name)
|
||||
|
||||
db.mailboxes <dict> # tablename, server native name
|
||||
db.mailbox_names <dict> # server native name, tablename
|
||||
db.mailboxes <dict> # tablename, server native name pairs
|
||||
|
||||
# To retrieve a table native mailbox name use:
|
||||
db.<table>.mailbox
|
||||
|
||||
"""
|
||||
|
||||
@@ -5684,7 +5703,7 @@ class IMAPAdapter(NoSQLAdapter):
|
||||
year = int(date_list[2])
|
||||
month = months.index(date_list[1])
|
||||
day = int(date_list[0])
|
||||
hms = [int(value) for value in date_list[3].split(":")]
|
||||
hms = map(int, date_list[3].split(":"))
|
||||
return datetime.datetime(year, month, day,
|
||||
hms[0], hms[1], hms[2]) + add
|
||||
elif isinstance(date, (datetime.datetime, datetime.date)):
|
||||
@@ -5797,7 +5816,14 @@ class IMAPAdapter(NoSQLAdapter):
|
||||
Field("attachments", "list:string", writable=False, readable=False),
|
||||
)
|
||||
|
||||
return self.connection.mailbox_names
|
||||
# Set a special _mailbox attribute for storing
|
||||
# native mailbox names
|
||||
self.db[mailbox_name].mailbox = \
|
||||
self.connection.mailbox_names[mailbox_name]
|
||||
|
||||
# Set the db instance mailbox collections
|
||||
self.db.mailboxes = self.connection.mailbox_names
|
||||
return self.db.mailboxes
|
||||
|
||||
def create_table(self, *args, **kwargs):
|
||||
# not implemented
|
||||
@@ -6210,7 +6236,11 @@ class IMAPAdapter(NoSQLAdapter):
|
||||
raise Exception("Operation not supported")
|
||||
return result
|
||||
|
||||
def NE(self, first, second):
|
||||
def NE(self, first, second=None):
|
||||
if (second is None) and isinstance(first, Field):
|
||||
# All records special table query
|
||||
if first.type == "id":
|
||||
return self.GE(first, 1)
|
||||
result = self.NOT(self.EQ(first, second))
|
||||
result = result.replace("NOT NOT", "").strip()
|
||||
return result
|
||||
@@ -6361,11 +6391,9 @@ def sqlhtml_validators(field):
|
||||
refs = None
|
||||
db, id = r._db, r._id
|
||||
if isinstance(db._adapter, GoogleDatastoreAdapter):
|
||||
for i in xrange(0, len(ids), 30):
|
||||
if not refs:
|
||||
refs = db(id.belongs(ids[i:i+30])).select(id)
|
||||
else:
|
||||
refs = refs&db(id.belongs(ids[i:i+30])).select(id)
|
||||
def count(values): return db(id.belongs(values)).select(id)
|
||||
rx = range(0, len(ids), 30)
|
||||
refs = reduce(lambda a,b:a&b, [count(ids[i:i+30]) for i in rx])
|
||||
else:
|
||||
refs = db(id.belongs(ids)).select(id)
|
||||
return (refs and ', '.join(str(f(r,x.id)) for x in refs) or '')
|
||||
@@ -6455,7 +6483,7 @@ class Row(object):
|
||||
|
||||
def values(self):
|
||||
return self.__dict__.values()
|
||||
|
||||
|
||||
def __iter__(self):
|
||||
return self.__dict__.__iter__()
|
||||
|
||||
@@ -6648,7 +6676,7 @@ class DAL(object):
|
||||
db.define_table('tablename', Field('fieldname1'),
|
||||
Field('fieldname2'))
|
||||
"""
|
||||
|
||||
|
||||
@staticmethod
|
||||
def set_folder(folder):
|
||||
"""
|
||||
@@ -7133,7 +7161,11 @@ def index():
|
||||
return table
|
||||
|
||||
def __contains__(self, tablename):
|
||||
return tablename in self.tables
|
||||
try:
|
||||
return tablename in self.tables
|
||||
except AttributeError:
|
||||
# The instance has no .tables attribute yet
|
||||
return False
|
||||
|
||||
def get(self,key,default):
|
||||
return self.__dict__.get(key,default)
|
||||
@@ -7171,7 +7203,7 @@ def index():
|
||||
|
||||
def __call__(self, query=None, ignore_common_filters=None):
|
||||
if isinstance(query,Table):
|
||||
query = query._id>0
|
||||
query = query._id != None
|
||||
elif isinstance(query,Field):
|
||||
query = query!=None
|
||||
return Set(self, query, ignore_common_filters=ignore_common_filters)
|
||||
@@ -7211,7 +7243,7 @@ def index():
|
||||
Added 2012-08-24 "fields" and "colnames" optional arguments. If either
|
||||
is provided, the results cursor returned by the DB driver will be
|
||||
converted to a DAL Rows object using the db._adapter.parse() method.
|
||||
|
||||
|
||||
The "fields" argument is a list of DAL Field objects that match the
|
||||
fields returned from the DB. The Field objects should be part of one or
|
||||
more Table objects defined on the DAL object. The "fields" list can
|
||||
@@ -7224,14 +7256,14 @@ def index():
|
||||
can be specified as a list of field names in tablename.fieldname format.
|
||||
Again, these should represent tables and fields defined on the DAL
|
||||
object.
|
||||
|
||||
|
||||
It is also possible to specify both "fields" and the associated
|
||||
"colnames". In that case, "fields" can also include DAL Expression
|
||||
objects in addition to Field objects. For Field objects in "fields",
|
||||
the associated "colnames" must still be in tablename.fieldname format.
|
||||
For Expression objects in "fields", the associated "colnames" can
|
||||
be any arbitrary labels.
|
||||
|
||||
|
||||
Note, the DAL Table objects referred to by "fields" or "colnames" can
|
||||
be dummy tables and do not have to represent any real tables in the
|
||||
database. Also, note that the "fields" and "colnames" must be in the
|
||||
@@ -7390,7 +7422,7 @@ class Table(object):
|
||||
db.users.insert(name='me') # print db.users._insert(...) to see SQL
|
||||
db.users.drop()
|
||||
"""
|
||||
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
db,
|
||||
@@ -7472,13 +7504,15 @@ class Table(object):
|
||||
fields = list(fields)
|
||||
|
||||
if db and db._adapter.uploads_in_blob==True:
|
||||
uploadfields = [f.name for f in fields if f.type=='blob']
|
||||
for field in fields:
|
||||
fn = field.uploadfield
|
||||
if isinstance(field, Field) and field.type == 'upload'\
|
||||
and field.uploadfield is True:
|
||||
tmp = field.uploadfield = '%s_blob' % field.name
|
||||
if isinstance(field.uploadfield,str) and \
|
||||
not [f for f in fields if f.name==field.uploadfield]:
|
||||
fields.append(Field(field.uploadfield,'blob',default=''))
|
||||
and fn is True:
|
||||
fn = field.uploadfield = '%s_blob' % field.name
|
||||
if isinstance(fn,str) and not fn in uploadfields:
|
||||
fields.append(Field(fn,'blob',default='',
|
||||
writable=False,readable=False))
|
||||
|
||||
lower_fieldnames = set()
|
||||
reserved = dir(Table) + ['fields']
|
||||
@@ -8073,6 +8107,10 @@ class Expression(object):
|
||||
db = self.db
|
||||
return Expression(db, db._adapter.EXTRACT, self, 'second', 'integer')
|
||||
|
||||
def epoch(self):
|
||||
db = self.db
|
||||
return Expression(db, db._adapter.EPOCH, self, None, 'integer')
|
||||
|
||||
def __getslice__(self, start, stop):
|
||||
db = self.db
|
||||
if start < 0:
|
||||
@@ -8213,7 +8251,7 @@ class Expression(object):
|
||||
|
||||
def st_asgeojson(self, precision=15, options=0, version=1):
|
||||
return Expression(self.db, self.db._adapter.ST_ASGEOJSON, self,
|
||||
dict(precision=precision, options=options,
|
||||
dict(precision=precision, options=options,
|
||||
version=version), 'dict')
|
||||
|
||||
def st_astext(self):
|
||||
@@ -8462,7 +8500,7 @@ class Field(Expression):
|
||||
elif not filename:
|
||||
filename = file.name
|
||||
filename = os.path.basename(filename.replace('/', os.sep)\
|
||||
.replace('\\', os.sep))
|
||||
.replace('\\', os.sep))
|
||||
m = REGEX_STORE_PATTERN.search(filename)
|
||||
extension = m and m.group('e') or 'txt'
|
||||
uuid_key = web2py_uuid().replace('-', '')[-16:]
|
||||
@@ -8700,7 +8738,7 @@ class Set(object):
|
||||
|
||||
def __call__(self, query, ignore_common_filters=False):
|
||||
if isinstance(query,Table):
|
||||
query = query._id>0
|
||||
query = query._id != None
|
||||
elif isinstance(query,str):
|
||||
query = Expression(self.db,query)
|
||||
elif isinstance(query,Field):
|
||||
@@ -8717,7 +8755,12 @@ class Set(object):
|
||||
|
||||
def _select(self, *fields, **attributes):
|
||||
adapter = self.db._adapter
|
||||
fields = adapter.expand_all(fields, adapter.tables(self.query))
|
||||
tablenames = adapter.tables(self.query,
|
||||
attributes.get('join',None),
|
||||
attributes.get('left',None),
|
||||
attributes.get('orderby',None),
|
||||
attributes.get('groupby',None))
|
||||
fields = adapter.expand_all(fields, tablenames)
|
||||
return adapter._select(self.query,fields,attributes)
|
||||
|
||||
def _delete(self):
|
||||
@@ -8745,14 +8788,17 @@ class Set(object):
|
||||
key,
|
||||
(lambda self=self,distinct=distinct: \
|
||||
db._adapter.count(self.query,distinct)),
|
||||
time_expire)
|
||||
time_expire)
|
||||
return db._adapter.count(self.query,distinct)
|
||||
|
||||
def select(self, *fields, **attributes):
|
||||
if self.query is None:# and fields[0]._table._common_filter != None:
|
||||
return self(fields[0]._table).select(*fields,**attributes)
|
||||
adapter = self.db._adapter
|
||||
fields = adapter.expand_all(fields, adapter.tables(self.query))
|
||||
tablenames = adapter.tables(self.query,
|
||||
attributes.get('join',None),
|
||||
attributes.get('left',None),
|
||||
attributes.get('orderby',None),
|
||||
attributes.get('groupby',None))
|
||||
fields = adapter.expand_all(fields, tablenames)
|
||||
return adapter.select(self.query,fields,attributes)
|
||||
|
||||
def nested_select(self,*fields,**attributes):
|
||||
@@ -8860,7 +8906,7 @@ class RecordUpdater(object):
|
||||
self.colset, self.table, self.id = colset, table, id
|
||||
|
||||
def __call__(self, **fields):
|
||||
colset, table, id = self.colset, self.table, self.id
|
||||
colset, table, id = self.colset, self.table, self.id
|
||||
newfields = fields or dict(colset)
|
||||
for fieldname in newfields.keys():
|
||||
if not fieldname in table.fields or table[fieldname].type=='id':
|
||||
@@ -9182,7 +9228,7 @@ class Rows(object):
|
||||
def xml(self,strict=False,row_name='row',rows_name='rows'):
|
||||
"""
|
||||
serializes the table using sqlhtml.SQLTABLE (if present)
|
||||
"""
|
||||
"""
|
||||
if strict:
|
||||
ncols = len(self.colnames)
|
||||
def f(row,field,indent=' '):
|
||||
|
||||
+12
-9
@@ -51,6 +51,7 @@ except ImportError:
|
||||
have_minify = False
|
||||
|
||||
regex_session_id = re.compile('^([\w\-]+/)?[\w\-\.]+$')
|
||||
regex_nopasswd = re.compile('(?<=\:)([^:@/]+)(?=@.+)')
|
||||
|
||||
__all__ = ['Request', 'Response', 'Session']
|
||||
|
||||
@@ -230,7 +231,6 @@ class Response(Storage):
|
||||
|
||||
def include_files(self):
|
||||
|
||||
|
||||
"""
|
||||
Caching method for writing out files.
|
||||
By default, caches in ram for 5 minutes. To change,
|
||||
@@ -244,8 +244,9 @@ class Response(Storage):
|
||||
if not item in files: files.append(item)
|
||||
if have_minify and (self.optimize_css or self.optimize_js):
|
||||
# cache for 5 minutes by default
|
||||
key = hashlib.md5(repr(files)).hexdigest()
|
||||
cache = self.cache_includes or (current.cache.ram, 60*5)
|
||||
def call_minify():
|
||||
def call_minify(files=files):
|
||||
return minify.minify(files,
|
||||
URL('static','temp'),
|
||||
current.request.folder,
|
||||
@@ -253,7 +254,7 @@ class Response(Storage):
|
||||
self.optimize_js)
|
||||
if cache:
|
||||
cache_model, time_expire = cache
|
||||
files = cache_model('response.files.minified',
|
||||
files = cache_model('response.files.minified/'+key,
|
||||
call_minify,
|
||||
time_expire)
|
||||
else:
|
||||
@@ -278,7 +279,7 @@ class Response(Storage):
|
||||
chunk_size = DEFAULT_CHUNK_SIZE,
|
||||
request=None,
|
||||
attachment=False,
|
||||
filename=None
|
||||
filename=None,
|
||||
):
|
||||
"""
|
||||
if a controller function::
|
||||
@@ -410,11 +411,13 @@ class Response(Storage):
|
||||
dbstats = [TABLE(*[TR(PRE(row[0]),'%.2fms' % (row[1]*1000)) \
|
||||
for row in i.db._timings]) \
|
||||
for i in thread.instances]
|
||||
dbtables = dict([(i.uri, {'defined': sorted(list(set(i.db.tables) -
|
||||
set(i.db._LAZY_TABLES.keys()))) or
|
||||
'[no defined tables]',
|
||||
'lazy': sorted(i.db._LAZY_TABLES.keys()) or
|
||||
'[no lazy tables]'})
|
||||
dbtables = dict([(regex_nopasswd.sub('******',i.uri),
|
||||
{'defined':
|
||||
sorted(list(set(i.db.tables) -
|
||||
set(i.db._LAZY_TABLES.keys()))) or
|
||||
'[no defined tables]',
|
||||
'lazy': sorted(i.db._LAZY_TABLES.keys()) or
|
||||
'[no lazy tables]'})
|
||||
for i in thread.instances])
|
||||
else:
|
||||
dbstats = [] # if no db or on GAE
|
||||
|
||||
+12
-7
@@ -243,7 +243,8 @@ def URL(
|
||||
elif a and c and not f: (c,f,a)=(a,c,f)
|
||||
from globals import current
|
||||
if hasattr(current,'request'):
|
||||
r = current.request
|
||||
r = current.request
|
||||
|
||||
if r:
|
||||
application = r.application
|
||||
controller = r.controller
|
||||
@@ -296,10 +297,10 @@ def URL(
|
||||
if other.endswith('/'):
|
||||
other += '/' # add trailing slash to make last trailing empty arg explicit
|
||||
|
||||
if '_signature' in vars:
|
||||
vars.pop('_signature')
|
||||
list_vars = []
|
||||
for (key, vals) in sorted(vars.items()):
|
||||
if key == '_signature':
|
||||
continue
|
||||
if not isinstance(vals, (list, tuple)):
|
||||
vals = [vals]
|
||||
for val in vals:
|
||||
@@ -347,7 +348,8 @@ def URL(
|
||||
|
||||
if regex_crlf.search(join([application, controller, function, other])):
|
||||
raise SyntaxError, 'CRLF Injection Detected'
|
||||
url = url_out(r, env, application, controller, function,
|
||||
|
||||
url = url_out(r,env, application, controller, function,
|
||||
args, other, scheme, host, port)
|
||||
return url
|
||||
|
||||
@@ -1743,7 +1745,7 @@ class INPUT(DIV):
|
||||
elif not t == 'submit':
|
||||
if value is None:
|
||||
self['value'] = _value
|
||||
else:
|
||||
elif not isinstance(value,list):
|
||||
self['_value'] = value
|
||||
|
||||
def xml(self):
|
||||
@@ -2109,8 +2111,10 @@ class FORM(DIV):
|
||||
REDIRECT_JS = "window.location='%s';return false"
|
||||
|
||||
def add_button(self,value,url,_class=None):
|
||||
self[0][-1][1].append(INPUT(_type="button",_value=value,_class=_class,
|
||||
_onclick=self.REDIRECT_JS % url))
|
||||
submit = self.element('input[type=submit]')
|
||||
submit.parent.append(
|
||||
INPUT(_type="button",_value=value,_class=_class,
|
||||
_onclick=self.REDIRECT_JS % url))
|
||||
|
||||
|
||||
|
||||
@@ -2227,6 +2231,7 @@ class MENU(DIV):
|
||||
def __init__(self, data, **args):
|
||||
self.data = data
|
||||
self.attributes = args
|
||||
self.components = []
|
||||
if not '_class' in self.attributes:
|
||||
self['_class'] = 'web2py-menu web2py-menu-vertical'
|
||||
if not 'ul_class' in self.attributes:
|
||||
|
||||
+4
-4
@@ -89,21 +89,21 @@ class HTTP(BaseException):
|
||||
status = str(status)
|
||||
if not regex_status.match(status):
|
||||
status = '500 %s' % (defined_status[500])
|
||||
if not 'Content-Type' in headers:
|
||||
headers['Content-Type'] = 'text/html; charset=UTF-8'
|
||||
headers.setdefault('Content-Type','text/html; charset=UTF-8')
|
||||
body = self.body
|
||||
if status[:1] == '4':
|
||||
if not body:
|
||||
body = status
|
||||
if isinstance(body, str):
|
||||
if len(body)<512 and headers['Content-Type'].startswith('text/html'):
|
||||
if len(body)<512 and \
|
||||
headers['Content-Type'].startswith('text/html'):
|
||||
body += '<!-- %s //-->' % ('x'*512) ### trick IE
|
||||
headers['Content-Length'] = len(body)
|
||||
rheaders = []
|
||||
for k, v in headers.iteritems():
|
||||
if isinstance(v, list):
|
||||
rheaders += [(k, str(item)) for item in v]
|
||||
else:
|
||||
elif not v is None:
|
||||
rheaders.append((k, str(v)))
|
||||
responder(status, rheaders)
|
||||
if env.get('request_method','')=='HEAD':
|
||||
|
||||
+299
-246
@@ -29,15 +29,16 @@ from string import maketrans
|
||||
|
||||
__all__ = ['translator', 'findT', 'update_all_languages']
|
||||
|
||||
ospath = os.path
|
||||
ostat = os.stat
|
||||
osep = os.sep
|
||||
oslistdir = os.listdir
|
||||
pjoin = os.path.join
|
||||
pexists = os.path.exists
|
||||
pdirname = os.path.dirname
|
||||
isdir = os.path.isdir
|
||||
is_gae = settings.global_settings.web2py_runtime_gae
|
||||
|
||||
DEFAULT_LANGUAGE = 'en'
|
||||
DEFAULT_LANGUAGE_NAME = 'English'
|
||||
|
||||
# DEFAULT PLURAL-FORMS RULES:
|
||||
# language doesn't use plural forms
|
||||
@@ -45,23 +46,7 @@ DEFAULT_NPLURALS = 1
|
||||
# only one singular/plural form is used
|
||||
DEFAULT_GET_PLURAL_ID = lambda n: 0
|
||||
# word is unchangeable
|
||||
DEFAULT_CONSTRUCTOR_PLURAL_FORM = lambda word, plural_id: word
|
||||
|
||||
def safe_eval(text):
|
||||
if text.strip():
|
||||
try:
|
||||
import ast
|
||||
return ast.literal_eval(text)
|
||||
except ImportError:
|
||||
return eval(text,{},{})
|
||||
return None
|
||||
|
||||
# used as default filter in translator.M()
|
||||
def markmin_aux(m):
|
||||
return '{%s}' % markmin_escape(m.group('s'))
|
||||
def markmin(s):
|
||||
return render(regex_param.sub(markmin_aux,s),
|
||||
sep='br', autolinks=None, id_prefix='')
|
||||
DEFAULT_CONSTRUCT_PLURAL_FORM = lambda word, plural_id: word
|
||||
|
||||
NUMBERS = (int,long,float)
|
||||
|
||||
@@ -75,14 +60,30 @@ regex_translate = re.compile(PY_STRING_LITERAL_RE, re.DOTALL)
|
||||
regex_param=re.compile(r'{(?P<s>.+?)}')
|
||||
|
||||
# pattern for a valid accept_language
|
||||
|
||||
regex_language = \
|
||||
re.compile('^([a-zA-Z]{2})(\-[a-zA-Z]{2})?(\-[a-zA-Z]+)?$')
|
||||
regex_langfile = re.compile('^[a-zA-Z]{2}(-[a-zA-Z]{2})?\.py$')
|
||||
re.compile('([a-z]{2}(?:\-[a-z]{2})?(?:\-[a-z]{2})?)(?:[,;]|$)')
|
||||
regex_langfile = re.compile('^[a-z]{2}(-[a-z]{2})?\.py$')
|
||||
regex_backslash = re.compile(r"\\([\\{}%])")
|
||||
regex_plural = re.compile('%({.+?})')
|
||||
regex_plural_dict = re.compile('^{(?P<w>[^()[\]][^()[\]]*?)\((?P<n>[^()\[\]]+)\)}$') # %%{word(varname or number)}
|
||||
regex_plural_tuple = re.compile('^{(?P<w>[^[\]()]+)(?:\[(?P<i>\d+)\])?}$') # %%{word[index]} or %%{word}
|
||||
regex_plural_file = re.compile('^plural-[a-zA-Z]{2}(-[a-zA-Z]{2})?\.py$')
|
||||
|
||||
def safe_eval(text):
|
||||
if text.strip():
|
||||
try:
|
||||
import ast
|
||||
return ast.literal_eval(text)
|
||||
except ImportError:
|
||||
return eval(text,{},{})
|
||||
return None
|
||||
|
||||
# used as default filter in translator.M()
|
||||
def markmin(s):
|
||||
def markmin_aux(m):
|
||||
return '{%s}' % markmin_escape(m.group('s'))
|
||||
return render(regex_param.sub(markmin_aux,s),
|
||||
sep='br', autolinks=None, id_prefix='')
|
||||
|
||||
# UTF8 helper functions
|
||||
def upper_fun(s):
|
||||
@@ -90,7 +91,7 @@ def upper_fun(s):
|
||||
def title_fun(s):
|
||||
return unicode(s,'utf-8').title().encode('utf-8')
|
||||
def cap_fun(s):
|
||||
return lambda s: unicode(s,'utf-8').capitalize().encode('utf-8')
|
||||
return unicode(s,'utf-8').capitalize().encode('utf-8')
|
||||
ttab_in = maketrans("\\%{}", '\x1c\x1d\x1e\x1f')
|
||||
ttab_out = maketrans('\x1c\x1d\x1e\x1f', "\\%{}")
|
||||
|
||||
@@ -132,38 +133,6 @@ def clear_cache(filename):
|
||||
finally:
|
||||
lock.release()
|
||||
|
||||
def lang_sampling(lang_tuple, langlist):
|
||||
"""
|
||||
search *lang_tuple* in *langlist*
|
||||
|
||||
Args:
|
||||
lang_tuple (tuple of strings): ('aa'[[,'-bb'],'-cc'])
|
||||
langlist (list of strings): [available languages]
|
||||
|
||||
Returns:
|
||||
language from langlist or None
|
||||
"""
|
||||
# step 1:
|
||||
# compare "aa-bb-cc" | "aa-bb" | "aa" from lang_tuple
|
||||
# with strings from langlist. Return appropriate string
|
||||
# from langlist:
|
||||
tries = range(len(lang_tuple),0,-1)
|
||||
for i in tries:
|
||||
language="".join(lang_tuple[:i])
|
||||
if language in langlist:
|
||||
return language
|
||||
# step 2 (if not found in step 1):
|
||||
# compare "aa-bb-cc" | "aa-bb" | "aa" from lang_tuple
|
||||
# with left part of a string from langlist. Return
|
||||
# appropriate string from langlist
|
||||
for i in tries:
|
||||
lang="".join(lang_tuple[:i])
|
||||
for language in langlist:
|
||||
if language.startswith(lang):
|
||||
return language
|
||||
return None
|
||||
|
||||
|
||||
def read_dict_aux(filename):
|
||||
lang_text = portalocker.read_locked(filename).replace('\r\n', '\n')
|
||||
clear_cache(filename)
|
||||
@@ -175,57 +144,24 @@ def read_dict_aux(filename):
|
||||
return {'__corrupted__':status}
|
||||
|
||||
def read_dict(filename):
|
||||
"""
|
||||
return dictionary with translation messages
|
||||
""" return dictionary with translation messages
|
||||
"""
|
||||
return getcfs('lang:'+filename, filename,
|
||||
lambda: read_dict_aux(filename))
|
||||
|
||||
|
||||
def get_lang_info(lang, langdir):
|
||||
"""
|
||||
retrieve lang information from *langdir*/*lang*.py file.
|
||||
Read few strings from lang.py file until keys !langname!,
|
||||
!langcode! or keys greater then '!*' were found
|
||||
|
||||
args:
|
||||
lang (str): lang-code or 'default'
|
||||
langdir (str): path to 'languages' directory in web2py app dir
|
||||
|
||||
returns:
|
||||
tuple(langcode, langname, langfile_mtime)
|
||||
e.g.: ('en', 'English', 1338549043.0)
|
||||
"""
|
||||
filename = ospath.join(langdir, lang+'.py')
|
||||
d = read_dict(filename)
|
||||
langcode = d.get('!langcode!',DEFAULT_LANGUAGE)
|
||||
langname = d.get('!langname!',langcode)
|
||||
return (langcode, langname or langcode, ostat(filename).st_mtime)
|
||||
|
||||
def read_possible_languages(appdir):
|
||||
langs = {}
|
||||
# scan languages directory for langfiles:
|
||||
langdir = ospath.join(appdir,'languages')
|
||||
for filename in os.listdir(langdir):
|
||||
if regex_langfile.match(filename) or filename=='default.py':
|
||||
lang = filename[:-3]
|
||||
langs[lang] = get_lang_info(lang, langdir)
|
||||
if not 'en' in langs:
|
||||
# if default.py is not found, add default value:
|
||||
langs['en'] = ('en', 'English', 0)
|
||||
return langs
|
||||
|
||||
def read_possible_plurals():
|
||||
def read_possible_plural_rules():
|
||||
"""
|
||||
create list of all possible plural rules files
|
||||
result is cached to increase speed
|
||||
result is cached in PLURAL_RULES dictionary to increase speed
|
||||
"""
|
||||
plurals = {}
|
||||
try:
|
||||
import contrib.plural_rules as package
|
||||
import gluon.contrib.plural_rules as package
|
||||
plurals = {}
|
||||
for importer, modname, ispkg in pkgutil.iter_modules(package.__path__):
|
||||
if len(modname)==2:
|
||||
module = __import__(package.__name__+'.'+modname)
|
||||
module = __import__(package.__name__+'.'+modname,
|
||||
fromlist=[modname])
|
||||
lang = modname
|
||||
pname = modname+'.py'
|
||||
nplurals = getattr(module,'nplurals', DEFAULT_NPLURALS)
|
||||
@@ -234,19 +170,84 @@ def read_possible_plurals():
|
||||
DEFAULT_GET_PLURAL_ID)
|
||||
construct_plural_form = getattr(
|
||||
module,'construct_plural_form',
|
||||
DEFAULT_CONSTRUCTOR_PLURAL_FORM)
|
||||
DEFAULT_CONSTRUCT_PLURAL_FORM)
|
||||
plurals[lang] = (lang, nplurals, get_plural_id,
|
||||
construct_plural_form, pname)
|
||||
except ImportError:
|
||||
logging.warn('Unable to import plural rules')
|
||||
plurals['default'] = ('default',
|
||||
DEFAULT_NPLURALS,
|
||||
DEFAULT_GET_PLURAL_ID,
|
||||
DEFAULT_CONSTRUCTOR_PLURAL_FORM,
|
||||
None)
|
||||
construct_plural_form)
|
||||
except ImportError, e:
|
||||
logging.warn('Unable to import plural rules: %s' % e)
|
||||
return plurals
|
||||
|
||||
PLURAL_RULES = read_possible_plurals()
|
||||
PLURAL_RULES = read_possible_plural_rules()
|
||||
|
||||
def read_possible_languages_aux(langdir):
|
||||
def get_lang_struct(lang, langcode, langname, langfile_mtime):
|
||||
if lang == 'default':
|
||||
real_lang = langcode.lower()
|
||||
else:
|
||||
real_lang = lang
|
||||
(prules_langcode,
|
||||
nplurals,
|
||||
get_plural_id,
|
||||
construct_plural_form
|
||||
) = PLURAL_RULES.get(real_lang[:2],('default',
|
||||
DEFAULT_NPLURALS,
|
||||
DEFAULT_GET_PLURAL_ID,
|
||||
DEFAULT_CONSTRUCT_PLURAL_FORM))
|
||||
if prules_langcode != 'default':
|
||||
(pluraldict_fname,
|
||||
pluraldict_mtime) = plurals.get(real_lang,
|
||||
plurals.get(real_lang[:2],
|
||||
('plural-%s.py'%real_lang,0)))
|
||||
else:
|
||||
pluraldict_fname = None
|
||||
pluraldict_mtime = 0
|
||||
return (langcode, # language code from !langcode!
|
||||
langname, # language name in national spelling from !langname!
|
||||
langfile_mtime, # m_time of language file
|
||||
pluraldict_fname,# name of plural dictionary file or None (when default.py is not exist)
|
||||
pluraldict_mtime,# m_time of plural dictionary file or 0 if file is not exist
|
||||
prules_langcode, # code of plural rules language or 'default'
|
||||
nplurals, # nplurals for current language
|
||||
get_plural_id, # get_plural_id() for current language
|
||||
construct_plural_form) # construct_plural_form() for current language
|
||||
|
||||
plurals = {}
|
||||
flist = oslistdir(langdir)
|
||||
# scan languages directory for plural dict files:
|
||||
for pname in flist:
|
||||
if regex_plural_file.match(pname):
|
||||
plurals[pname[7:-3]] = (pname,
|
||||
ostat(pjoin(langdir,pname)).st_mtime)
|
||||
langs = {}
|
||||
# scan languages directory for langfiles:
|
||||
for fname in flist:
|
||||
if regex_langfile.match(fname) or fname == 'default.py':
|
||||
fname_with_path = pjoin(langdir,fname)
|
||||
d = read_dict(fname_with_path)
|
||||
lang = fname[:-3]
|
||||
langcode = d.get('!langcode!', lang if lang != 'default'
|
||||
else DEFAULT_LANGUAGE)
|
||||
langname = d.get('!langname!',langcode)
|
||||
langfile_mtime = ostat(fname_with_path).st_mtime
|
||||
langs[lang] = get_lang_struct(lang, langcode,
|
||||
langname, langfile_mtime)
|
||||
if 'default' not in langs:
|
||||
# if default.py is not found,
|
||||
# add DEFAULT_LANGUAGE as default language:
|
||||
langs['default'] = get_lang_struct('default', DEFAULT_LANGUAGE,
|
||||
DEFAULT_LANGUAGE_NAME, 0)
|
||||
deflang = langs['default']
|
||||
deflangcode = deflang[0]
|
||||
if deflangcode not in langs:
|
||||
# create language from default.py:
|
||||
langs[deflangcode] = deflang[:2]+(0,)+deflang[3:]
|
||||
|
||||
return langs
|
||||
|
||||
def read_possible_languages(appdir):
|
||||
langdir = pjoin(appdir,'languages')
|
||||
return getcfs('langs:'+langdir, langdir,
|
||||
lambda: read_possible_languages_aux(langdir))
|
||||
|
||||
def read_plural_dict_aux(filename):
|
||||
lang_text = portalocker.read_locked(filename).replace('\r\n', '\n')
|
||||
@@ -401,42 +402,81 @@ class translator(object):
|
||||
T(\"Hello World\") # translates \"Hello World\" using the selected file
|
||||
|
||||
notice 1: there is no need to force since, by default, T uses
|
||||
http_accept_language to determine a translation file.
|
||||
http_accept_language to determine a translation file.
|
||||
notice 2:
|
||||
en and en-en are considered different languages!
|
||||
notice 3:
|
||||
if language xx-yy is not found force() probes other similar
|
||||
languages using such algorithm:
|
||||
languages using such algorithm:
|
||||
xx-yy.py -> xx.py -> xx-yy*.py -> xx*.py
|
||||
"""
|
||||
|
||||
def __init__(self, request):
|
||||
self.request = request
|
||||
self.folder = request.folder
|
||||
self.langpath = ospath.join(self.folder,'languages')
|
||||
self.filenames = set(os.listdir(self.langpath))
|
||||
self.langpath = pjoin(self.folder, 'languages')
|
||||
self.http_accept_language = request.env.http_accept_language
|
||||
# self.cache # filled in self.force()
|
||||
# self.accepted_language = None # filled in self.force()
|
||||
# self.language_file = None # filled in self.force()
|
||||
# self.plural_language = None # filled in self.force()
|
||||
# self.nplurals = None # filled in self.force()
|
||||
# self.get_plural_id = None # filled in self.force()
|
||||
# self.construct_plural_form = None # filled in self.force()
|
||||
# self.plural_rules_file = None # filled in self.force()
|
||||
# self.plural_file = None # filled in self.force()
|
||||
# self.plural_dict = None # filled in self.force()
|
||||
# self.plural_status = None # filled in self.force()
|
||||
self.requested_languages = \
|
||||
self.force(self.http_accept_language)
|
||||
# filled in self.force():
|
||||
#------------------------
|
||||
# self.cache
|
||||
# self.accepted_language
|
||||
# self.language_file
|
||||
# self.plural_language
|
||||
# self.nplurals
|
||||
# self.get_plural_id
|
||||
# self.construct_plural_form
|
||||
# self.plural_file
|
||||
# self.plural_dict
|
||||
# self.requested_languages
|
||||
#----------------------------------------
|
||||
# filled in self.set_current_languages():
|
||||
#----------------------------------------
|
||||
# self.default_language_file
|
||||
# self.default_t
|
||||
# self.current_languages
|
||||
self.set_current_languages()
|
||||
self.lazy = True
|
||||
self.otherTs = {}
|
||||
self.filter = markmin
|
||||
self.ftag = 'markmin'
|
||||
|
||||
def get_possible_languages_info(self, lang=None):
|
||||
"""
|
||||
return info for selected language or dictionary with all
|
||||
possible languages info from APP/languages/*.py
|
||||
args:
|
||||
*lang* (str): language
|
||||
returns:
|
||||
if *lang* is defined:
|
||||
return tuple(langcode, langname, langfile_mtime,
|
||||
pluraldict_fname, pluraldict_mtime,
|
||||
prules_langcode, nplurals,
|
||||
get_plural_id, construct_plural_form)
|
||||
or None
|
||||
|
||||
if *lang* is NOT defined:
|
||||
returns dictionary with all possible languages:
|
||||
{ langcode(from filename):
|
||||
( langcode, # language code from !langcode!
|
||||
langname, # language name in national spelling from !langname!
|
||||
langfile_mtime, # m_time of language file
|
||||
pluraldict_fname,# name of plural dictionary file or None (when default.py is not exist)
|
||||
pluraldict_mtime,# m_time of plural dictionary file or 0 if file is not exist
|
||||
prules_langcode, # code of plural rules language or 'default'
|
||||
nplurals, # nplurals for current language
|
||||
get_plural_id, # get_plural_id() for current language
|
||||
construct_plural_form) # construct_plural_form() for current language
|
||||
}
|
||||
"""
|
||||
info = read_possible_languages(self.folder)
|
||||
if lang: info = info.get(lang)
|
||||
return info
|
||||
|
||||
def get_possible_languages(self):
|
||||
return [lang[:-3] for lang in self.filenames \
|
||||
if regex_langfile.match(lang)]
|
||||
""" get list of all possible languages for current applications """
|
||||
return list(set(self.current_languages +
|
||||
[lang for lang in read_possible_languages(self.folder).iterkeys()
|
||||
if lang != 'default']))
|
||||
|
||||
def set_current_languages(self, *languages):
|
||||
"""
|
||||
@@ -447,38 +487,30 @@ class translator(object):
|
||||
if len(languages) == 1 and isinstance(
|
||||
languages[0], (tuple, list)):
|
||||
languages = languages[0]
|
||||
self.current_languages = languages
|
||||
if not languages or languages[0] is None:
|
||||
# set default language from default.py/DEFAULT_LANGUAGE
|
||||
pl_info = self.get_possible_languages_info('default')
|
||||
if pl_info[2]==0: # langfile_mtime
|
||||
# if languages/default.py is not found
|
||||
self.default_language_file = self.langpath
|
||||
self.default_t = {}
|
||||
self.current_languages = [DEFAULT_LANGUAGE]
|
||||
else:
|
||||
self.default_language_file = pjoin(self.langpath,
|
||||
'default.py')
|
||||
self.default_t = read_dict(self.default_language_file)
|
||||
self.current_languages = [pl_info[0]] # !langcode!
|
||||
else:
|
||||
self.current_languages = list(languages)
|
||||
self.force(self.http_accept_language)
|
||||
|
||||
def set_plural(self, language):
|
||||
"""
|
||||
initialize plural forms subsystem
|
||||
invoked from self.force()
|
||||
"""
|
||||
lang = language[:2]
|
||||
(self.plural_language,
|
||||
self.nplurals,
|
||||
self.get_plural_id,
|
||||
self.construct_plural_form,
|
||||
self.plural_filename
|
||||
) = PLURAL_RULES.get(language,PLURAL_RULES['default'])
|
||||
for lang in (language, language[:5], language[:2]):
|
||||
filename = 'plural-%s.py' % lang
|
||||
if filename in self.filenames:
|
||||
self.plural_file = ospath.join(self.langpath,filename)
|
||||
self.plural_dict = read_plural_dict(self.plural_file)
|
||||
break
|
||||
else:
|
||||
self.plural_file = None
|
||||
self.plural_dict = {}
|
||||
|
||||
|
||||
def plural(self, word, n):
|
||||
"""
|
||||
get plural form of word for number *n*
|
||||
NOTE: *word* MUST be defined in current language
|
||||
""" get plural form of word for number *n*
|
||||
NOTE: *word" MUST be defined in current language
|
||||
(T.accepted_language)
|
||||
|
||||
invoked from T()/M() in %%{} tag
|
||||
invoked from T()/T.M() in %%{} tag
|
||||
args:
|
||||
word (str): word in singular
|
||||
n (numeric): number plural form created for
|
||||
@@ -486,51 +518,34 @@ class translator(object):
|
||||
returns:
|
||||
(str): word in appropriate singular/plural form
|
||||
"""
|
||||
nplurals = self.nplurals
|
||||
if int(n)==1:
|
||||
if int(n) == 1:
|
||||
return word
|
||||
elif word:
|
||||
id = self.get_plural_id(abs(int(n)))
|
||||
# id = 0 first plural form
|
||||
# id = 1 second plural form
|
||||
# id = 0 singular form
|
||||
# id = 1 first plural form
|
||||
# id = 2 second plural form
|
||||
# etc.
|
||||
forms = self.plural_dict.get(word, [])
|
||||
if len(forms)>=id:
|
||||
# have this plural form
|
||||
return forms[id-1]
|
||||
else:
|
||||
# guessing this plural form
|
||||
forms += ['']*(nplurals-len(forms)-1)
|
||||
form = self.construct_plural_form(word, id)
|
||||
forms[id-1] = form
|
||||
self.plural_dict[word] = forms
|
||||
if self.plural_file and not is_gae:
|
||||
write_plural_dict(self.plural_file,
|
||||
self.plural_dict)
|
||||
return form
|
||||
|
||||
def get_possible_languages_info(self, lang=None):
|
||||
"""
|
||||
return info for selected language or dictionary with all
|
||||
possible languages info from APP/languages/*.py
|
||||
args:
|
||||
*lang* (str): language
|
||||
returns:
|
||||
if *lang* is defined:
|
||||
return tuple(langcode, langname, langfile_mtime) or None
|
||||
|
||||
if *lang* is NOT defined:
|
||||
returns dictionary with all possible languages:
|
||||
{ langcode(from filename): ( langcode(from !langcode! key),
|
||||
langname(from !langname! key),
|
||||
langfile_mtime ) }
|
||||
"""
|
||||
info = read_possible_languages(self.folder)
|
||||
if lang: info = info.get(lang)
|
||||
return info
|
||||
if id != 0:
|
||||
forms = self.plural_dict.get(word, [])
|
||||
if len(forms)>=id:
|
||||
# have this plural form:
|
||||
return forms[id-1]
|
||||
else:
|
||||
# guessing this plural form
|
||||
forms += ['']*(self.nplurals-len(forms)-1)
|
||||
form = self.construct_plural_form(word, id)
|
||||
forms[id-1] = form
|
||||
self.plural_dict[word] = forms
|
||||
if self.plural_file and not is_gae:
|
||||
write_plural_dict(self.plural_file,
|
||||
self.plural_dict)
|
||||
return form
|
||||
return word
|
||||
|
||||
def force(self, *languages):
|
||||
"""
|
||||
|
||||
select language(s) for translation
|
||||
|
||||
if a list of languages is passed as a parameter,
|
||||
@@ -541,41 +556,76 @@ class translator(object):
|
||||
default language will be selected if none
|
||||
of them matches possible_languages.
|
||||
"""
|
||||
pl_info = read_possible_languages(self.folder)
|
||||
def set_plural(language):
|
||||
"""
|
||||
initialize plural forms subsystem
|
||||
"""
|
||||
lang_info = pl_info.get(language)
|
||||
if lang_info:
|
||||
(pname,
|
||||
pmtime,
|
||||
self.plural_language,
|
||||
self.nplurals,
|
||||
self.get_plural_id,
|
||||
self.construct_plural_form
|
||||
) = lang_info[3:]
|
||||
pdict = {}
|
||||
if pname:
|
||||
pname = pjoin(self.langpath, pname)
|
||||
if pmtime != 0:
|
||||
pdict = read_plural_dict(pname)
|
||||
self.plural_file = pname
|
||||
self.plural_dict = pdict
|
||||
else:
|
||||
self.plural_language = 'default'
|
||||
self.nplurals = DEFAULT_NPLURALS
|
||||
self.get_plural_id = DEFAULT_GET_PLURAL_ID
|
||||
self.construct_plural_form = DEFAULT_CONSTRUCT_PLURAL_FORM
|
||||
self.plural_file = None
|
||||
self.plural_dict = {}
|
||||
language = ''
|
||||
if isinstance(languages,str):
|
||||
languages = regex_language.findall(languages.lower())
|
||||
if len(languages)==1 and isinstance(languages[0],str):
|
||||
languages = regex_language.findall(languages[0].lower())
|
||||
elif not languages or languages[0] is None:
|
||||
languages = []
|
||||
for lang in languages:
|
||||
if lang+'.py' in self.filenames:
|
||||
language = lang
|
||||
langfile = language+'.py'
|
||||
break
|
||||
elif len(lang)>5 and lang[:5]+'.py' in self.filenames:
|
||||
language = lang[:5]
|
||||
langfile = language+'.py'
|
||||
break
|
||||
elif len(lang)>2 and lang[:2]+'.py' in self.filenames:
|
||||
language = lang[:2]
|
||||
langfile = language+'.py'
|
||||
break
|
||||
else:
|
||||
if 'default.py' in self.filenames:
|
||||
language = DEFAULT_LANGUAGE
|
||||
langfile = 'default.py'
|
||||
else:
|
||||
language = DEFAULT_LANGUAGE
|
||||
langfile = None
|
||||
self.accepted_language = language
|
||||
if langfile:
|
||||
self.language_file = ospath.join(self.langpath,langfile)
|
||||
self.t = read_dict(self.language_file)
|
||||
else:
|
||||
self.language_file = None
|
||||
self.t = {}
|
||||
self.cache = global_language_cache.setdefault(
|
||||
self.language_file,({},allocate_lock()))
|
||||
self.set_plural(language)
|
||||
self.requested_languages = languages = tuple(languages)
|
||||
if languages:
|
||||
all_languages = set(lang for lang in pl_info.iterkeys()
|
||||
if lang != 'default') \
|
||||
| set(self.current_languages)
|
||||
for lang in languages:
|
||||
# compare "aa-bb" | "aa" from *language* parameter
|
||||
# with strings from langlist using such alghorythm:
|
||||
# xx-yy.py -> xx.py -> xx*.py
|
||||
lang5 = lang[:5]
|
||||
if lang5 in all_languages:
|
||||
language = lang5
|
||||
else:
|
||||
lang2 = lang[:2]
|
||||
if len(lang5)>2 and lang2 in all_languages:
|
||||
language = lang2
|
||||
else:
|
||||
for l in all_languages:
|
||||
if l[:2]==lang2:
|
||||
language = l
|
||||
if language:
|
||||
if language in self.current_languages:
|
||||
break
|
||||
self.language_file = pjoin(self.langpath, language+'.py')
|
||||
self.t = read_dict(self.language_file)
|
||||
self.cache = global_language_cache.setdefault(
|
||||
self.language_file,
|
||||
({},allocate_lock()))
|
||||
set_plural(language)
|
||||
self.accepted_language = language
|
||||
return languages
|
||||
self.accepted_language = language or self.current_languages[0]
|
||||
self.language_file = self.default_language_file
|
||||
self.cache = global_language_cache.setdefault(self.language_file,
|
||||
({}, allocate_lock()))
|
||||
self.t = self.default_t
|
||||
set_plural(self.accepted_language)
|
||||
return languages
|
||||
|
||||
def __call__(self, message, symbols={}, language=None, lazy=None):
|
||||
@@ -659,22 +709,24 @@ class translator(object):
|
||||
the ## notation is ignored in multiline strings and strings that
|
||||
start with ##. this is to allow markmin syntax to be translated
|
||||
"""
|
||||
if isinstance(message, unicode):
|
||||
message = message.encode('utf8')
|
||||
if isinstance(prefix, unicode):
|
||||
prefix = prefix.encode('utf8')
|
||||
key = prefix+message
|
||||
mt = self.t.get(key, None)
|
||||
if mt is None:
|
||||
# we did not find a translation
|
||||
if message.find('##')>0 and not '\n' in message:
|
||||
# remove comments
|
||||
message = message.rsplit('##', 1)[0]
|
||||
# guess translation same as original
|
||||
self.t[key] = mt = message
|
||||
# update language file for later translation
|
||||
if self.language_file and not is_gae:
|
||||
write_dict(self.language_file, self.t)
|
||||
# fix backslash escaping
|
||||
mt = regex_backslash.sub(
|
||||
lambda m: m.group(1).translate(ttab_in), mt)
|
||||
return mt
|
||||
if mt is not None: return mt
|
||||
# we did not find a translation
|
||||
if message.find('##')>0 and not '\n' in message:
|
||||
# remove comments
|
||||
message = message.rsplit('##', 1)[0]
|
||||
# guess translation same as original
|
||||
self.t[key] = mt = self.default_t.get(key, message)
|
||||
# update language file for latter translation
|
||||
if self.language_file != self.default_language_file and not is_gae:
|
||||
write_dict(self.language_file, self.t)
|
||||
return regex_backslash.sub(
|
||||
lambda m: m.group(1).translate(ttab_in), mt)
|
||||
|
||||
def params_substitution(self, message, symbols):
|
||||
"""
|
||||
@@ -796,16 +848,16 @@ class translator(object):
|
||||
message = self.params_substitution(message, symbols)
|
||||
return message.translate(ttab_out)
|
||||
|
||||
def findT(path, language='en'):
|
||||
def findT(path, language=DEFAULT_LANGUAGE):
|
||||
"""
|
||||
must be run by the admin app
|
||||
"""
|
||||
lang_file = ospath.join(path, 'languages', language + '.py')
|
||||
lang_file = pjoin(path, 'languages', language + '.py')
|
||||
sentences = read_dict(lang_file)
|
||||
mp = ospath.join(path, 'models')
|
||||
cp = ospath.join(path, 'controllers')
|
||||
vp = ospath.join(path, 'views')
|
||||
mop = ospath.join(path, 'modules')
|
||||
mp = pjoin(path, 'models')
|
||||
cp = pjoin(path, 'controllers')
|
||||
vp = pjoin(path, 'views')
|
||||
mop = pjoin(path, 'modules')
|
||||
for filename in \
|
||||
listdir(mp, '^.+\.py$', 0)+listdir(cp, '^.+\.py$', 0)\
|
||||
+listdir(vp, '^.+\.html$', 0)+listdir(mop, '^.+\.py$', 0):
|
||||
@@ -827,10 +879,10 @@ def findT(path, language='en'):
|
||||
sentences[message] = message
|
||||
if not '!langcode!' in sentences:
|
||||
sentences['!langcode!'] = (
|
||||
'en' if language in ('default', 'en') else language)
|
||||
DEFAULT_LANGUAGE if language in ('default', DEFAULT_LANGUAGE) else language)
|
||||
if not '!langname!' in sentences:
|
||||
sentences['!langname!'] = (
|
||||
'English' if language in ('default', 'en')
|
||||
DEFAULT_LANGUAGE_NAME if language in ('default', DEFAULT_LANGUAGE)
|
||||
else sentences['!langcode!'])
|
||||
write_dict(lang_file, sentences)
|
||||
|
||||
@@ -843,9 +895,10 @@ copy_reg.pickle(lazyT, lazyT_pickle, lazyT_unpickle)
|
||||
|
||||
|
||||
def update_all_languages(application_path):
|
||||
path = ospath.join(application_path, 'languages/')
|
||||
for language in listdir(path, regex_langfile):
|
||||
findT(application_path, language[:-3])
|
||||
path = pjoin(application_path, 'languages/')
|
||||
for language in oslistdir(path):
|
||||
if regex_langfile.match(language):
|
||||
findT(application_path, language[:-3])
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
+23
-29
@@ -226,6 +226,20 @@ def serve_controller(request, response, session):
|
||||
requests = ('requests' in globals()) and (requests+1) % 100 or 0
|
||||
if not requests: gc.collect()
|
||||
# end garbage collection logic
|
||||
|
||||
# ##################################################
|
||||
# set default headers it not set
|
||||
# ##################################################
|
||||
|
||||
default_headers = [
|
||||
('Content-Type', contenttype('.'+request.extension)),
|
||||
('Cache-Control','no-store, no-cache, must-revalidate, post-check=0, pre-check=0'),
|
||||
('Expires', time.strftime('%a, %d %b %Y %H:%M:%S GMT',
|
||||
time.gmtime())),
|
||||
('Pragma', 'no-cache')]
|
||||
for key,value in default_headers:
|
||||
response.headers.setdefault(key,value)
|
||||
|
||||
raise HTTP(response.status, page, **response.headers)
|
||||
|
||||
|
||||
@@ -488,19 +502,6 @@ def wsgibase(environ, responder):
|
||||
if not env.web2py_disable_session:
|
||||
session.connect(request, response)
|
||||
|
||||
# ##################################################
|
||||
# set no-cache headers
|
||||
# ##################################################
|
||||
|
||||
headers = response.headers
|
||||
headers['Content-Type'] = \
|
||||
contenttype('.'+request.extension)
|
||||
headers['Cache-Control'] = \
|
||||
'no-store, no-cache, must-revalidate, post-check=0, pre-check=0'
|
||||
headers['Expires'] = \
|
||||
time.strftime('%a, %d %b %Y %H:%M:%S GMT', time.gmtime())
|
||||
headers['Pragma'] = 'no-cache'
|
||||
|
||||
# ##################################################
|
||||
# run controller
|
||||
# ##################################################
|
||||
@@ -509,14 +510,14 @@ def wsgibase(environ, responder):
|
||||
import gluon.debug
|
||||
# activate the debugger
|
||||
gluon.debug.dbg.do_debug(mainpyfile=request.folder)
|
||||
|
||||
|
||||
serve_controller(request, response, session)
|
||||
|
||||
except HTTP, http_response:
|
||||
|
||||
if static_file:
|
||||
return http_response.to(responder,env=env)
|
||||
|
||||
|
||||
if request.body:
|
||||
request.body.close()
|
||||
|
||||
@@ -544,29 +545,22 @@ def wsgibase(environ, responder):
|
||||
# ##################################################
|
||||
|
||||
session._try_store_on_disk(request, response)
|
||||
|
||||
if request.cid:
|
||||
if response.flash:
|
||||
http_response.headers['web2py-component-flash'] = urllib2.quote(xmlescape(response.flash).replace('\n',''))
|
||||
if response.js:
|
||||
http_response.headers['web2py-component-command'] = response.js.replace('\n','')
|
||||
|
||||
# ##################################################
|
||||
# store cookies in headers
|
||||
# ##################################################
|
||||
|
||||
if request.cid:
|
||||
rheaders = http_response.headers
|
||||
if response.flash and \
|
||||
not 'web2py-component-flash' in rheaders:
|
||||
rheaders['web2py-component-flash'] = \
|
||||
urllib2.quote(xmlescape(response.flash)\
|
||||
.replace('\n',''))
|
||||
if response.js and \
|
||||
not 'web2py-component-command' in rheaders:
|
||||
rheaders['web2py-component-command'] = \
|
||||
response.js.replace('\n','')
|
||||
rcookies = response.cookies
|
||||
if session._forget and \
|
||||
response.session_id_name in response.cookies:
|
||||
if session._forget and response.session_id_name in rcookies:
|
||||
del rcookies[response.session_id_name]
|
||||
elif session._secure:
|
||||
rcookies[response.session_id_name]['secure'] = True
|
||||
|
||||
http_response.cookies2headers(rcookies)
|
||||
ticket=None
|
||||
|
||||
|
||||
+17
-7
@@ -162,10 +162,12 @@ def url_in(request, environ):
|
||||
return map_url_in(request, environ)
|
||||
return regex_url_in(request, environ)
|
||||
|
||||
def url_out(request, env, application, controller, function, args, other, scheme, host, port):
|
||||
def url_out(request, env, application, controller, function,
|
||||
args, other, scheme, host, port):
|
||||
"assemble and rewrite outgoing URL"
|
||||
if routers:
|
||||
acf = map_url_out(request, env, application, controller, function, args, other, scheme, host, port)
|
||||
acf = map_url_out(request, env, application, controller,
|
||||
function, args, other, scheme, host, port)
|
||||
url = '%s%s' % (acf, other)
|
||||
else:
|
||||
url = '/%s/%s/%s%s' % (application, controller, function, other)
|
||||
@@ -226,7 +228,8 @@ def try_rewrite_on_error(http_response, request, environ, ticket=None):
|
||||
# Rewrite routes_onerror path.
|
||||
path_info = '/' + path_info.lstrip('/') # add leading '/' if missing
|
||||
environ['PATH_INFO'] = path_info
|
||||
error_handling_path = url_in(request, environ)[1]['PATH_INFO']
|
||||
error_handling_path = \
|
||||
url_in(request, environ)[1]['PATH_INFO']
|
||||
# Avoid infinite loop.
|
||||
if error_handling_path != error_raising_path:
|
||||
# wsgibase will be called recursively with the routes_onerror path.
|
||||
@@ -895,7 +898,11 @@ class MapUrlIn(object):
|
||||
self.domain_controller = None
|
||||
self.domain_function = None
|
||||
arg0 = self.harg0
|
||||
if (self.host, self.port) in base.domains:
|
||||
if not base.exclusive_domain and base.applications and arg0 in base.applications:
|
||||
self.application = arg0
|
||||
elif not base.exclusive_domain and arg0 and not base.applications:
|
||||
self.application = arg0
|
||||
elif (self.host, self.port) in base.domains:
|
||||
(self.application, self.domain_controller, self.domain_function) = base.domains[(self.host, self.port)]
|
||||
self.env['domain_application'] = self.application
|
||||
self.env['domain_controller'] = self.domain_controller
|
||||
@@ -1118,7 +1125,8 @@ class MapUrlIn(object):
|
||||
class MapUrlOut(object):
|
||||
"logic for mapping outgoing URLs"
|
||||
|
||||
def __init__(self, request, env, application, controller, function, args, other, scheme, host, port):
|
||||
def __init__(self, request, env, application, controller,
|
||||
function, args, other, scheme, host, port):
|
||||
"initialize a map-out object"
|
||||
self.default_application = routers.BASE.default_application
|
||||
if application in routers:
|
||||
@@ -1319,7 +1327,8 @@ def map_url_in(request, env, app=False):
|
||||
map.update_request()
|
||||
return (None, map.env)
|
||||
|
||||
def map_url_out(request, env, application, controller, function, args, other, scheme, host, port):
|
||||
def map_url_out(request, env, application, controller,
|
||||
function, args, other, scheme, host, port):
|
||||
'''
|
||||
supply /a/c/f (or /a/lang/c/f) portion of outgoing url
|
||||
|
||||
@@ -1345,7 +1354,8 @@ def map_url_out(request, env, application, controller, function, args, other, sc
|
||||
|
||||
We assume that language names do not collide with a/c/f names.
|
||||
'''
|
||||
map = MapUrlOut(request, env, application, controller, function, args, other, scheme, host, port)
|
||||
map = MapUrlOut(request, env, application, controller,
|
||||
function, args, other, scheme, host, port)
|
||||
return map.acf()
|
||||
|
||||
def get_effective_router(appname):
|
||||
|
||||
+3
-2
@@ -88,7 +88,7 @@ except:
|
||||
from simplejson import loads, dumps
|
||||
|
||||
|
||||
from gluon import DAL, Field, IS_NOT_EMPTY, IS_IN_SET, IS_NOT_IN_DB, IS_INT_IN_RANGE
|
||||
from gluon import DAL, Field, IS_NOT_EMPTY, IS_IN_SET, IS_NOT_IN_DB, IS_INT_IN_RANGE, IS_DATETIME
|
||||
from gluon.utils import web2py_uuid
|
||||
|
||||
|
||||
@@ -454,7 +454,8 @@ class Scheduler(MetaScheduler):
|
||||
Field('args','text',default='[]',requires=TYPE(list)),
|
||||
Field('vars','text',default='{}',requires=TYPE(dict)),
|
||||
Field('enabled','boolean',default=True),
|
||||
Field('start_time','datetime',default=now, requires=IS_NOT_EMPTY()),
|
||||
Field('start_time','datetime',default=now,
|
||||
requires = IS_DATETIME()),
|
||||
Field('next_run_time','datetime',default=now),
|
||||
Field('stop_time','datetime'),
|
||||
Field('repeats','integer',default=1,comment="0=unlimited",
|
||||
|
||||
+48
-31
@@ -239,11 +239,14 @@ class ListWidget(StringWidget):
|
||||
_name = field.name
|
||||
if field.type=='list:integer': _class = 'integer'
|
||||
else: _class = 'string'
|
||||
requires = field.requires if isinstance(field.requires, (IS_NOT_EMPTY, IS_LIST_OF)) else None
|
||||
requires = field.requires if isinstance(
|
||||
field.requires, (IS_NOT_EMPTY, IS_LIST_OF)) else None
|
||||
attributes['_style'] = 'list-style:none'
|
||||
items=[LI(INPUT(_id=_id, _class=_class, _name=_name,
|
||||
value=v, hideerror=True, requires=requires),
|
||||
**attributes) for v in value or ['']]
|
||||
nvalue = value or ['']
|
||||
items = [LI(INPUT(_id=_id, _class=_class, _name=_name,
|
||||
value=v, hideerror=k<len(nvalue)-1,
|
||||
requires=requires),
|
||||
**attributes) for (k,v) in enumerate(nvalue)]
|
||||
script=SCRIPT("""
|
||||
// from http://refactormycode.com/codes/694-expanding-input-list-using-jquery
|
||||
(function(){
|
||||
@@ -1105,20 +1108,21 @@ class SQLFORM(FORM):
|
||||
self.components = [table]
|
||||
|
||||
def createform(self, xfields):
|
||||
if isinstance(self.formstyle, basestring):
|
||||
if self.formstyle in SQLFORM.formstyles:
|
||||
self.formstyle = SQLFORM.formstyles[self.formstyle]
|
||||
formstyle = self.formstyle
|
||||
if isinstance(formstyle, basestring):
|
||||
if formstyle in SQLFORM.formstyles:
|
||||
formstyle = SQLFORM.formstyles[formstyle]
|
||||
else:
|
||||
raise RuntimeError, 'formstyle not found'
|
||||
|
||||
if callable(self.formstyle):
|
||||
if callable(formstyle):
|
||||
# backward compatibility, 4 argument function is the old style
|
||||
args, varargs, keywords, defaults = inspect.getargspec(self.formstyle)
|
||||
args, varargs, keywords, defaults = inspect.getargspec(formstyle)
|
||||
if defaults and len(args) - len(defaults) == 4 or len(args) == 4:
|
||||
table = TABLE()
|
||||
for id,a,b,c in xfields:
|
||||
raw_b = self.field_parent[id] = b
|
||||
newrows = self.formstyle(id,a,raw_b,c)
|
||||
newrows = formstyle(id,a,raw_b,c)
|
||||
if type(newrows).__name__ != "tuple":
|
||||
newrows = [newrows]
|
||||
for newrow in newrows:
|
||||
@@ -1126,7 +1130,7 @@ class SQLFORM(FORM):
|
||||
else:
|
||||
for id,a,b,c in xfields:
|
||||
self.field_parent[id] = b
|
||||
table = self.formstyle(self, xfields)
|
||||
table = formstyle(self, xfields)
|
||||
else:
|
||||
raise RuntimeError, 'formstyle not supported'
|
||||
return table
|
||||
@@ -1409,7 +1413,7 @@ class SQLFORM(FORM):
|
||||
type(''): ('string', None),
|
||||
type(True): ('boolean', None),
|
||||
type(1): ('integer', IS_INT_IN_RANGE(-1e12,+1e12)),
|
||||
type(1.0): ('double', IS_INT_IN_RANGE(-1e12,+1e12)),
|
||||
type(1.0): ('double', IS_FLOAT_IN_RANGE()),
|
||||
type([]): ('list:string', None),
|
||||
type(datetime.date.today()): ('date', IS_DATE()),
|
||||
type(datetime.datetime.today()): ('datetime', IS_DATETIME())
|
||||
@@ -1663,14 +1667,20 @@ class SQLFORM(FORM):
|
||||
return URL(**b)
|
||||
|
||||
referrer = session.get('_web2py_grid_referrer_'+formname, url())
|
||||
# if not user_signature every action is accessible
|
||||
# else forbid access unless
|
||||
# - url is based url
|
||||
# - url has valid signature (vars are not signed, only path_info)
|
||||
# = url does not contain 'create','delete','edit' (readonly)
|
||||
if user_signature:
|
||||
if (args != request.args and user_signature and \
|
||||
not URL.verify(request,user_signature=user_signature)) or \
|
||||
(not (session.auth and session.auth.user) and \
|
||||
('edit' in request.args or \
|
||||
'create' in request.args or \
|
||||
'delete' in request.args)):
|
||||
session.flash = T('not authorized')
|
||||
if not(
|
||||
'/'.join(str(a) for a in args) == '/'.join(request.args) or
|
||||
URL.verify(request,user_signature=user_signature,
|
||||
hash_vars=False) or not (
|
||||
'create' in request.args or
|
||||
'delete' in request.args or
|
||||
'edit' in request.args)):
|
||||
session.flash = T('not authorized')
|
||||
redirect(referrer)
|
||||
|
||||
def gridbutton(buttonclass='buttonadd', buttontext='Add',
|
||||
@@ -1866,6 +1876,16 @@ class SQLFORM(FORM):
|
||||
session['_web2py_grid_referrer_'+formname] = url2(vars=request.vars)
|
||||
console = DIV(_class='web2py_console %(header)s %(cornertop)s' % ui)
|
||||
error = None
|
||||
if create:
|
||||
add = gridbutton(
|
||||
buttonclass='buttonadd',
|
||||
buttontext='Add',
|
||||
buttonurl=url(args=['new',tablename]))
|
||||
if not searchable:
|
||||
console.append(add)
|
||||
else:
|
||||
add = ''
|
||||
|
||||
if searchable:
|
||||
sfields = reduce(lambda a,b:a+b,
|
||||
[[f for f in t if f.readable] for t in tables])
|
||||
@@ -1873,7 +1893,7 @@ class SQLFORM(FORM):
|
||||
search_widget = search_widget[tablename]
|
||||
if search_widget=='default':
|
||||
search_menu = SQLFORM.search_menu(sfields)
|
||||
search_widget = lambda sfield, url: DIV(FORM(
|
||||
search_widget = lambda sfield, url: CAT(add,FORM(
|
||||
INPUT(_name='keywords',_value=request.vars.keywords,
|
||||
_id='web2py_keywords',_onfocus="jQuery('#w2p_query_fields').change();jQuery('#w2p_query_panel').slideDown();"),
|
||||
INPUT(_type='submit',_value=T('Search'),_class="btn"),
|
||||
@@ -1893,11 +1913,6 @@ class SQLFORM(FORM):
|
||||
error = T('Invalid query')
|
||||
else:
|
||||
subquery = None
|
||||
if create:
|
||||
console.append(gridbutton(
|
||||
buttonclass='buttonadd',
|
||||
buttontext='Add',
|
||||
buttonurl=url(args=['new',tablename])))
|
||||
|
||||
if subquery:
|
||||
dbset = dbset(subquery)
|
||||
@@ -2102,11 +2117,12 @@ class SQLFORM(FORM):
|
||||
else:
|
||||
export_menu = None
|
||||
|
||||
res = DIV(console,
|
||||
DIV(htmltable,_class="web2py_table"),
|
||||
DIV(paginator,_class=\
|
||||
"web2py_paginator %(header)s %(cornerbottom)s" % ui),
|
||||
res = DIV(console,DIV(htmltable,_class="web2py_table"),
|
||||
_class='%s %s' % (_class, ui.get('widget')))
|
||||
if paginator.components:
|
||||
res.append(
|
||||
DIV(paginator,
|
||||
_class="web2py_paginator %(header)s %(cornerbottom)s"%ui))
|
||||
if export_menu: res.append(export_menu)
|
||||
res.create_form = create_form
|
||||
res.update_form = update_form
|
||||
@@ -2353,6 +2369,7 @@ class SQLTABLE(TABLE):
|
||||
extracolumns=None,
|
||||
selectid=None,
|
||||
renderstyle=False,
|
||||
cid=None,
|
||||
**attributes
|
||||
):
|
||||
|
||||
@@ -2390,7 +2407,7 @@ class SQLTABLE(TABLE):
|
||||
row.append(TH(coldict['label'],**attrcol))
|
||||
elif orderby:
|
||||
row.append(TH(A(headers.get(c, c),
|
||||
_href=th_link+'?orderby=' + c)))
|
||||
_href=th_link+'?orderby=' + c, cid=cid)))
|
||||
else:
|
||||
row.append(TH(headers.get(c, c)))
|
||||
|
||||
@@ -2415,7 +2432,7 @@ class SQLTABLE(TABLE):
|
||||
_class = 'odd'
|
||||
|
||||
if not selectid is None: #new implement
|
||||
if record[self.id_field_name]==selectid:
|
||||
if record.get('id') == selectid:
|
||||
_class += ' rowselected'
|
||||
|
||||
for colname in columns:
|
||||
|
||||
+3
-18
@@ -38,29 +38,14 @@ class Storage(dict):
|
||||
>>> print o.a
|
||||
None
|
||||
"""
|
||||
__slots__=()
|
||||
|
||||
__slots__=()
|
||||
__setattr__ = dict.__setitem__
|
||||
__delattr__ = dict.__delitem__
|
||||
__getitem__ = dict.get
|
||||
__getattr__ = dict.get
|
||||
__repr__ = lambda self: '<Storage %s>' % dict.__repr__(self)
|
||||
__getstate__ = dict
|
||||
__setstate__ = dict.update
|
||||
# def __getattr__(self, key):
|
||||
# return dict.get(self, key, None)
|
||||
# def __setattr__(self, key, value):
|
||||
# self[key] = value
|
||||
# def __getitem__(self, key):
|
||||
# return dict.get(self, key, None)
|
||||
# def __delattr__(self, key):
|
||||
# del self[key]
|
||||
# def __repr__(self):
|
||||
# return '<Storage %s>' % dict.__repr__(self)
|
||||
# def __getstate__(self):
|
||||
# return dict(self)
|
||||
# def __setstate__(self,values):
|
||||
# self.update(values)
|
||||
# http://stackoverflow.com/questions/5247250/why-does-pickle-getstate-accept-as-a-return-value-the-very-instance-it-requi
|
||||
__getstate__ = lambda self: None
|
||||
|
||||
def getlist(self,key):
|
||||
"""
|
||||
|
||||
+10
-9
@@ -60,8 +60,8 @@ def stream_file_or_304_or_206(
|
||||
fp.close()
|
||||
stat_file = os.stat(static_file)
|
||||
fsize = stat_file[stat.ST_SIZE]
|
||||
mtime = time.strftime('%a, %d %b %Y %H:%M:%S GMT',
|
||||
time.gmtime(stat_file[stat.ST_MTIME]))
|
||||
modified = stat_file[stat.ST_MTIME]
|
||||
mtime = time.strftime('%a, %d %b %Y %H:%M:%S GMT',time.gmtime(modified))
|
||||
headers.setdefault('Content-Type', contenttype(static_file))
|
||||
headers.setdefault('Last-Modified', mtime)
|
||||
headers.setdefault('Pragma', 'cache')
|
||||
@@ -91,6 +91,14 @@ def stream_file_or_304_or_206(
|
||||
headers['Content-Length'] = '%i' % bytes
|
||||
status = 206
|
||||
else:
|
||||
if 'gzip' in request.env.http_accept_encoding and\
|
||||
not 'Content-Encoding' in headers:
|
||||
gzipped = static_file + '.gz'
|
||||
if os.path.isfile(gzipped) and os.path.getmtime(gzipped)>modified:
|
||||
static_file = gzipped
|
||||
fsize = os.path.getsize(gzipped)
|
||||
headers['Content-Encoding'] = 'gzip'
|
||||
headers['Vary'] = 'Accept-Encoding'
|
||||
try:
|
||||
stream = open(static_file, 'rb')
|
||||
except IOError, e:
|
||||
@@ -106,10 +114,3 @@ def stream_file_or_304_or_206(
|
||||
else:
|
||||
wrapped = streamer(stream, chunk_size=chunk_size, bytes=bytes)
|
||||
raise HTTP(status, wrapped, **headers)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -311,12 +311,13 @@ class TestDatetime(unittest.TestCase):
|
||||
9, 30)), 3)
|
||||
self.assertEqual(len(db(db.t.a == datetime.datetime(1971, 12,
|
||||
21, 11, 30)).select()), 1)
|
||||
self.assertEqual(len(db(db.t.a.year() == 1971).select()), 2)
|
||||
self.assertEqual(len(db(db.t.a.month() == 12).select()), 2)
|
||||
self.assertEqual(len(db(db.t.a.day() == 21).select()), 3)
|
||||
self.assertEqual(len(db(db.t.a.hour() == 11).select()), 1)
|
||||
self.assertEqual(len(db(db.t.a.minutes() == 30).select()), 3)
|
||||
self.assertEqual(len(db(db.t.a.seconds() == 0).select()), 3)
|
||||
self.assertEqual(db(db.t.a.year() == 1971).count(), 2)
|
||||
self.assertEqual(db(db.t.a.month() == 12).count(), 2)
|
||||
self.assertEqual(db(db.t.a.day() == 21).count(), 3)
|
||||
self.assertEqual(db(db.t.a.hour() == 11).count(), 1)
|
||||
self.assertEqual(db(db.t.a.minutes() == 30).count(), 3)
|
||||
self.assertEqual(db(db.t.a.seconds() == 0).count(), 3)
|
||||
self.assertEqual(db(db.t.a.epoch()<365*24*3600).count(),1)
|
||||
db.t.drop()
|
||||
|
||||
|
||||
@@ -329,7 +330,7 @@ class TestExpressions(unittest.TestCase):
|
||||
self.assertEqual(db.t.insert(a=2), 2)
|
||||
self.assertEqual(db.t.insert(a=3), 3)
|
||||
self.assertEqual(db(db.t.a == 3).update(a=db.t.a + 1), 1)
|
||||
self.assertEqual(len(db(db.t.a == 4).select()), 1)
|
||||
self.assertEqual(db(db.t.a == 4).count(), 1)
|
||||
db.t.drop()
|
||||
|
||||
|
||||
|
||||
@@ -346,8 +346,13 @@ class TestRouter(unittest.TestCase):
|
||||
self.assertEqual(filter_url('http://domain1.com/abc', app=True), 'app1')
|
||||
self.assertEqual(filter_url('http://www.domain1.com/abc', app=True), 'app1')
|
||||
self.assertEqual(filter_url('http://domain2.com/abc', app=True), 'app2')
|
||||
self.assertEqual(filter_url('http://domain2.com/admin', app=True), 'admin')
|
||||
|
||||
routers['BASE']['exclusive_domain'] = True
|
||||
load(rdict=routers)
|
||||
self.assertEqual(filter_url('http://domain2.com/admin', app=True), 'app2')
|
||||
|
||||
|
||||
self.assertEqual(filter_url('http://domain.com/goodapp', app=True), 'goodapp')
|
||||
self.assertRaises(HTTP, filter_url, 'http://domain.com/bad!app', app=True)
|
||||
try:
|
||||
@@ -428,7 +433,7 @@ class TestRouter(unittest.TestCase):
|
||||
self.assertEqual(filter_url('http://domain1.com/abc.html'), '/app1/c1/abc')
|
||||
self.assertEqual(filter_url('http://domain1.com/abc.css'), '/app1/c1/abc.css')
|
||||
self.assertEqual(filter_url('http://domain1.com/index/abc'), "/app1/c1/index ['abc']")
|
||||
self.assertEqual(filter_url('http://domain2.com/app1'), "/app2a/c2a/app1")
|
||||
self.assertEqual(filter_url('http://domain2.com/app1'), "/app1/c1/f1")
|
||||
|
||||
self.assertEqual(filter_url('https://domain1.com/app1/ctr/fcn', domain=('app1',None), out=True), "/ctr/fcn")
|
||||
self.assertEqual(filter_url('https://www.domain1.com/app1/ctr/fcn', domain=('app1',None), out=True), "/ctr/fcn")
|
||||
@@ -475,6 +480,98 @@ class TestRouter(unittest.TestCase):
|
||||
pass
|
||||
self.assertEqual(filter_url('http://domain1.com/app1/c1/f1', domain=('app2b',None), host='domain2.com', out=True), "/app1")
|
||||
|
||||
|
||||
def test_router_domains_ed(self):
|
||||
'''
|
||||
Test URLs that map domains with exclusive_domain set
|
||||
'''
|
||||
routers = dict(
|
||||
BASE = dict(
|
||||
applications = ['app1', 'app2', 'app2A', 'app3', 'app4', 'app5', 'app6'],
|
||||
exclusive_domain = True,
|
||||
domains = {
|
||||
# two domains to the same app
|
||||
"domain1.com" : "app1",
|
||||
"www.domain1.com" : "app1",
|
||||
# same domain, two ports, to two apps
|
||||
"domain2.com" : "app2a",
|
||||
"domain2.com:8080" : "app2b",
|
||||
# two domains, same app, two controllers
|
||||
"domain3a.com" : "app3/c3a",
|
||||
"domain3b.com" : "app3/c3b",
|
||||
# two domains, same app & controller, two functions
|
||||
"domain4a.com" : "app4/c4/f4a",
|
||||
"domain4b.com" : "app4/c4/f4b",
|
||||
# http vs https
|
||||
"domain6.com:80" : "app6",
|
||||
"domain6.com:443" : "app6s",
|
||||
},
|
||||
),
|
||||
app1 = dict( default_controller = 'c1', default_function = 'f1', controllers = ['c1'], exclusive_domain=True, ),
|
||||
app2a = dict( default_controller = 'c2a', default_function = 'f2a', controllers = ['c2a'], ),
|
||||
app2b = dict( default_controller = 'c2b', default_function = 'f2b', controllers = ['c2b'], ),
|
||||
app3 = dict( controllers = ['c3a', 'c3b'], ),
|
||||
app4 = dict( default_controller = 'c4', controllers = ['c4']),
|
||||
app5 = dict( default_controller = 'c5', controllers = ['c5'], domain = 'localhost' ),
|
||||
app6 = dict( default_controller = 'c6', default_function = 'f6', controllers = ['c6'], ),
|
||||
app6s = dict( default_controller = 'c6s', default_function = 'f6s', controllers = ['c6s'], ),
|
||||
)
|
||||
|
||||
load(rdict=routers)
|
||||
self.assertEqual(filter_url('http://domain1.com/abc'), '/app1/c1/abc')
|
||||
self.assertEqual(filter_url('http://domain1.com/c1/abc'), '/app1/c1/abc')
|
||||
self.assertEqual(filter_url('http://domain1.com/abc.html'), '/app1/c1/abc')
|
||||
self.assertEqual(filter_url('http://domain1.com/abc.css'), '/app1/c1/abc.css')
|
||||
self.assertEqual(filter_url('http://domain1.com/index/abc'), "/app1/c1/index ['abc']")
|
||||
self.assertEqual(filter_url('http://domain2.com/app1'), "/app2a/c2a/app1")
|
||||
|
||||
self.assertEqual(filter_url('https://domain1.com/app1/ctr/fcn', domain=('app1',None), out=True), "/ctr/fcn")
|
||||
self.assertEqual(filter_url('https://www.domain1.com/app1/ctr/fcn', domain=('app1',None), out=True), "/ctr/fcn")
|
||||
|
||||
self.assertEqual(filter_url('http://domain2.com/abc'), '/app2a/c2a/abc')
|
||||
self.assertEqual(filter_url('http://domain2.com:8080/abc'), '/app2b/c2b/abc')
|
||||
|
||||
self.assertEqual(filter_url('http://domain2.com/app2a/ctr/fcn', domain=('app2a',None), out=True), "/ctr/fcn")
|
||||
self.assertEqual(filter_url('http://domain2.com/app2a/ctr/f2a', domain=('app2a',None), out=True), "/ctr")
|
||||
self.assertEqual(filter_url('http://domain2.com/app2a/c2a/f2a', domain=('app2a',None), out=True), "/")
|
||||
self.assertEqual(filter_url('http://domain2.com/app2a/c2a/fcn', domain=('app2a',None), out=True), "/fcn")
|
||||
|
||||
self.assertRaises(SyntaxError, filter_url, 'http://domain2.com/app2a/ctr/fcn', domain=('app2b',None), out=True)
|
||||
self.assertRaises(SyntaxError, filter_url, 'http://domain2.com/app2a/ctr/f2a', domain=('app2b',None), out=True)
|
||||
self.assertRaises(SyntaxError, filter_url, 'http://domain2.com/app2a/c2a/f2a', domain=('app2b',None), out=True)
|
||||
|
||||
self.assertEqual(filter_url('http://domain3a.com/'), '/app3/c3a/index')
|
||||
self.assertEqual(filter_url('http://domain3a.com/abc'), '/app3/c3a/abc')
|
||||
self.assertEqual(filter_url('http://domain3a.com/c3b'), '/app3/c3b/index')
|
||||
self.assertEqual(filter_url('http://domain3b.com/abc'), '/app3/c3b/abc')
|
||||
|
||||
self.assertEqual(filter_url('http://domain3a.com/app3/c3a/fcn', domain=('app3','c3a'), out=True), "/fcn")
|
||||
self.assertEqual(filter_url('http://domain3a.com/app3/c3a/fcn', domain=('app3','c3b'), out=True), "/c3a/fcn")
|
||||
|
||||
self.assertRaises(SyntaxError, filter_url, 'http://domain3a.com/app3/c3a/fcn', domain=('app1',None), out=True)
|
||||
|
||||
self.assertEqual(filter_url('http://domain4a.com/abc'), '/app4/c4/abc')
|
||||
self.assertEqual(filter_url('https://domain4a.com/app4/c4/fcn', domain=('app4',None), out=True), "/fcn")
|
||||
|
||||
self.assertEqual(filter_url('http://domain4a.com'), '/app4/c4/f4a')
|
||||
self.assertEqual(filter_url('http://domain4b.com'), '/app4/c4/f4b')
|
||||
|
||||
self.assertEqual(filter_url('http://localhost/abc'), '/app5/c5/abc')
|
||||
self.assertEqual(filter_url('http:///abc'), '/app5/c5/abc') # test null host => localhost
|
||||
self.assertEqual(filter_url('https://localhost/app5/c5/fcn', domain=('app5',None), out=True), "/fcn")
|
||||
|
||||
self.assertEqual(filter_url('http://domain6.com'), '/app6/c6/f6')
|
||||
self.assertEqual(filter_url('https://domain6.com'), '/app6s/c6s/f6s')
|
||||
|
||||
self.assertRaises(SyntaxError, filter_url, 'http://domain2.com/app3/c3a/f3', domain=('app2b',None), out=True)
|
||||
self.assertRaises(SyntaxError, filter_url, 'http://domain1.com/app1/c1/f1', domain=('app2b',None), out=True)
|
||||
try:
|
||||
# 2.7+ only
|
||||
self.assertRaisesRegexp(SyntaxError, 'cross-domain conflict', filter_url, 'http://domain1.com/app1/c1/f1', domain=('app2b',None), out=True)
|
||||
except AttributeError:
|
||||
pass
|
||||
self.assertEqual(filter_url('http://domain1.com/app1/c1/f1', domain=('app2b',None), host='domain2.com', out=True), "/app1")
|
||||
|
||||
def test_router_raise(self):
|
||||
'''
|
||||
Test URLs that raise exceptions
|
||||
|
||||
+123
-69
@@ -794,6 +794,10 @@ def addrow(form, a, b, c, style, _id, position=-1):
|
||||
DIV(b, _class='w2p_fw'),
|
||||
DIV(c, _class='w2p_fc'),
|
||||
_id = _id))
|
||||
elif style == "bootstrap":
|
||||
form[0].insert(position, DIV(LABEL(a,_class='control-label'),
|
||||
DIV(b,SPAN(c, _class='inline-help'),_class='controls'),
|
||||
_class='control-group',_id = _id))
|
||||
else:
|
||||
form[0].insert(position, TR(TD(LABEL(a),_class='w2p_fl'),
|
||||
TD(b,_class='w2p_fw'),
|
||||
@@ -1191,7 +1195,10 @@ class Auth(object):
|
||||
'reset_password','request_reset_password',
|
||||
'change_password','profile','groups',
|
||||
'impersonate','not_authorized'):
|
||||
return getattr(self,args[0])()
|
||||
if len(request.args) >= 2:
|
||||
return getattr(self,args[0])(request.args[1])
|
||||
else:
|
||||
return getattr(self,args[0])()
|
||||
elif args[0]=='cas' and not self.settings.cas_provider:
|
||||
if args(1) == self.settings.cas_actions['login']:
|
||||
return self.cas_login(version=2)
|
||||
@@ -1208,23 +1215,23 @@ class Auth(object):
|
||||
|
||||
def navbar(self, prefix='Welcome', action=None,
|
||||
separators=(' [ ',' | ',' ] '), user_identifier=DEFAULT,
|
||||
referrer_actions=DEFAULT):
|
||||
referrer_actions=DEFAULT, mode='default'):
|
||||
referrer_actions = [] if not referrer_actions else referrer_actions
|
||||
request = current.request
|
||||
asdropdown = (mode == 'dropdown')
|
||||
T = current.T
|
||||
if isinstance(prefix, str):
|
||||
prefix = T(prefix)
|
||||
if prefix:
|
||||
prefix = prefix.strip() + ' '
|
||||
if not action:
|
||||
action=self.url(self.settings.function)
|
||||
action = self.url(self.settings.function)
|
||||
s1,s2,s3 = separators
|
||||
if URL() == action:
|
||||
next = ''
|
||||
else:
|
||||
next = '?_next=' + urllib.quote(URL(args=request.args,
|
||||
vars=request.get_vars))
|
||||
|
||||
href = lambda function: '%s/%s%s' % (action, function,
|
||||
next if referrer_actions is DEFAULT or function in referrer_actions else '')
|
||||
|
||||
@@ -1244,11 +1251,19 @@ class Auth(object):
|
||||
profile = A(T('Profile'), _href=href('profile'))
|
||||
password = A(T('Password'), _href=href('change_password'))
|
||||
bar = SPAN(prefix, user_identifier, s1, logout, s3, _class='auth_navbar')
|
||||
|
||||
if asdropdown:
|
||||
logout = LI(A(I(_class='icon-off'), ' '+T('Logout'), _href='%s/logout?_next=%s' %
|
||||
(action, urllib.quote(self.settings.logout_next)))) # the space before T('Logout') is intentional. It creates a gap between icon and text
|
||||
profile = LI(A(I(_class='icon-user'), ' '+T('Profile'), _href=href('profile')))
|
||||
password = LI(A(I(_class='icon-lock'), ' '+T('Password'), _href=href('change_password')))
|
||||
bar = UL(logout,_class='dropdown-menu') # logout will be the last item in list
|
||||
|
||||
if not 'profile' in self.settings.actions_disabled:
|
||||
bar.insert(-1, s2)
|
||||
if not asdropdown: bar.insert(-1, s2)
|
||||
bar.insert(-1, profile)
|
||||
if not 'change_password' in self.settings.actions_disabled:
|
||||
bar.insert(-1, s2)
|
||||
if not asdropdown: bar.insert(-1, s2)
|
||||
bar.insert(-1, password)
|
||||
else:
|
||||
login = A(T('Login'), _href=href('login'))
|
||||
@@ -1259,17 +1274,33 @@ class Auth(object):
|
||||
T('Lost password?'), _href=href('request_reset_password'))
|
||||
bar = SPAN(s1, login, s3, _class='auth_navbar')
|
||||
|
||||
if asdropdown:
|
||||
login = LI(A(I(_class='icon-off'), ' '+T('Login'), _href=href('login'))) #the space before T('Login') is intentional. It creates a gap between icon and text
|
||||
register = LI(A(I(_class='icon-user'), ' '+T('Register'), _href=href('register')))
|
||||
retrieve_username = LI(A(I(_class='icon-edit'), ' '+T('Forgot username?'), _href=href('retrieve_username')))
|
||||
lost_password = LI(A(I(_class='icon-lock'), ' '+T('Lost password?'), _href=href('request_reset_password')))
|
||||
bar = UL(login,_class='dropdown-menu') # login will be the last item in list
|
||||
|
||||
if not 'register' in self.settings.actions_disabled:
|
||||
bar.insert(-1, s2)
|
||||
if not asdropdown: bar.insert(-1, s2)
|
||||
bar.insert(-1, register)
|
||||
if self.settings.use_username and not 'retrieve_username' \
|
||||
in self.settings.actions_disabled:
|
||||
bar.insert(-1, s2)
|
||||
if not asdropdown: bar.insert(-1, s2)
|
||||
bar.insert(-1, retrieve_username)
|
||||
if not 'request_reset_password' \
|
||||
in self.settings.actions_disabled:
|
||||
bar.insert(-1, s2)
|
||||
if not asdropdown: bar.insert(-1, s2)
|
||||
bar.insert(-1, lost_password)
|
||||
|
||||
if asdropdown:
|
||||
bar.insert(-1, LI('',_class='divider'))
|
||||
if self.user_id:
|
||||
bar = LI(A(prefix, user_identifier, _href='#'),
|
||||
bar,_class='dropdown')
|
||||
else:
|
||||
bar = LI(A(T('Login'), _href='#'),
|
||||
bar,_class='dropdown')
|
||||
return bar
|
||||
|
||||
def __get_migrate(self, tablename, migrate=True):
|
||||
@@ -1877,20 +1908,33 @@ class Auth(object):
|
||||
|
||||
if self.settings.remember_me_form:
|
||||
## adds a new input checkbox "remember me for longer"
|
||||
addrow(form,XML(" "),
|
||||
DIV(XML(" "),
|
||||
INPUT(_type='checkbox',
|
||||
_class='checkbox',
|
||||
_id="auth_user_remember",
|
||||
_name="remember",
|
||||
),
|
||||
XML(" "),
|
||||
if self.settings.formstyle != 'bootstrap':
|
||||
addrow(form,XML(" "),
|
||||
DIV(XML(" "),
|
||||
INPUT(_type='checkbox',
|
||||
_class='checkbox',
|
||||
_id="auth_user_remember",
|
||||
_name="remember",
|
||||
),
|
||||
XML(" "),
|
||||
LABEL(
|
||||
self.messages.label_remember_me,
|
||||
_for="auth_user_remember",
|
||||
)),"",
|
||||
self.settings.formstyle,
|
||||
'auth_user_remember__row')
|
||||
elif self.settings.formstyle == 'bootstrap':
|
||||
addrow(form,
|
||||
"",
|
||||
LABEL(
|
||||
self.messages.label_remember_me,
|
||||
_for="auth_user_remember",
|
||||
)),"",
|
||||
self.settings.formstyle,
|
||||
'auth_user_remember__row')
|
||||
INPUT(_type='checkbox',
|
||||
_id="auth_user_remember",
|
||||
_name="remember"),
|
||||
self.messages.label_remember_me,
|
||||
_class="checkbox"),
|
||||
"",
|
||||
self.settings.formstyle,
|
||||
'auth_user_remember__row')
|
||||
|
||||
captcha = self.settings.login_captcha or \
|
||||
(self.settings.login_captcha!=False and self.settings.captcha)
|
||||
@@ -2107,6 +2151,9 @@ class Auth(object):
|
||||
repr(request.vars.get(passfield, None)),
|
||||
error_message=self.messages.mismatched_password))
|
||||
|
||||
if formstyle == 'bootstrap' :
|
||||
form.custom.widget.password_two['_class'] = 'input-xlarge'
|
||||
|
||||
addrow(form, self.messages.verify_password + self.settings.label_separator,
|
||||
form.custom.widget.password_two,
|
||||
self.messages.verify_password_comment,
|
||||
@@ -2699,7 +2746,7 @@ class Auth(object):
|
||||
self.user = session.auth.user
|
||||
if requested_id is DEFAULT and not request.post_vars:
|
||||
return SQLFORM.factory(Field('user_id', 'integer'))
|
||||
return self.user
|
||||
return SQLFORM(table_user, user.id, readonly=True)
|
||||
|
||||
def update_groups(self):
|
||||
if not self.user:
|
||||
@@ -3155,14 +3202,17 @@ class Auth(object):
|
||||
def wiki(self,
|
||||
slug=None,
|
||||
env=None,
|
||||
render=None,
|
||||
render='markmin',
|
||||
manage_permissions=False,
|
||||
force_prefix='',
|
||||
force_prefix='',
|
||||
restrict_search=False,
|
||||
resolve=True):
|
||||
if not hasattr(self,'_wiki'):
|
||||
self._wiki = Wiki(self,render=render,
|
||||
manage_permissions=manage_permissions,
|
||||
force_prefix=force_prefix,env=env)
|
||||
force_prefix=force_prefix,
|
||||
restrict_search=restrict_search,
|
||||
env=env)
|
||||
else:
|
||||
self._wiki.env.update(env or {})
|
||||
# if resolve is set to True, process request as wiki call
|
||||
@@ -4506,7 +4556,8 @@ class Wiki(object):
|
||||
controller, function, args = items[0], items[1], items[2:]
|
||||
return LOAD(controller, function, args=args, ajax=True).xml()
|
||||
def __init__(self,auth,env=None,render='markmin',
|
||||
manage_permissions=False,force_prefix=''):
|
||||
manage_permissions=False,force_prefix='',
|
||||
restrict_search=False):
|
||||
self.env = env or {}
|
||||
self.env['component'] = Wiki.component
|
||||
if render == 'markmin': render=self.markmin_render
|
||||
@@ -4518,46 +4569,47 @@ class Wiki(object):
|
||||
self.force_prefix = force_prefix
|
||||
self.host = current.request.env.http_host
|
||||
perms = self.manage_permissions = manage_permissions
|
||||
self.restrict_search = restrict_search
|
||||
db = auth.db
|
||||
table_definitions = {
|
||||
'wiki_page':{
|
||||
'args':[
|
||||
Field('slug',
|
||||
requires=[IS_SLUG(),
|
||||
IS_NOT_IN_DB(db,'wiki_page.slug')],
|
||||
readable=False,writable=False),
|
||||
Field('title',unique=True),
|
||||
Field('body','text',notnull=True),
|
||||
Field('tags','list:string'),
|
||||
Field('can_read','list:string',
|
||||
writable=perms,
|
||||
readable=perms,
|
||||
default=[Wiki.everybody]),
|
||||
Field('can_edit', 'list:string',
|
||||
writable=perms,readable=perms,
|
||||
default=[Wiki.everybody]),
|
||||
table_definitions = [
|
||||
('wiki_page',{
|
||||
'args':[
|
||||
Field('slug',
|
||||
requires=[IS_SLUG(),
|
||||
IS_NOT_IN_DB(db,'wiki_page.slug')],
|
||||
readable=False,writable=False),
|
||||
Field('title',unique=True),
|
||||
Field('body','text',notnull=True),
|
||||
Field('tags','list:string'),
|
||||
Field('can_read','list:string',
|
||||
writable=perms,
|
||||
readable=perms,
|
||||
default=[Wiki.everybody]),
|
||||
Field('can_edit', 'list:string',
|
||||
writable=perms,readable=perms,
|
||||
default=[Wiki.everybody]),
|
||||
Field('changelog'),
|
||||
Field('html','text',compute=render,
|
||||
readable=False, writable=False),
|
||||
auth.signature],
|
||||
'vars':{'format':'%(title)s'}},
|
||||
'wiki_tag':{
|
||||
'args':[
|
||||
Field('name'),
|
||||
Field('wiki_page','reference wiki_page'),
|
||||
auth.signature],
|
||||
'vars':{'format':'%(name)s'}},
|
||||
'wiki_media':{
|
||||
'args':[
|
||||
Field('wiki_page','reference wiki_page'),
|
||||
Field('title',required=True),
|
||||
Field('file','upload',required=True),
|
||||
auth.signature],
|
||||
'vars':{'format':'%(title)s'}}
|
||||
}
|
||||
Field('html','text',compute=render,
|
||||
readable=False, writable=False),
|
||||
auth.signature],
|
||||
'vars':{'format':'%(title)s'}}),
|
||||
('wiki_tag',{
|
||||
'args':[
|
||||
Field('name'),
|
||||
Field('wiki_page','reference wiki_page'),
|
||||
auth.signature],
|
||||
'vars':{'format':'%(name)s'}}),
|
||||
('wiki_media',{
|
||||
'args':[
|
||||
Field('wiki_page','reference wiki_page'),
|
||||
Field('title',required=True),
|
||||
Field('filename','upload',required=True),
|
||||
auth.signature],
|
||||
'vars':{'format':'%(title)s'}})
|
||||
]
|
||||
|
||||
# define only non-existent tables
|
||||
for key, value in table_definitions.iteritems():
|
||||
for key, value in table_definitions:
|
||||
if not key in db.tables():
|
||||
db.define_table(key, *value['args'], **value['vars'])
|
||||
|
||||
@@ -4722,10 +4774,11 @@ class Wiki(object):
|
||||
db = auth.db
|
||||
page = db.wiki_page(slug=slug)
|
||||
if not (page and self.can_edit(page)): return self.not_authorized(page)
|
||||
self.auth.db.wiki_media.id.represent = lambda id,row:\
|
||||
self.auth.db.wiki_media.id.represent = lambda id,row: \
|
||||
id if not row.filename else \
|
||||
SPAN('@////%i/%s.%s' % \
|
||||
(id,IS_SLUG.urlify(row.title.split('.')[0]),
|
||||
row.file.split('.')[-1]))
|
||||
row.filename.split('.')[-1]))
|
||||
self.auth.db.wiki_media.wiki_page.default = page.id
|
||||
self.auth.db.wiki_media.wiki_page.writable = False
|
||||
content = SQLFORM.grid(
|
||||
@@ -4770,7 +4823,7 @@ class Wiki(object):
|
||||
if self.manage_permissions:
|
||||
page = db.wiki_page(media.wiki_page)
|
||||
if not self.can_read(page): return self.not_authorized(page)
|
||||
request.args = [media.file]
|
||||
request.args = [media.filename]
|
||||
return current.response.download(request,db)
|
||||
else:
|
||||
raise HTTP(404)
|
||||
@@ -4826,9 +4879,8 @@ class Wiki(object):
|
||||
URL(controller,function,args=('_pages'))))
|
||||
submenu.append((current.T('Edit Menu'),None,
|
||||
URL(controller,function,args=('_edit','wiki-menu'))))
|
||||
# if self.can_search():
|
||||
submenu.append((current.T('Search Pages'),None,
|
||||
URL(controller,function,args=('_search'))))
|
||||
submenu.append((current.T('Search Pages'),None,
|
||||
URL(controller,function,args=('_search'))))
|
||||
return menu
|
||||
|
||||
def search(self,tags=None,query=None,cloud=True,preview=True,
|
||||
@@ -4857,6 +4909,8 @@ class Wiki(object):
|
||||
query = (db.wiki_page.id==db.wiki_tag.wiki_page)&\
|
||||
(db.wiki_tag.name.belongs(tags))
|
||||
query = query|db.wiki_page.title.startswith(request.vars.q)
|
||||
if self.restrict_search and not self.manage():
|
||||
query = query&(db.wiki_page.created_by==self.auth.user_id)
|
||||
pages = db(query).select(
|
||||
*fields,**dict(orderby=orderby or ~count,
|
||||
groupby=db.wiki_page.id,
|
||||
|
||||
+1
-1
@@ -169,7 +169,7 @@ def is_valid_ip_address(address):
|
||||
return False
|
||||
else: # try validate using Regex
|
||||
match = REGEX_IPv4.match(address)
|
||||
if match and all(0<=int(math.group(i))<256 for i in (1,2,3,4)):
|
||||
if match and all(0<=int(match.group(i))<256 for i in (1,2,3,4)):
|
||||
return True
|
||||
return False
|
||||
elif hasattr(socket,'inet_pton'): # assume IPv6, try using the OS
|
||||
|
||||
+28
-10
@@ -462,12 +462,13 @@ class IS_IN_DB(Validator):
|
||||
groupby = self.groupby
|
||||
distinct = self.distinct
|
||||
dd = dict(orderby=orderby, groupby=groupby,
|
||||
distinct=distinct, cache=self.cache)
|
||||
distinct=distinct, cache=self.cache,
|
||||
cacheable=True)
|
||||
records = self.dbset(table).select(*fields, **dd)
|
||||
else:
|
||||
orderby = self.orderby or \
|
||||
reduce(lambda a,b:a|b,(f for f in fields if not f.name=='id'))
|
||||
dd = dict(orderby=orderby, cache=self.cache)
|
||||
dd = dict(orderby=orderby, cache=self.cache, cacheable=True)
|
||||
records = self.dbset(table).select(table.ALL, **dd)
|
||||
self.theset = [str(r[self.kfield]) for r in records]
|
||||
if isinstance(self.label,str):
|
||||
@@ -488,6 +489,8 @@ class IS_IN_DB(Validator):
|
||||
table = self.dbset.db[self.ktable]
|
||||
field = table[self.kfield]
|
||||
if self.multiple:
|
||||
if self._and:
|
||||
raise NotImplementedError
|
||||
if isinstance(value,list):
|
||||
values=value
|
||||
elif value:
|
||||
@@ -497,8 +500,20 @@ class IS_IN_DB(Validator):
|
||||
if isinstance(self.multiple,(tuple,list)) and \
|
||||
not self.multiple[0]<=len(values)<self.multiple[1]:
|
||||
return (values, translate(self.error_message))
|
||||
if self.dbset(field.belongs(values)).count()==len(values):
|
||||
return (values, None)
|
||||
if self.theset:
|
||||
if not [v for v in values if not v in self.theset]:
|
||||
return (values, None)
|
||||
else:
|
||||
from dal import GoogleDatastoreAdapter
|
||||
def count(values, s=self.dbset, f=field):
|
||||
return s(f.belongs(map(int,values))).count()
|
||||
if isinstance(self.dbset.db._adapter, GoogleDatastoreAdapter):
|
||||
range_ids = range(0,len(ids),30)
|
||||
total = sum(count(values[i:i+30]) for i in range_ids)
|
||||
if total == len(values):
|
||||
return (values, None)
|
||||
elif count(values) == len(values):
|
||||
return (values, None)
|
||||
elif self.theset:
|
||||
if str(value) in self.theset:
|
||||
if self._and:
|
||||
@@ -2329,11 +2344,12 @@ class IS_LIST_OF(Validator):
|
||||
new_value = []
|
||||
if self.other:
|
||||
for item in ivalue:
|
||||
(v, e) = self.other(item)
|
||||
if e:
|
||||
return (value, e)
|
||||
else:
|
||||
new_value.append(v)
|
||||
if item.strip():
|
||||
(v, e) = self.other(item)
|
||||
if e:
|
||||
return (ivalue, e)
|
||||
else:
|
||||
new_value.append(v)
|
||||
ivalue = new_value
|
||||
return (ivalue, None)
|
||||
|
||||
@@ -2592,7 +2608,9 @@ class LazyCrypt(object):
|
||||
key = self.crypt.key
|
||||
else:
|
||||
key = ''
|
||||
if stored_password.count('$')==2:
|
||||
if stored_password is None:
|
||||
return False
|
||||
elif stored_password.count('$')==2:
|
||||
(digest_alg, salt, hash) = stored_password.split('$')
|
||||
h = simple_hash(self.password, key, salt, digest_alg)
|
||||
temp_pass = '%s$%s$%s' % (digest_alg, salt, h)
|
||||
|
||||
@@ -154,6 +154,8 @@ class Web2pyService(Service):
|
||||
def web2py_windows_service_handler(argv=None, opt_file='options'):
|
||||
path = os.path.dirname(__file__)
|
||||
web2py_path = up(path)
|
||||
if web2py_path.endswith('.zip'): # in case bianry distro 'library.zip'
|
||||
web2py_path = os.path.dirname(web2py_path)
|
||||
os.chdir(web2py_path)
|
||||
classstring = os.path.normpath(
|
||||
os.path.join(web2py_path,'gluon.winservice.Web2pyService'))
|
||||
|
||||
+30
-5
@@ -31,16 +31,41 @@ routes_app = ((r'/(?P<app>welcome|admin|app)\b.*', r'\g<app>'),
|
||||
# routes_in=( (r'/static/(?P<file>[\w./-]+)', r'/init/static/\g<file>') )
|
||||
#
|
||||
|
||||
routes_in = ((r'.*:/favicon.ico', r'/examples/static/favicon.ico'),
|
||||
(r'.*:/robots.txt', r'/examples/static/robots.txt'),
|
||||
((r'.*http://otherdomain.com.* (?P<any>.*)', r'/app/ctr\g<any>')))
|
||||
BASE = '' # optonal prefix for incoming URLs
|
||||
|
||||
routes_in = (
|
||||
# do not reroute admin unless you want to disable it
|
||||
(BASE+'/admin/?$anything','/admin/$anything'),
|
||||
# do not reroute appadmin unless you want to disable it
|
||||
(BASE+'/$app/appadmin/?$anything','/$app/appadmin/$anything'),
|
||||
# do not reroute static files
|
||||
(BASE+'/$app/static/?$anything','/$app/static/$anything'),
|
||||
# reroute favicon and robots, use exable for lack of better choice
|
||||
('/favicon.ico', '/examples/static/favicon.ico'),
|
||||
('/robots.txt', '/examples/static/robots.txt'),
|
||||
# do other stuff
|
||||
((r'.*http://otherdomain.com.* (?P<any>.*)', r'/app/ctr\g<any>')),
|
||||
# remove the BASE prefix
|
||||
(BASE+'/$anything','/$anything'),
|
||||
)
|
||||
|
||||
# routes_out, like routes_in translates URL paths created with the web2py URL()
|
||||
# function in the same manner that route_in translates inbound URL paths.
|
||||
#
|
||||
|
||||
routes_out = ((r'.*http://otherdomain.com.* /app/ctr(?P<any>.*)', r'\g<any>'),
|
||||
(r'/app(?P<any>.*)', r'\g<any>'))
|
||||
routes_out = (
|
||||
# do not reroute admin unless you want to disable it
|
||||
('/admin/$anything', BASE+'/admin/?$anything'),
|
||||
# do not reroute appadmin unless you want to disable it
|
||||
('/$app/appadmin/$anything',BASE+'/$app/appadmin/$anything'),
|
||||
# do not reroute static files
|
||||
('/$app/static/$anything', BASE+'/$app/static/$anything'),
|
||||
# do other stuff
|
||||
(r'.*http://otherdomain.com.* /app/ctr(?P<any>.*)', r'\g<any>'),
|
||||
(r'/app(?P<any>.*)', r'\g<any>'),
|
||||
# restore the BASE prefix
|
||||
('/$anything',BASE+'/$anything'),
|
||||
)
|
||||
|
||||
# Specify log level for rewrite's debug logging
|
||||
# Possible values: debug, info, warning, error, critical (loglevels),
|
||||
|
||||
@@ -6,7 +6,7 @@ echo "This script will:
|
||||
5) overwrite /etc/apache2/sites-available/default
|
||||
6) restart apache.
|
||||
|
||||
You may want to read this cript before running it.
|
||||
You may want to read this script before running it.
|
||||
|
||||
Press a key to continue...[ctrl+C to abort]"
|
||||
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
## launch with python web2py.py -S myapp -R scripts/zip_static_files.py
|
||||
|
||||
ALLOWED_EXTS = ['.css', '.js']
|
||||
import os
|
||||
import gzip
|
||||
static_path = os.path.abspath(os.path.join(request.folder, 'static'))
|
||||
filelist = []
|
||||
for root, dir, files in os.walk(static_path):
|
||||
for file in files:
|
||||
filelist.append(os.path.join(root, file))
|
||||
tsave = 0
|
||||
for fi in filelist:
|
||||
extension = os.path.splitext(fi)
|
||||
extension = len(extension) > 1 and extension[1] or None
|
||||
if not extension or extension not in ALLOWED_EXTS:
|
||||
print 'skipping %s' % os.path.basename(fi)
|
||||
continue
|
||||
fstats = os.stat(fi)
|
||||
atime, mtime = fstats.st_atime, fstats.st_mtime
|
||||
gfi = fi + '.gz'
|
||||
print 'gzipping %s to %s' % (os.path.basename(fi), os.path.basename(gfi))
|
||||
f_in = open(fi, 'rb')
|
||||
f_out = gzip.open(gfi, 'wb')
|
||||
f_out.writelines(f_in)
|
||||
f_out.close()
|
||||
f_in.close()
|
||||
os.utime(gfi, (atime,mtime))
|
||||
saved = fstats.st_size - os.stat(gfi).st_size
|
||||
tsave+= saved
|
||||
|
||||
print 'saved %s KB' % (int(tsave)/1000.0)
|
||||
Reference in New Issue
Block a user