Merge github.com:web2py/web2py into HEAD
This commit is contained in:
@@ -114,12 +114,12 @@ pip:
|
||||
run:
|
||||
python2.5 web2py.py -a hello
|
||||
commit:
|
||||
python web2py.py --run_system_tests
|
||||
make src
|
||||
echo '' > NEWINSTALL
|
||||
hg commit -m "$(S)"
|
||||
#bzr commit -m "$(S)"
|
||||
git commit -a -m "$(S)"
|
||||
python web2py.py --run_system_tests
|
||||
push:
|
||||
hg push
|
||||
git push
|
||||
|
||||
@@ -1 +1 @@
|
||||
Version 2.00.0 (2012-07-06 11:47:22) dev
|
||||
Version 2.00.0 (2012-07-19 16:56:40) dev
|
||||
|
||||
@@ -197,7 +197,7 @@ def select():
|
||||
_name='update_fields', _value=request.vars.update_fields
|
||||
or '')), TR(T('Delete:'), INPUT(_name='delete_check',
|
||||
_class='delete', _type='checkbox', value=False), ''),
|
||||
TR('', '', INPUT(_type='submit', _value='submit'))),
|
||||
TR('', '', INPUT(_type='submit', _value=T('submit')))),
|
||||
_action=URL(r=request,args=request.args))
|
||||
if request.vars.csvfile != None:
|
||||
try:
|
||||
@@ -218,10 +218,10 @@ def select():
|
||||
if form.vars.update_check and form.vars.update_fields:
|
||||
db(query).update(**eval_in_global_env('dict(%s)'
|
||||
% form.vars.update_fields))
|
||||
response.flash = T('%s rows updated', nrows)
|
||||
response.flash = T('%s %%{row} updated', nrows)
|
||||
elif form.vars.delete_check:
|
||||
db(query).delete()
|
||||
response.flash = T('%s rows deleted', nrows)
|
||||
response.flash = T('%s %%{row} deleted', nrows)
|
||||
nrows = db(query).count()
|
||||
if orderby:
|
||||
rows = db(query,ignore_common_filters=True).select(limitby=(start, stop), orderby=eval_in_global_env(orderby))
|
||||
|
||||
@@ -8,11 +8,16 @@ if EXPERIMENTAL_STUFF:
|
||||
response.view = response.view.replace('default/','default.mobile/')
|
||||
response.menu = []
|
||||
|
||||
import re
|
||||
from gluon.admin import *
|
||||
from gluon.fileutils import abspath, read_file, write_file
|
||||
from glob import glob
|
||||
import shutil
|
||||
import platform
|
||||
from gluon.languages import (regex_language, read_possible_languages,
|
||||
read_possible_plurals, lang_sampling,
|
||||
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']:
|
||||
session.flash = T('disabled in demo mode')
|
||||
@@ -186,14 +191,14 @@ def site():
|
||||
elif file_or_appurl and request.vars.filename:
|
||||
# fetch an application via URL or file upload
|
||||
f = None
|
||||
if request.vars.appurl is not '':
|
||||
if request.vars.appurl:
|
||||
try:
|
||||
f = urllib.urlopen(request.vars.appurl)
|
||||
except Exception, e:
|
||||
session.flash = DIV(T('Unable to download app because:'),PRE(str(e)))
|
||||
redirect(URL(r=request))
|
||||
fname = request.vars.appurl
|
||||
elif request.vars.file is not '':
|
||||
elif request.vars.file:
|
||||
f = request.vars.file.file
|
||||
fname = request.vars.file.filename
|
||||
|
||||
@@ -247,7 +252,7 @@ def report_progress(app):
|
||||
counter += int(m[1])
|
||||
events.append([days,counter])
|
||||
return events
|
||||
|
||||
|
||||
|
||||
def pack():
|
||||
app = get_app()
|
||||
@@ -357,7 +362,7 @@ def delete():
|
||||
sender = sender[0]
|
||||
|
||||
if 'nodelete' in request.vars:
|
||||
redirect(URL(sender))
|
||||
redirect(URL(sender, anchor=request.vars.id))
|
||||
elif 'delete' in request.vars:
|
||||
try:
|
||||
full_path = apath(filename, r=request)
|
||||
@@ -369,7 +374,7 @@ def delete():
|
||||
except Exception:
|
||||
session.flash = T('unable to delete file "%(filename)s"',
|
||||
dict(filename=filename))
|
||||
redirect(URL(sender))
|
||||
redirect(URL(sender, anchor=request.vars.id2))
|
||||
return dict(filename=filename, sender=sender)
|
||||
|
||||
def enable():
|
||||
@@ -384,22 +389,25 @@ def enable():
|
||||
|
||||
def peek():
|
||||
""" Visualize object code """
|
||||
app = get_app()
|
||||
app = get_app(request.vars.app)
|
||||
filename = '/'.join(request.args)
|
||||
if request.vars.app:
|
||||
path = abspath(filename, gluon=False)
|
||||
else:
|
||||
path = apath(filename, r=request)
|
||||
try:
|
||||
data = safe_read(apath(filename, r=request)).replace('\r','')
|
||||
data = safe_read(path).replace('\r','')
|
||||
except IOError:
|
||||
session.flash = T('file does not exist')
|
||||
redirect(URL('site'))
|
||||
|
||||
extension = filename[filename.rfind('.') + 1:].lower()
|
||||
|
||||
return dict(app=request.args[0],
|
||||
return dict(app=app,
|
||||
filename=filename,
|
||||
data=data,
|
||||
extension=extension)
|
||||
|
||||
|
||||
def test():
|
||||
""" Execute controller tests """
|
||||
app = get_app()
|
||||
@@ -428,14 +436,18 @@ def search():
|
||||
files2 = glob(os.path.join(path,'*/*.html'))
|
||||
files3 = glob(os.path.join(path,'*/*/*.html'))
|
||||
files=[x[len(path)+1:].replace('\\','/') for x in files1+files2+files3 if match(x,keywords)]
|
||||
return response.json({'files':files})
|
||||
return response.json(dict(files=files, message=T.M('Searching: **%s** %%{file}', len(files))))
|
||||
|
||||
def edit():
|
||||
""" File edit handler """
|
||||
# Load json only if it is ajax edited...
|
||||
app = get_app()
|
||||
app = get_app(request.vars.app)
|
||||
filename = '/'.join(request.args)
|
||||
# Try to discover the file type
|
||||
if request.vars.app:
|
||||
path = abspath(filename)
|
||||
else:
|
||||
path = apath(filename, r=request)
|
||||
# Try to discover the file type
|
||||
if filename[-3:] == '.py':
|
||||
filetype = 'python'
|
||||
elif filename[-5:] == '.html':
|
||||
@@ -450,9 +462,6 @@ def edit():
|
||||
filetype = 'html'
|
||||
|
||||
# ## check if file is not there
|
||||
|
||||
path = apath(filename, r=request)
|
||||
|
||||
if ('revert' in request.vars) and os.path.exists(path + '.bak'):
|
||||
try:
|
||||
data = safe_read(path + '.bak')
|
||||
@@ -526,8 +535,8 @@ def edit():
|
||||
except:
|
||||
ex_name = 'unknown exception!'
|
||||
response.flash = DIV(T('failed to compile file because:'), BR(),
|
||||
B(ex_name), T(' at line %s') % e.lineno,
|
||||
offset and T(' at char %s') % offset or '',
|
||||
B(ex_name), ' '+T('at line %s', e.lineno),
|
||||
offset and ' '+T('at char %s', offset) or '',
|
||||
PRE(str(e)))
|
||||
|
||||
if data_or_revert and request.args[1] == 'modules':
|
||||
@@ -568,7 +577,7 @@ def edit():
|
||||
for v in viewlist:
|
||||
vf = os.path.split(v)[-1]
|
||||
vargs = "/".join([viewpath.replace(os.sep,"/"),vf])
|
||||
editviewlinks.append(A(T(vf.split(".")[0]),\
|
||||
editviewlinks.append(A(vf.split(".")[0],\
|
||||
_href=URL('edit',args=[vargs])))
|
||||
|
||||
if len(request.args) > 2 and request.args[1] == 'controllers':
|
||||
@@ -672,29 +681,39 @@ def edit_language():
|
||||
""" Edit language file """
|
||||
app = get_app()
|
||||
filename = '/'.join(request.args)
|
||||
from gluon.languages import read_dict, write_dict
|
||||
strings = read_dict(apath(filename, r=request))
|
||||
keys = sorted(strings.keys(),lambda x,y: cmp(x.lower(), y.lower()))
|
||||
|
||||
if '__corrupted__' in strings:
|
||||
form = SPAN(strings['__corrupted__'],_class='error')
|
||||
return dict(filename=filename, form=form)
|
||||
|
||||
keys = sorted(strings.keys(),lambda x,y: cmp(unicode(x,'utf-8').lower(), unicode(y,'utf-8').lower()))
|
||||
rows = []
|
||||
rows.append(H2(T('Original/Translation')))
|
||||
|
||||
for key in keys:
|
||||
name = md5_hash(key)
|
||||
if key==strings[key]:
|
||||
_class='untranslated'
|
||||
s = strings[key]
|
||||
(prefix, sep, key) = key.partition('\x01')
|
||||
if sep:
|
||||
prefix = SPAN(prefix+': ', _style='color: blue;')
|
||||
k = key
|
||||
else:
|
||||
_class='translated'
|
||||
(k, prefix) = (prefix, '')
|
||||
|
||||
_class='untranslated' if k==s else 'translated'
|
||||
|
||||
if len(key) <= 40:
|
||||
elem = INPUT(_type='text', _name=name,value=strings[key],
|
||||
elem = INPUT(_type='text', _name=name, value=s,
|
||||
_size=70,_class=_class)
|
||||
else:
|
||||
elem = TEXTAREA(_name=name, value=strings[key], _cols=70,
|
||||
elem = TEXTAREA(_name=name, value=s, _cols=70,
|
||||
_rows=5, _class=_class)
|
||||
|
||||
# Making the short circuit compatible with <= python2.4
|
||||
k = (strings[key] != key) and key or B(key)
|
||||
k = (s != k) and k or B(k)
|
||||
|
||||
rows.append(P(k, BR(), elem, TAG.BUTTON(T('delete'),
|
||||
rows.append(P(prefix, k, BR(), elem, TAG.BUTTON(T('delete'),
|
||||
_onclick='return delkey("%s")' % name), _id=name))
|
||||
|
||||
rows.append(INPUT(_type='submit', _value=T('update')))
|
||||
@@ -710,6 +729,53 @@ def edit_language():
|
||||
redirect(URL(r=request,args=request.args))
|
||||
return dict(app=request.args[0], filename=filename, form=form)
|
||||
|
||||
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
|
||||
nplurals = int(request.vars.nplurals)-1 # plural forms quantity
|
||||
xnplurals = xrange(nplurals)
|
||||
|
||||
if '__corrupted__' in plurals:
|
||||
# show error message and exit
|
||||
form = SPAN(plurals['__corrupted__'],_class='error')
|
||||
return dict(filename=filename, form=form)
|
||||
|
||||
keys = sorted(plurals.keys(),lambda x,y: cmp(unicode(x,'utf-8').lower(), unicode(y,'utf-8').lower()))
|
||||
rows = []
|
||||
|
||||
row=[T("Singular Form")]
|
||||
row.extend([T("Plural Form #%s", n+1) for n in xnplurals])
|
||||
table=TABLE(THEAD(TR(row)))
|
||||
|
||||
for key in keys:
|
||||
name = md5_hash(key)
|
||||
forms = plurals[key]
|
||||
|
||||
if len(forms) < nplurals:
|
||||
forms.extend(None for i in xrange(nplurals-len(forms)))
|
||||
|
||||
row = [B(key)]
|
||||
row.extend([INPUT(_type='text', _name=name+'_'+str(n), value=forms[n], _size=20) for n in xnplurals])
|
||||
row.append(TD(TAG.BUTTON(T('delete'), _onclick='return delkey("%s")' % name)))
|
||||
rows.append(TR(row, _id=name))
|
||||
if rows:
|
||||
table.append(TBODY(rows))
|
||||
rows=[table, INPUT(_type='submit', _value=T('update'))]
|
||||
form = FORM(*rows)
|
||||
if form.accepts(request.vars, keepvalues=True):
|
||||
new_plurals = dict()
|
||||
for key in keys:
|
||||
name = md5_hash(key)
|
||||
if form.vars[name+'_0']==chr(127): continue
|
||||
new_plurals[key] = [form.vars[name+'_'+str(n)] for n in xnplurals]
|
||||
write_plural_dict(apath(filename, r=request), new_plurals)
|
||||
session.flash = T('file saved on %(time)s', dict(time=time.ctime()))
|
||||
redirect(URL(r=request, args=request.args, vars=dict(nplurals=request.vars.nplurals)))
|
||||
return dict(app=request.args[0], filename=filename, form=form)
|
||||
|
||||
|
||||
def about():
|
||||
""" Read about info """
|
||||
@@ -794,7 +860,30 @@ def design():
|
||||
statics.sort()
|
||||
|
||||
# Get all languages
|
||||
languages = listdir(apath('%s/languages/' % app, r=request), '[\w-]*\.py')
|
||||
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=read_possible_plurals()
|
||||
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[1],plural[3])
|
||||
else:
|
||||
plural_rules[langfile]=(0,lang,'plural_rules-%s.py'%lang,'')
|
||||
|
||||
plurals = listdir(apath('%s/languages/' % app, r=request),
|
||||
'^plural-[\w-]+\.py$')
|
||||
|
||||
#Get crontab
|
||||
cronfolder = apath('%s/cron' % app, r=request)
|
||||
@@ -821,6 +910,8 @@ def design():
|
||||
include=include,
|
||||
statics=filter_plugins(statics,plugins),
|
||||
languages=languages,
|
||||
plurals=plurals,
|
||||
plural_rules=plural_rules,
|
||||
crontab=crontab,
|
||||
plugins=plugins)
|
||||
|
||||
@@ -830,7 +921,7 @@ def delete_plugin():
|
||||
plugin = request.args(1)
|
||||
plugin_name='plugin_'+plugin
|
||||
if 'nodelete' in request.vars:
|
||||
redirect(URL('design',args=app))
|
||||
redirect(URL('design', args=app, anchor=request.vars.id))
|
||||
elif 'delete' in request.vars:
|
||||
try:
|
||||
for folder in ['models','views','controllers','static','modules']:
|
||||
@@ -847,7 +938,7 @@ def delete_plugin():
|
||||
except Exception:
|
||||
session.flash = T('unable to delete file plugin "%(plugin)s"',
|
||||
dict(plugin=plugin))
|
||||
redirect(URL('design',args=request.args(0)))
|
||||
redirect(URL('design', args=request.args(0), anchor=request.vars.id2))
|
||||
return dict(plugin=plugin)
|
||||
|
||||
def plugin():
|
||||
@@ -909,7 +1000,10 @@ def plugin():
|
||||
statics.sort()
|
||||
|
||||
# Get all languages
|
||||
languages = listdir(apath('%s/languages/' % app, r=request), '[\w-]*\.py')
|
||||
languages = sorted([lang+'.py' for lang, info in
|
||||
T.get_possible_languages_info().iteritems()
|
||||
if info[2]!=0]) # info[2] is langfile_mtime:
|
||||
# get only existed files
|
||||
|
||||
#Get crontab
|
||||
crontab = apath('%s/cron/crontab' % app, r=request)
|
||||
@@ -937,24 +1031,56 @@ def plugin():
|
||||
def create_file():
|
||||
""" Create files handler """
|
||||
try:
|
||||
app = get_app(name=request.vars.location.split('/')[0])
|
||||
path = apath(request.vars.location, r=request)
|
||||
anchor='#'+request.vars.id if request.vars.id else ''
|
||||
if request.vars.app:
|
||||
app = get_app(request.vars.app)
|
||||
path = abspath(request.vars.location, gluon=False)
|
||||
else:
|
||||
app = get_app(name=request.vars.location.split('/')[0])
|
||||
path = apath(request.vars.location, r=request)
|
||||
filename = re.sub('[^\w./-]+', '_', request.vars.filename)
|
||||
if path[-7:] == '/rules/':
|
||||
# Handle plural rules files
|
||||
if len(filename) == 0:
|
||||
raise SyntaxError
|
||||
if not filename[-3:] == '.py':
|
||||
filename += '.py'
|
||||
lang = re.match('^plural_rules-(.*)\.py$',filename).group(1)
|
||||
langinfo = read_possible_languages(apath(app, r=request))[lang]
|
||||
text = dedent("""
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf8 -*-
|
||||
# Plural-Forms for %(lang)s (%(langname)s)
|
||||
|
||||
if path[-11:] == '/languages/':
|
||||
nplurals=2 # for example, English language has 2 forms:
|
||||
# 1 singular and 1 plural
|
||||
|
||||
# Determine plural_id for number *n* as sequence of positive
|
||||
# integers: 0,1,...
|
||||
# NOTE! For singular form ALWAYS return plural_id = 0
|
||||
get_plural_id = lambda n: int(n != 1)
|
||||
|
||||
# Construct and return plural form of *word* using
|
||||
# *plural_id* (which ALWAYS>0). This function will be executed
|
||||
# for words (or phrases) not found in plural_dict dictionary.
|
||||
# By default this function simply returns word in singular:
|
||||
construct_plural_form = lambda word, plural_id: word
|
||||
""")[1:] % dict(lang=langinfo[0], langname=langinfo[1])
|
||||
|
||||
elif path[-11:] == '/languages/':
|
||||
# Handle language files
|
||||
if len(filename) == 0:
|
||||
raise SyntaxError
|
||||
if not filename[-3:] == '.py':
|
||||
filename += '.py'
|
||||
app = path.split('/')[-3]
|
||||
path=os.path.join(apath(app, r=request),'languages',filename)
|
||||
if not os.path.exists(path):
|
||||
safe_write(path, '')
|
||||
# create language xx[-yy].py file:
|
||||
findT(apath(app, r=request), filename[:-3])
|
||||
session.flash = T('language file "%(filename)s" created/updated',
|
||||
dict(filename=filename))
|
||||
redirect(request.vars.sender)
|
||||
dict(filename=filename))
|
||||
redirect(request.vars.sender+anchor)
|
||||
|
||||
elif path[-8:] == '/models/':
|
||||
# Handle python models
|
||||
@@ -988,13 +1114,12 @@ def create_file():
|
||||
if len(filename) == 5:
|
||||
raise SyntaxError
|
||||
|
||||
msg = T('This is the %(filename)s template',
|
||||
dict(filename=filename))
|
||||
msg = T('This is the %(filename)s template', dict(filename=filename))
|
||||
if extension == 'html':
|
||||
text = dedent("""
|
||||
{{extend 'layout.html'}}
|
||||
<h1>%s</h1>
|
||||
{{=BEAUTIFY(response._vars)}}""" % msg)
|
||||
{{=BEAUTIFY(response._vars)}}""" % msg)[1:]
|
||||
else:
|
||||
generic = os.path.join(path,'generic.'+extension)
|
||||
if os.path.exists(generic):
|
||||
@@ -1015,14 +1140,14 @@ def create_file():
|
||||
text = dedent("""
|
||||
#!/usr/bin/env python
|
||||
# coding: utf8
|
||||
from gluon import *\n""")
|
||||
from gluon import *\n""")[1:]
|
||||
|
||||
elif path[-8:] == '/static/':
|
||||
if request.vars.plugin and not filename.startswith('plugin_%s/' % request.vars.plugin):
|
||||
filename = 'plugin_%s/%s' % (request.vars.plugin, filename)
|
||||
text = ''
|
||||
else:
|
||||
redirect(request.vars.sender)
|
||||
redirect(request.vars.sender+anchor)
|
||||
|
||||
full_filename = os.path.join(path, filename)
|
||||
dirpath = os.path.dirname(full_filename)
|
||||
@@ -1037,18 +1162,20 @@ def create_file():
|
||||
log_progress(app,'CREATE',filename)
|
||||
session.flash = T('file "%(filename)s" created',
|
||||
dict(filename=full_filename[len(path):]))
|
||||
vars={}
|
||||
if request.vars.id: vars['id']=request.vars.id
|
||||
if request.vars.app: vars['app']=request.vars.app
|
||||
redirect(URL('edit',
|
||||
args=[os.path.join(request.vars.location, filename)]))
|
||||
args=[os.path.join(request.vars.location, filename)], vars=vars))
|
||||
except Exception, e:
|
||||
if not isinstance(e,HTTP):
|
||||
session.flash = T('cannot create file')
|
||||
|
||||
redirect(request.vars.sender)
|
||||
redirect(request.vars.sender+anchor)
|
||||
|
||||
|
||||
def upload_file():
|
||||
""" File uploading handler """
|
||||
|
||||
try:
|
||||
filename = None
|
||||
app = get_app(name=request.vars.location.split('/')[0])
|
||||
@@ -1121,7 +1248,7 @@ def errors():
|
||||
|
||||
hash2error = dict()
|
||||
|
||||
for fn in listdir(errors_path, '^\w.*'):
|
||||
for fn in listdir(errors_path, '^[a-fA-F0-9.\-]+$'):
|
||||
fullpath = os.path.join(errors_path, fn)
|
||||
if not os.path.isfile(fullpath): continue
|
||||
try:
|
||||
@@ -1368,7 +1495,7 @@ def twitter():
|
||||
try:
|
||||
if TWITTER_HASH:
|
||||
page = urllib.urlopen("http://search.twitter.com/search.json?q=%%40%s" % TWITTER_HASH).read()
|
||||
data = sj.loads(page , encoding="utf-8")['results']
|
||||
data = sj.loads(page, encoding="utf-8")['results']
|
||||
d = dict()
|
||||
for e in data:
|
||||
d[e["id"]] = e
|
||||
|
||||
@@ -42,7 +42,7 @@ def commit():
|
||||
path = apath(app, r=request)
|
||||
repo = hg_repo(path)
|
||||
form = FORM('Comment:',INPUT(_name='comment',requires=IS_NOT_EMPTY()),
|
||||
INPUT(_type='submit',_value='Commit'))
|
||||
INPUT(_type='submit',_value=T('Commit')))
|
||||
if form.accepts(request.vars,session):
|
||||
oldid = repo[repo.lookup('.')]
|
||||
addremove(repo)
|
||||
@@ -69,7 +69,7 @@ def revision():
|
||||
repo = hg_repo(path)
|
||||
revision = request.args(1)
|
||||
ctx=repo.changectx(revision)
|
||||
form=FORM(INPUT(_type='submit',_value='revert'))
|
||||
form=FORM(INPUT(_type='submit',_value=T('Revert')))
|
||||
if form.accepts(request.vars):
|
||||
hg.update(repo, revision)
|
||||
session.flash = "reverted to revision %s" % ctx.rev()
|
||||
|
||||
@@ -3,15 +3,15 @@ from distutils import dir_util
|
||||
try:
|
||||
from git import *
|
||||
except ImportError:
|
||||
session.flash = 'requires python-git, but not installed'
|
||||
session.flash = T('requires python-git, but not installed')
|
||||
redirect(URL('default','site'))
|
||||
|
||||
def deploy():
|
||||
apps = sorted(file for file in os.listdir(apath(r=request)))
|
||||
form = SQLFORM.factory(
|
||||
Field('osrepo',default='/tmp',label='Path to local openshift repo root.',
|
||||
Field('osrepo',default='/tmp',label=T('Path to local openshift repo root.'),
|
||||
requires=EXISTS(error_message=T('directory not found'))),
|
||||
Field('osname',default='web2py',label='WSGI reference name'),
|
||||
Field('osname',default='web2py',label=T('WSGI reference name')),
|
||||
Field('applications','list:string',
|
||||
requires=IS_IN_SET(apps,multiple=True),
|
||||
label=T('web2py apps to deploy')))
|
||||
|
||||
@@ -1,27 +1,46 @@
|
||||
# coding: utf8
|
||||
{
|
||||
'!langcode!': 'af',
|
||||
'!langname!': 'Afrikaanse',
|
||||
'%Y-%m-%d': '%Y-%m-%d',
|
||||
'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
|
||||
'%s %%{row} deleted': '%s rows deleted',
|
||||
'%s %%{row} updated': '%s rows updated',
|
||||
'(requires internet access)': '(vereis internet toegang)',
|
||||
'(something like "it-it")': '(iets soos "it-it")',
|
||||
'About': 'Oor',
|
||||
'@markmin\x01Searching: **%s** %%{file}': 'Soek: **%s** lêre',
|
||||
'About': 'oor',
|
||||
'About application': 'Oor program',
|
||||
'Additional code for your application': 'Additionele kode vir u application',
|
||||
'Admin language': 'Admin taal',
|
||||
'Application name:': 'Program naam:',
|
||||
'Change admin password': 'verander admin wagwoord',
|
||||
'Check for upgrades': 'soek vir upgrades',
|
||||
'Clean': 'maak skoon',
|
||||
'Compile': 'kompileer',
|
||||
'Controllers': 'Beheerders',
|
||||
'Create': 'skep',
|
||||
'Deploy': 'deploy',
|
||||
'Deploy on Google App Engine': 'Stuur na Google App Engine toe',
|
||||
'Edit': 'wysig',
|
||||
'Edit application': 'Wysig program',
|
||||
'Errors': 'foute',
|
||||
'Help': 'hulp',
|
||||
'Install': 'installeer',
|
||||
'Installed applications': 'Geinstalleerde apps',
|
||||
'Languages': 'Tale',
|
||||
'License for': 'Lisensie vir',
|
||||
'Logout': 'logout',
|
||||
'Models': 'Modelle',
|
||||
'Modules': 'Modules',
|
||||
'New application wizard': 'Nuwe app wizard',
|
||||
'New simple application': 'Nuwe eenvoudige app',
|
||||
'Overwrite installed app': 'skryf oor geinstalleerde program',
|
||||
'Pack all': 'pack alles',
|
||||
'Plugins': 'Plugins',
|
||||
'Powered by': 'Aangedryf deur',
|
||||
'Searching:': 'Soek:',
|
||||
'Site': 'site',
|
||||
'Start wizard': 'start wizard',
|
||||
'Static files': 'Static files',
|
||||
'Sure you want to delete this object?': 'Is jy seker jy will hierde object verwyder?',
|
||||
'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',
|
||||
@@ -29,54 +48,37 @@
|
||||
'The presentations layer, views are also known as templates': 'The presentations layer, views are also known as templates',
|
||||
'There are no plugins': 'Daar is geen plugins',
|
||||
'These files are served without processing, your images go here': 'Hierdie lêre is sonder veranderinge geserved, jou images gaan hier',
|
||||
'To create a plugin, name a file/folder plugin_[name]': 'Om ''n plugin te skep, noem ''n lêer/gids plugin_[name]',
|
||||
'To create a plugin, name a file/folder plugin_[name]': 'Om n plugin te skep, noem n lêer/gids plugin_[name]',
|
||||
'Translation strings for the application': 'Vertaling woorde vir die program',
|
||||
'Uninstall': 'verwyder',
|
||||
'Upload & install packed application': 'Oplaai & install gepakte program',
|
||||
'Upload a package:': 'Oplaai ''n package:',
|
||||
'Upload a package:': 'Oplaai n package:',
|
||||
'Use an url:': 'Gebruik n url:',
|
||||
'Views': 'Views',
|
||||
'About': 'oor',
|
||||
'administrative interface': 'administrative interface',
|
||||
'and rename it:': 'en verander die naam:',
|
||||
'Change admin password': 'verander admin wagwoord',
|
||||
'Check for upgrades': 'soek vir upgrades',
|
||||
'Clean': 'maak skoon',
|
||||
'collapse/expand all': 'collapse/expand all',
|
||||
'Compile': 'kompileer',
|
||||
'controllers': 'beheerders',
|
||||
'Create': 'skep',
|
||||
'create file with filename:': 'skep lêer met naam:',
|
||||
'created by': 'geskep deur',
|
||||
'crontab': 'crontab',
|
||||
'currently running': 'loop tans',
|
||||
'database administration': 'database administration',
|
||||
'Deploy': 'deploy',
|
||||
'direction: ltr': 'direction: ltr',
|
||||
'download layouts': 'aflaai layouts',
|
||||
'download plugins': 'aflaai plugins',
|
||||
'Edit': 'wysig',
|
||||
'Errors': 'foute',
|
||||
'exposes': 'exposes',
|
||||
'extends': 'extends',
|
||||
'files': 'lêre',
|
||||
'filter': 'filter',
|
||||
'Help': 'hulp',
|
||||
'includes': 'includes',
|
||||
'Install': 'installeer',
|
||||
'languages': 'tale',
|
||||
'loading...': 'laai...',
|
||||
'Logout': 'logout',
|
||||
'models': 'modelle',
|
||||
'modules': 'modules',
|
||||
'Overwrite installed app': 'skryf oor geinstalleerde program',
|
||||
'Pack all': 'pack alles',
|
||||
'plugins': 'plugins',
|
||||
'shell': 'shell',
|
||||
'Site': 'site',
|
||||
'Start wizard': 'start wizard',
|
||||
'static': 'static',
|
||||
'test': 'toets',
|
||||
'Uninstall': 'verwyder',
|
||||
'update all languages': 'update all languages',
|
||||
'upload': 'oplaai',
|
||||
'upload file:': 'oplaai lêer:',
|
||||
@@ -85,5 +87,3 @@
|
||||
'views': 'views',
|
||||
'web2py Recent Tweets': 'web2py Onlangse Tweets',
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,18 +1,21 @@
|
||||
# coding: utf8
|
||||
{
|
||||
'!langcode!': 'bg',
|
||||
'!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 rows deleted': '%s записите бяха изтрити',
|
||||
'%s rows updated': '%s записите бяха обновени',
|
||||
'%s %%{row} deleted': '%s записите бяха изтрити',
|
||||
'%s %%{row} updated': '%s записите бяха обновени',
|
||||
'(requires internet access)': '(requires internet access)',
|
||||
'(something like "it-it")': '(something like "it-it")',
|
||||
'@markmin\x01Searching: **%s** %%{file}': 'Searching: **%s** files',
|
||||
'A new version of web2py is available': 'A new version of web2py is available',
|
||||
'A new version of web2py is available: %s': 'A new version of web2py is available: %s',
|
||||
'ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.': 'ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.',
|
||||
'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.': 'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.',
|
||||
'ATTENTION: you cannot edit the running application!': 'ATTENTION: you cannot edit the running application!',
|
||||
'About': 'About',
|
||||
'About': 'about',
|
||||
'About application': 'About application',
|
||||
'Additional code for your application': 'Additional code for your application',
|
||||
'Admin is disabled because insecure channel': 'Admin is disabled because insecure channel',
|
||||
@@ -22,6 +25,7 @@
|
||||
'Application name:': 'Application name:',
|
||||
'Are you sure you want to delete file "%s"?': 'Are you sure you want to delete file "%s"?',
|
||||
'Are you sure you want to delete plugin "%s"?': 'Are you sure you want to delete 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"': 'Are you sure you want to uninstall application "%s"',
|
||||
'Are you sure you want to uninstall application "%s"?': 'Are you sure you want to uninstall application "%s"?',
|
||||
'Are you sure you want to upgrade web2py now?': 'Are you sure you want to upgrade web2py now?',
|
||||
@@ -29,20 +33,30 @@
|
||||
'Cannot be empty': 'Cannot be empty',
|
||||
'Cannot compile: there are errors in your app. Debug it, correct errors and try again.': 'Cannot compile: there are errors in your app. Debug it, correct errors and try again.',
|
||||
'Cannot compile: there are errors in your app:': 'Cannot compile: there are errors in your app:',
|
||||
'Change admin password': 'change admin password',
|
||||
'Check for upgrades': 'check for upgrades',
|
||||
'Check to delete': 'Check to delete',
|
||||
'Checking for upgrades...': 'Checking for upgrades...',
|
||||
'Clean': 'clean',
|
||||
'Compile': 'compile',
|
||||
'Controllers': 'Controllers',
|
||||
'Create': 'create',
|
||||
'Create new simple application': 'Create new simple application',
|
||||
'Current request': 'Current request',
|
||||
'Current response': 'Current response',
|
||||
'Current session': 'Current session',
|
||||
'DESIGN': 'DESIGN',
|
||||
'Date and Time': 'Date and Time',
|
||||
'Debug': 'Debug',
|
||||
'Delete': 'Delete',
|
||||
'Delete:': 'Delete:',
|
||||
'Deploy': 'deploy',
|
||||
'Deploy on Google App Engine': 'Deploy on Google App Engine',
|
||||
'Deploy to OpenShift': 'Deploy to OpenShift',
|
||||
'Design for': 'Design for',
|
||||
'Disable': 'Disable',
|
||||
'EDIT': 'EDIT',
|
||||
'Edit': 'edit',
|
||||
'Edit application': 'Edit application',
|
||||
'Edit current record': 'Edit current record',
|
||||
'Editing Language file': 'Editing Language file',
|
||||
@@ -50,11 +64,15 @@
|
||||
'Editing file "%s"': 'Editing file "%s"',
|
||||
'Enterprise Web Framework': 'Enterprise Web Framework',
|
||||
'Error logs for "%(app)s"': 'Error logs for "%(app)s"',
|
||||
'Errors': 'errors',
|
||||
'Exception instance attributes': 'Exception instance attributes',
|
||||
'Functions with no doctests will result in [passed] tests.': 'Functions with no doctests will result in [passed] tests.',
|
||||
'Get from URL:': 'Get from URL:',
|
||||
'Hello World': 'Здравей, свят',
|
||||
'Help': 'help',
|
||||
'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': 'Import/Export',
|
||||
'Install': 'install',
|
||||
'Installed applications': 'Installed applications',
|
||||
'Internal State': 'Internal State',
|
||||
'Invalid Query': 'Невалидна заявка',
|
||||
@@ -65,6 +83,7 @@
|
||||
'License for': 'License for',
|
||||
'Login': 'Login',
|
||||
'Login to the Administrative Interface': 'Login to the Administrative Interface',
|
||||
'Logout': 'logout',
|
||||
'Models': 'Models',
|
||||
'Modules': 'Modules',
|
||||
'NO': 'NO',
|
||||
@@ -73,17 +92,24 @@
|
||||
'New simple application': 'New simple application',
|
||||
'No databases in this application': 'No databases in this application',
|
||||
'Original/Translation': 'Original/Translation',
|
||||
'Overwrite installed app': 'overwrite installed app',
|
||||
'PAM authenticated user, cannot change password here': 'PAM authenticated user, cannot change password here',
|
||||
'Pack all': 'pack all',
|
||||
'Pack compiled': 'pack compiled',
|
||||
'Peeking at file': 'Peeking at file',
|
||||
'Plugin "%s" in application': 'Plugin "%s" in application',
|
||||
'Plugins': 'Plugins',
|
||||
'Powered by': 'Powered by',
|
||||
'Query:': 'Query:',
|
||||
'Reload routes': 'Reload routes',
|
||||
'Remove compiled': 'remove compiled',
|
||||
'Resolve Conflict file': 'Resolve Conflict file',
|
||||
'Rows in table': 'Rows in table',
|
||||
'Rows selected': 'Rows selected',
|
||||
'Running on %s': 'Running on %s',
|
||||
'Saved file hash:': 'Saved file hash:',
|
||||
'Searching:': 'Searching:',
|
||||
'Site': 'site',
|
||||
'Start wizard': 'start wizard',
|
||||
'Static files': 'Static files',
|
||||
'Sure you want to delete this object?': 'Сигурен ли си, че искаш да изтриеш този обект?',
|
||||
'TM': 'TM',
|
||||
@@ -108,17 +134,19 @@
|
||||
'Unable to download': 'Unable to download',
|
||||
'Unable to download app because:': 'Unable to download app because:',
|
||||
'Unable to download because': 'Unable to download because',
|
||||
'Uninstall': 'uninstall',
|
||||
'Update:': 'Update:',
|
||||
'Upload & install packed application': 'Upload & install packed application',
|
||||
'Upload a package:': 'Upload a package:',
|
||||
'Upload and install packed application': 'Upload and install packed application',
|
||||
'Upload existing application': 'Upload existing application',
|
||||
'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.',
|
||||
'Use an url:': 'Use an url:',
|
||||
'Version': 'Version',
|
||||
'Views': 'Views',
|
||||
'Web Framework': 'Web Framework',
|
||||
'Welcome to web2py': 'Добре дошъл в web2py',
|
||||
'YES': 'YES',
|
||||
'About': 'about',
|
||||
'additional code for your application': 'additional code for your application',
|
||||
'admin disabled because no admin password': 'admin disabled because no admin password',
|
||||
'admin disabled because not supported on google app engine': 'admin disabled because not supported on google apps engine',
|
||||
@@ -137,19 +165,14 @@
|
||||
'cache, errors and sessions cleaned': 'cache, errors and sessions cleaned',
|
||||
'cannot create file': 'cannot create file',
|
||||
'cannot upload file "%(filename)s"': 'cannot upload file "%(filename)s"',
|
||||
'Change admin password': 'change admin password',
|
||||
'check all': 'check all',
|
||||
'Check for upgrades': 'check for upgrades',
|
||||
'Clean': 'clean',
|
||||
'click here for online examples': 'щракни тук за онлайн примери',
|
||||
'click here for the administrative interface': 'щракни тук за административния интерфейс',
|
||||
'click to check for upgrades': 'click to check for upgrades',
|
||||
'code': 'code',
|
||||
'collapse/expand all': 'collapse/expand all',
|
||||
'Compile': 'compile',
|
||||
'compiled application removed': 'compiled application removed',
|
||||
'controllers': 'controllers',
|
||||
'Create': 'create',
|
||||
'create file with filename:': 'create file with filename:',
|
||||
'create new application:': 'create new application:',
|
||||
'created by': 'created by',
|
||||
@@ -165,16 +188,13 @@
|
||||
'delete': 'delete',
|
||||
'delete all checked': 'delete all checked',
|
||||
'delete plugin': 'delete plugin',
|
||||
'Deploy': 'deploy',
|
||||
'design': 'дизайн',
|
||||
'direction: ltr': 'direction: ltr',
|
||||
'done!': 'готово!',
|
||||
'download layouts': 'download layouts',
|
||||
'download plugins': 'download plugins',
|
||||
'Edit': 'edit',
|
||||
'edit controller': 'edit controller',
|
||||
'edit views:': 'edit views:',
|
||||
'Errors': 'errors',
|
||||
'export as csv file': 'export as csv file',
|
||||
'exposes': 'exposes',
|
||||
'extends': 'extends',
|
||||
@@ -189,14 +209,11 @@
|
||||
'file does not exist': 'file does not exist',
|
||||
'file saved on %(time)s': 'file saved on %(time)s',
|
||||
'file saved on %s': 'file saved on %s',
|
||||
'files': 'files',
|
||||
'filter': 'filter',
|
||||
'Help': 'help',
|
||||
'htmledit': 'htmledit',
|
||||
'includes': 'includes',
|
||||
'insert new': 'insert new',
|
||||
'insert new %s': 'insert new %s',
|
||||
'Install': 'install',
|
||||
'internal error': 'internal error',
|
||||
'invalid password': 'invalid password',
|
||||
'invalid request': 'невалидна заявка',
|
||||
@@ -206,7 +223,6 @@
|
||||
'languages updated': 'languages updated',
|
||||
'loading...': 'loading...',
|
||||
'login': 'login',
|
||||
'Logout': 'logout',
|
||||
'merge': 'merge',
|
||||
'models': 'models',
|
||||
'modules': 'modules',
|
||||
@@ -218,9 +234,6 @@
|
||||
'or import from csv file': 'or import from csv file',
|
||||
'or provide app url:': 'or provide app url:',
|
||||
'or provide application url:': 'or provide application url:',
|
||||
'Overwrite installed app': 'overwrite installed app',
|
||||
'Pack all': 'pack all',
|
||||
'Pack compiled': 'pack compiled',
|
||||
'pack plugin': 'pack plugin',
|
||||
'password changed': 'password changed',
|
||||
'plugin "%(plugin)s" deleted': 'plugin "%(plugin)s" deleted',
|
||||
@@ -229,16 +242,13 @@
|
||||
'record': 'record',
|
||||
'record does not exist': 'записът не съществува',
|
||||
'record id': 'record id',
|
||||
'Remove compiled': 'remove compiled',
|
||||
'restore': 'restore',
|
||||
'revert': 'revert',
|
||||
'save': 'save',
|
||||
'selected': 'selected',
|
||||
'session expired': 'session expired',
|
||||
'shell': 'shell',
|
||||
'Site': 'site',
|
||||
'some files could not be removed': 'some files could not be removed',
|
||||
'Start wizard': 'start wizard',
|
||||
'state': 'състояние',
|
||||
'static': 'static',
|
||||
'submit': 'submit',
|
||||
@@ -259,7 +269,6 @@
|
||||
'unable to uninstall "%s"': 'unable to uninstall "%s"',
|
||||
'unable to upgrade because "%s"': 'unable to upgrade because "%s"',
|
||||
'uncheck all': 'uncheck all',
|
||||
'Uninstall': 'uninstall',
|
||||
'update': 'update',
|
||||
'update all languages': 'update all languages',
|
||||
'upgrade web2py now': 'upgrade web2py now',
|
||||
@@ -275,5 +284,3 @@
|
||||
'web2py is up to date': 'web2py is up to date',
|
||||
'web2py upgraded; please restart it': 'web2py upgraded; please restart it',
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,12 +1,15 @@
|
||||
# coding: utf8
|
||||
{
|
||||
'!langcode!': 'de',
|
||||
'!langname!': 'Deutsch',
|
||||
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"Update" ist ein optionaler Ausdruck wie "Feld1 = \'newvalue". JOIN Ergebnisse können nicht aktualisiert oder gelöscht werden',
|
||||
'%Y-%m-%d': '%Y-%m-%d',
|
||||
'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
|
||||
'%s rows deleted': '%s Zeilen gelöscht',
|
||||
'%s rows updated': '%s Zeilen aktualisiert',
|
||||
'%s %%{row} deleted': '%s Zeilen gelöscht',
|
||||
'%s %%{row} updated': '%s Zeilen aktualisiert',
|
||||
'(requires internet access)': '(requires internet access)',
|
||||
'(something like "it-it")': '(so etwas wie "it-it")',
|
||||
'@markmin\x01Searching: **%s** %%{file}': 'Searching: **%s** files',
|
||||
'A new version of web2py is available': 'Eine neue Version von web2py ist verfügbar',
|
||||
'A new version of web2py is available: %s': 'Eine neue Version von web2py ist verfügbar: %s',
|
||||
'A new version of web2py is available: Version 1.85.3 (2010-09-18 07:07:46)\n': 'Eine neue Version von web2py ist verfügbar: Version 1.85.3 (2010-09-18 07:07:46)\n',
|
||||
@@ -32,12 +35,17 @@
|
||||
'Cannot be empty': 'Darf nicht leer sein',
|
||||
'Cannot compile: there are errors in your app. Debug it, correct errors and try again.': 'Nicht Kompilierbar:Es sind Fehler in der Anwendung. Beseitigen Sie die Fehler und versuchen Sie es erneut.',
|
||||
'Change Password': 'Passwort ändern',
|
||||
'Change admin password': 'Administrator-Passwort ändern',
|
||||
'Check for upgrades': 'check for upgrades',
|
||||
'Check to delete': 'Markiere zum löschen',
|
||||
'Checking for upgrades...': 'Auf Updates überprüfen...',
|
||||
'Clean': 'löschen',
|
||||
'Client IP': 'Client IP',
|
||||
'Compile': 'kompilieren',
|
||||
'Controller': 'Controller',
|
||||
'Controllers': 'Controller',
|
||||
'Copyright': 'Urheberrecht',
|
||||
'Create': 'erstellen',
|
||||
'Create new simple application': 'Erzeuge neue Anwendung',
|
||||
'Current request': 'Aktuelle Anfrage (request)',
|
||||
'Current response': 'Aktuelle Antwort (response)',
|
||||
@@ -48,12 +56,13 @@
|
||||
'Date and Time': 'Datum und Uhrzeit',
|
||||
'Delete': 'Löschen',
|
||||
'Delete:': 'Löschen:',
|
||||
'Deploy': 'deploy',
|
||||
'Deploy on Google App Engine': 'Auf Google App Engine installieren',
|
||||
'Description': 'Beschreibung',
|
||||
'Design for': 'Design für',
|
||||
'E-mail': 'E-mail',
|
||||
'EDIT': 'BEARBEITEN',
|
||||
'Edit': 'Bearbeiten',
|
||||
'Edit': 'bearbeiten',
|
||||
'Edit Profile': 'Bearbeite Profil',
|
||||
'Edit This App': 'Bearbeite diese Anwendung',
|
||||
'Edit application': 'Bearbeite Anwendung',
|
||||
@@ -63,6 +72,7 @@
|
||||
'Editing file "%s"': 'Bearbeite Datei "%s"',
|
||||
'Enterprise Web Framework': 'Enterprise Web Framework',
|
||||
'Error logs for "%(app)s"': 'Fehlerprotokoll für "%(app)s"',
|
||||
'Errors': 'Fehler',
|
||||
'Exception instance attributes': 'Atribute der Ausnahmeinstanz',
|
||||
'Expand Abbreviation': 'Kürzel erweitern',
|
||||
'First name': 'Vorname',
|
||||
@@ -70,11 +80,13 @@
|
||||
'Go to Matching Pair': 'gehe zum übereinstimmenden Paar',
|
||||
'Group ID': 'Gruppen ID',
|
||||
'Hello World': 'Hallo Welt',
|
||||
'Help': 'Hilfe',
|
||||
'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.': 'Falls der obere Test eine Fehler-Ticketnummer enthält deutet das auf einen Fehler in der Ausführung des Controllers hin, noch bevor der Doctest ausgeführt werden konnte. Gewöhnlich führen fehlerhafte Einrückungen oder fehlerhafter Code ausserhalb der Funktion zu solchen Fehlern. Ein grüner Titel deutet darauf hin, dass alle Test(wenn sie vorhanden sind) erfolgreich durchlaufen wurden. In diesem Fall werden die Testresultate nicht angezeigt.',
|
||||
'If you answer "yes", be patient, it may take a while to download': '',
|
||||
'If you answer yes, be patient, it may take a while to download': 'If you answer yes, be patient, it may take a while to download',
|
||||
'Import/Export': 'Importieren/Exportieren',
|
||||
'Index': 'Index',
|
||||
'Install': 'installieren',
|
||||
'Installed applications': 'Installierte Anwendungen',
|
||||
'Internal State': 'interner Status',
|
||||
'Invalid Query': 'Ungültige Abfrage',
|
||||
@@ -90,7 +102,7 @@
|
||||
'License for': 'Lizenz für',
|
||||
'Login': 'Anmelden',
|
||||
'Login to the Administrative Interface': 'An das Administrations-Interface anmelden',
|
||||
'Logout': 'Abmeldung',
|
||||
'Logout': 'abmelden',
|
||||
'Lost Password': 'Passwort vergessen',
|
||||
'Main Menu': 'Menú principal',
|
||||
'Match Pair': 'Paare finden',
|
||||
@@ -107,6 +119,9 @@
|
||||
'No databases in this application': 'Keine Datenbank in dieser Anwendung',
|
||||
'Origin': 'Herkunft',
|
||||
'Original/Translation': 'Original/Übersetzung',
|
||||
'Overwrite installed app': 'installierte Anwendungen überschreiben',
|
||||
'Pack all': 'verpacke alles',
|
||||
'Pack compiled': 'Verpacke kompiliert',
|
||||
'Password': 'Passwort',
|
||||
'Peeking at file': 'Dateiansicht',
|
||||
'Plugin "%s" in application': 'Plugin "%s" in Anwendung',
|
||||
@@ -117,6 +132,7 @@
|
||||
'Record ID': 'Datensatz ID',
|
||||
'Register': 'registrieren',
|
||||
'Registration key': 'Registrierungsschlüssel',
|
||||
'Remove compiled': 'kompilat gelöscht',
|
||||
'Reset Password key': 'Passwortschlüssel zurücksetzen',
|
||||
'Resolve Conflict file': 'bereinige Konflikt-Datei',
|
||||
'Role': 'Rolle',
|
||||
@@ -124,7 +140,8 @@
|
||||
'Rows selected': 'Zeilen ausgewählt',
|
||||
'Save via Ajax': 'via Ajax sichern',
|
||||
'Saved file hash:': 'Gespeicherter Datei-Hash:',
|
||||
'Searching:': 'Searching:',
|
||||
'Site': 'Seite',
|
||||
'Start wizard': 'start wizard',
|
||||
'Static files': 'statische Dateien',
|
||||
'Stylesheet': 'Stylesheet',
|
||||
'Sure you want to delete this object?': 'Wollen Sie das Objekt wirklich löschen?',
|
||||
@@ -154,6 +171,7 @@
|
||||
'Unable to check for upgrades': 'überprüfen von Upgrades nicht möglich',
|
||||
'Unable to download': 'herunterladen nicht möglich',
|
||||
'Unable to download app': 'herunterladen der Anwendung nicht möglich',
|
||||
'Uninstall': 'deinstallieren',
|
||||
'Update:': 'Aktualisiere:',
|
||||
'Upload & install packed application': 'Verpackte Anwendung hochladen und installieren',
|
||||
'Upload a package:': 'Upload a package:',
|
||||
@@ -172,7 +190,6 @@
|
||||
'You are successfully running web2py': 'web2by wird erfolgreich ausgeführt',
|
||||
'You can modify this application and adapt it to your needs': 'Sie können diese Anwendung verändern und Ihren Bedürfnissen anpassen',
|
||||
'You visited the url': 'Sie besuchten die URL',
|
||||
'About': 'Über',
|
||||
'additional code for your application': 'zusätzlicher Code für Ihre Anwendung',
|
||||
'admin disabled because no admin password': ' admin ist deaktiviert, weil kein Admin-Passwort gesetzt ist',
|
||||
'admin disabled because not supported on google apps engine': 'admin ist deaktiviert, es existiert dafür keine Unterstützung auf der google apps engine',
|
||||
@@ -193,20 +210,15 @@
|
||||
'call': 'call',
|
||||
'cannot create file': 'Kann Datei nicht erstellen',
|
||||
'cannot upload file "%(filename)s"': 'Kann Datei nicht Hochladen "%(filename)s"',
|
||||
'Change admin password': 'Administrator-Passwort ändern',
|
||||
'change password': 'Passwort ändern',
|
||||
'check all': 'alles auswählen',
|
||||
'Check for upgrades': 'check for upgrades',
|
||||
'Clean': 'löschen',
|
||||
'click here for online examples': 'hier klicken für online Beispiele',
|
||||
'click here for the administrative interface': 'hier klicken für die Administrationsoberfläche ',
|
||||
'click to check for upgrades': 'hier klicken um nach Upgrades zu suchen',
|
||||
'code': 'code',
|
||||
'collapse/expand all': 'collapse/expand all',
|
||||
'Compile': 'kompilieren',
|
||||
'compiled application removed': 'kompilierte Anwendung gelöscht',
|
||||
'controllers': 'Controllers',
|
||||
'Create': 'erstellen',
|
||||
'create file with filename:': 'erzeuge Datei mit Dateinamen:',
|
||||
'create new application:': 'erzeuge neue Anwendung:',
|
||||
'created by': 'created by',
|
||||
@@ -223,18 +235,15 @@
|
||||
'delete': 'löschen',
|
||||
'delete all checked': 'lösche alle markierten',
|
||||
'delete plugin': 'Plugin löschen',
|
||||
'Deploy': 'deploy',
|
||||
'design': 'design',
|
||||
'direction: ltr': 'direction: ltr',
|
||||
'documentation': 'Dokumentation',
|
||||
'done!': 'fertig!',
|
||||
'download layouts': 'download layouts',
|
||||
'download plugins': 'download plugins',
|
||||
'Edit': 'bearbeiten',
|
||||
'edit controller': 'Bearbeite Controller',
|
||||
'edit profile': 'bearbeite Profil',
|
||||
'edit views:': 'Views bearbeiten:',
|
||||
'Errors': 'Fehler',
|
||||
'escape': 'escape',
|
||||
'export as csv file': 'Exportieren als CSV-Datei',
|
||||
'exposes': 'stellt zur Verfügung',
|
||||
@@ -249,15 +258,12 @@
|
||||
'file does not exist': 'Datei existiert nicht',
|
||||
'file saved on %(time)s': 'Datei gespeichert am %(time)s',
|
||||
'file saved on %s': 'Datei gespeichert auf %s',
|
||||
'files': 'files',
|
||||
'filter': 'filter',
|
||||
'Help': 'Hilfe',
|
||||
'htmledit': 'htmledit',
|
||||
'includes': 'Einfügen',
|
||||
'index': 'index',
|
||||
'insert new': 'neu einfügen',
|
||||
'insert new %s': 'neu einfügen %s',
|
||||
'Install': 'installieren',
|
||||
'internal error': 'interner Fehler',
|
||||
'invalid password': 'Ungültiges Passwort',
|
||||
'invalid request': 'ungültige Anfrage',
|
||||
@@ -268,7 +274,6 @@
|
||||
'loading...': 'lade...',
|
||||
'located in the file': 'located in Datei',
|
||||
'login': 'anmelden',
|
||||
'Logout': 'abmelden',
|
||||
'lost password?': 'Passwort vergessen?',
|
||||
'merge': 'verbinden',
|
||||
'models': 'Modelle',
|
||||
@@ -279,9 +284,6 @@
|
||||
'or import from csv file': 'oder importieren von cvs Datei',
|
||||
'or provide app url:': 'oder geben Sie eine Anwendungs-URL an:',
|
||||
'or provide application url:': 'oder geben Sie eine Anwendungs-URL an:',
|
||||
'Overwrite installed app': 'installierte Anwendungen überschreiben',
|
||||
'Pack all': 'verpacke alles',
|
||||
'Pack compiled': 'Verpacke kompiliert',
|
||||
'pack plugin': 'Plugin verpacken',
|
||||
'please wait!': 'bitte warten!',
|
||||
'plugins': 'plugins',
|
||||
@@ -290,16 +292,13 @@
|
||||
'record does not exist': 'Datensatz existiert nicht',
|
||||
'record id': 'Datensatz id',
|
||||
'register': 'Registrierung',
|
||||
'Remove compiled': 'kompilat gelöscht',
|
||||
'restore': 'wiederherstellen',
|
||||
'revert': 'zurückkehren',
|
||||
'save': 'sichern',
|
||||
'selected': 'ausgewählt(e)',
|
||||
'session expired': 'Sitzung Abgelaufen',
|
||||
'shell': 'shell',
|
||||
'Site': 'Seite',
|
||||
'some files could not be removed': 'einige Dateien konnten nicht gelöscht werden',
|
||||
'Start wizard': 'start wizard',
|
||||
'state': 'Status',
|
||||
'static': 'statische Dateien',
|
||||
'submit': 'Absenden',
|
||||
@@ -322,7 +321,6 @@
|
||||
'unable to parse csv file': 'analysieren der cvs Datei nicht möglich',
|
||||
'unable to uninstall "%s"': 'deinstallieren von "%s" nicht möglich',
|
||||
'uncheck all': 'alles demarkieren',
|
||||
'Uninstall': 'deinstallieren',
|
||||
'update': 'aktualisieren',
|
||||
'update all languages': 'aktualisiere alle Sprachen',
|
||||
'upgrade web2py now': 'jetzt web2py upgraden',
|
||||
@@ -339,5 +337,3 @@
|
||||
'web2py is up to date': 'web2py ist auf dem neuesten Stand',
|
||||
'xml': 'xml',
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
# coding: utf8
|
||||
{
|
||||
'!langcode!': 'en-us',
|
||||
'!langname!': 'English (US)',
|
||||
'%Y-%m-%d': '%m-%d-%Y',
|
||||
'%Y-%m-%d %H:%M:%S': '%m-%d-%Y %H:%M:%S',
|
||||
'back': '<<back',
|
||||
}
|
||||
@@ -1,17 +1,20 @@
|
||||
# coding: utf8
|
||||
{
|
||||
'!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 rows deleted': '%s filas eliminadas',
|
||||
'%s rows updated': '%s filas actualizadas',
|
||||
'%s %%{row} deleted': '%s filas eliminadas',
|
||||
'%s %%{row} updated': '%s filas actualizadas',
|
||||
'(something like "it-it")': '(algo como "it-it")',
|
||||
'@markmin\x01Searching: **%s** %%{file}': 'Searching: **%s** files',
|
||||
'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',
|
||||
@@ -26,12 +29,16 @@
|
||||
'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 compile: there are errors in your app:': 'No se puede compilar: hay errores en su aplicación:',
|
||||
'Change Password': 'Cambie Contraseña',
|
||||
'Change admin password': 'cambie contraseña admin',
|
||||
'Check to delete': 'Marque para eliminar',
|
||||
'Checking for upgrades...': 'Buscando actulizaciones...',
|
||||
'Clean': 'limpiar',
|
||||
'Click row to expand traceback': 'Click row to expand traceback',
|
||||
'Client IP': 'IP del Cliente',
|
||||
'Compile': 'compilar',
|
||||
'Controllers': 'Controladores',
|
||||
'Count': 'Count',
|
||||
'Create': 'crear',
|
||||
'Create new application using the Wizard': 'Create new application using the Wizard',
|
||||
'Create new simple application': 'Cree una nueva aplicación',
|
||||
'Current request': 'Solicitud en curso',
|
||||
@@ -46,6 +53,7 @@
|
||||
'Design for': 'Diseño para',
|
||||
'E-mail': 'Correo electrónico',
|
||||
'EDIT': 'EDITAR',
|
||||
'Edit': 'editar',
|
||||
'Edit Profile': 'Editar Perfil',
|
||||
'Edit application': 'Editar aplicación',
|
||||
'Edit current record': 'Edite el registro actual',
|
||||
@@ -55,14 +63,17 @@
|
||||
'Enterprise Web Framework': 'Armazón Empresarial para Internet',
|
||||
'Error': 'Error',
|
||||
'Error logs for "%(app)s"': 'Bitácora de errores en "%(app)s"',
|
||||
'Errors': 'errores',
|
||||
'Exception instance attributes': 'Atributos de la instancia de Excepción',
|
||||
'File': 'File',
|
||||
'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',
|
||||
'Help': 'ayuda',
|
||||
'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.': 'Si el reporte anterior contiene un número de tiquete este indica un falla en la ejecución del controlador, antes de cualquier intento de ejecutat doctests. Esto generalmente se debe a un error en la indentación o un error por fuera del código de la función.\r\nUn titulo verde indica que todas las pruebas pasaron (si existen). En dicho caso los resultados no se muestran.',
|
||||
'Import/Export': 'Importar/Exportar',
|
||||
'Install': 'instalar',
|
||||
'Installed applications': 'Aplicaciones instaladas',
|
||||
'Internal State': 'Estado Interno',
|
||||
'Invalid Query': 'Consulta inválida',
|
||||
@@ -75,7 +86,7 @@
|
||||
'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',
|
||||
'Logout': 'fin de sesión',
|
||||
'Lost Password': 'Contraseña perdida',
|
||||
'Models': 'Modelos',
|
||||
'Modules': 'Módulos',
|
||||
@@ -85,7 +96,10 @@
|
||||
'No databases in this application': 'No hay bases de datos en esta aplicación',
|
||||
'Origin': 'Origen',
|
||||
'Original/Translation': 'Original/Traducción',
|
||||
'Overwrite installed app': 'sobreescriba aplicación instalada',
|
||||
'PAM authenticated user, cannot change password here': 'usuario autenticado por PAM, no puede cambiar la contraseña aquí',
|
||||
'Pack all': 'empaquetar todo',
|
||||
'Pack compiled': 'empaquete compiladas',
|
||||
'Password': 'Contraseña',
|
||||
'Peeking at file': 'Visualizando archivo',
|
||||
'Plugin "%s" in application': 'Plugin "%s" en aplicación',
|
||||
@@ -95,11 +109,13 @@
|
||||
'Record ID': 'ID de Registro',
|
||||
'Register': 'Registrese',
|
||||
'Registration key': 'Contraseña de Registro',
|
||||
'Remove compiled': 'eliminar compiladas',
|
||||
'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:',
|
||||
'Site': 'sitio',
|
||||
'Static files': 'Archivos estáticos',
|
||||
'Sure you want to delete this object?': '¿Está seguro que desea eliminar este objeto?',
|
||||
'TM': 'MR',
|
||||
@@ -121,6 +137,7 @@
|
||||
'Unable to download app': 'No es posible descargar la aplicación',
|
||||
'Unable to download app because:': 'No es posible descargar la aplicación porque:',
|
||||
'Unable to download because': 'No es posible descargar porque',
|
||||
'Uninstall': 'desinstalar',
|
||||
'Update:': 'Actualice:',
|
||||
'Upload & install packed application': 'Suba e instale aplicación empaquetada',
|
||||
'Upload existing application': 'Suba esta aplicación',
|
||||
@@ -130,7 +147,6 @@
|
||||
'Views': 'Vistas',
|
||||
'Welcome to web2py': 'Bienvenido a web2py',
|
||||
'YES': 'SI',
|
||||
'About': 'acerca de',
|
||||
'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',
|
||||
@@ -149,19 +165,15 @@
|
||||
'cache, errors and sessions cleaned': 'cache, errores y sesiones eliminados',
|
||||
'cannot create file': 'no es posible crear archivo',
|
||||
'cannot upload file "%(filename)s"': 'no es posible subir archivo "%(filename)s"',
|
||||
'Change admin password': 'cambie contraseña admin',
|
||||
'check all': 'marcar todos',
|
||||
'Clean': 'limpiar',
|
||||
'click here for online examples': 'haga clic aquí para ver ejemplos en línea',
|
||||
'click here for the administrative interface': 'haga clic aquí para usar la interfaz administrativa',
|
||||
'click to check for upgrades': 'haga clic para buscar actualizaciones',
|
||||
'click to open': 'click to open',
|
||||
'code': 'código',
|
||||
'commit (mercurial)': 'commit (mercurial)',
|
||||
'Compile': 'compilar',
|
||||
'compiled application removed': 'aplicación compilada removida',
|
||||
'controllers': 'controladores',
|
||||
'Create': 'crear',
|
||||
'create file with filename:': 'cree archivo con nombre:',
|
||||
'create new application:': 'nombre de la nueva aplicación:',
|
||||
'created by': 'creado por',
|
||||
@@ -180,10 +192,8 @@
|
||||
'design': 'modificar',
|
||||
'direction: ltr': 'direction: ltr',
|
||||
'done!': 'listo!',
|
||||
'Edit': 'editar',
|
||||
'edit controller': 'editar controlador',
|
||||
'edit views:': 'editar vistas:',
|
||||
'Errors': 'errores',
|
||||
'export as csv file': 'exportar como archivo CSV',
|
||||
'exposes': 'expone',
|
||||
'extends': 'extiende',
|
||||
@@ -198,12 +208,10 @@
|
||||
'file does not exist': 'archivo no existe',
|
||||
'file saved on %(time)s': 'archivo guardado %(time)s',
|
||||
'file saved on %s': 'archivo guardado %s',
|
||||
'Help': 'ayuda',
|
||||
'htmledit': 'htmledit',
|
||||
'includes': 'incluye',
|
||||
'insert new': 'inserte nuevo',
|
||||
'insert new %s': 'inserte nuevo %s',
|
||||
'Install': 'instalar',
|
||||
'internal error': 'error interno',
|
||||
'invalid password': 'contraseña inválida',
|
||||
'invalid request': 'solicitud inválida',
|
||||
@@ -213,7 +221,6 @@
|
||||
'languages updated': 'lenguajes actualizados',
|
||||
'loading...': 'cargando...',
|
||||
'login': 'inicio de sesión',
|
||||
'Logout': 'fin de sesión',
|
||||
'manage': 'manage',
|
||||
'merge': 'combinar',
|
||||
'models': 'modelos',
|
||||
@@ -226,9 +233,6 @@
|
||||
'or import from csv file': 'o importar desde archivo CSV',
|
||||
'or provide app url:': 'o provea URL de la aplicación:',
|
||||
'or provide application url:': 'o provea URL de la aplicación:',
|
||||
'Overwrite installed app': 'sobreescriba aplicación instalada',
|
||||
'Pack all': 'empaquetar todo',
|
||||
'Pack compiled': 'empaquete compiladas',
|
||||
'pack plugin': 'empaquetar plugin',
|
||||
'password changed': 'contraseña cambiada',
|
||||
'plugin "%(plugin)s" deleted': 'plugin "%(plugin)s" eliminado',
|
||||
@@ -236,14 +240,12 @@
|
||||
'record': 'registro',
|
||||
'record does not exist': 'el registro no existe',
|
||||
'record id': 'id de registro',
|
||||
'Remove compiled': 'eliminar compiladas',
|
||||
'restore': 'restaurar',
|
||||
'revert': 'revertir',
|
||||
'save': 'guardar',
|
||||
'selected': 'seleccionado(s)',
|
||||
'session expired': 'sesión expirada',
|
||||
'shell': 'shell',
|
||||
'Site': 'sitio',
|
||||
'some files could not be removed': 'algunos archivos no pudieron ser removidos',
|
||||
'state': 'estado',
|
||||
'static': 'estáticos',
|
||||
@@ -265,7 +267,6 @@
|
||||
'unable to uninstall "%s"': 'no es posible instalar "%s"',
|
||||
'unable to upgrade because "%s"': 'no es posible actualizar porque "%s"',
|
||||
'uncheck all': 'desmarcar todos',
|
||||
'Uninstall': 'desinstalar',
|
||||
'update': 'actualizar',
|
||||
'update all languages': 'actualizar todos los lenguajes',
|
||||
'upgrade web2py now': 'actualize web2py ahora',
|
||||
@@ -280,5 +281,3 @@
|
||||
'web2py is up to date': 'web2py está actualizado',
|
||||
'web2py upgraded; please restart it': 'web2py actualizado; favor reiniciar',
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,18 +1,21 @@
|
||||
# coding: utf8
|
||||
{
|
||||
'!langcode!': 'fr',
|
||||
'!langname!': 'Français',
|
||||
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"update" est une expression en option tels que "field1 = \'newvalue\'". Vous ne pouvez pas mettre à jour ou supprimer les résultats d\'une jointure "a JOIN"',
|
||||
'%Y-%m-%d': '%d-%m-%Y',
|
||||
'%Y-%m-%d %H:%M:%S': '%d-%m-%Y %H:%M:%S',
|
||||
'%s rows deleted': 'lignes %s supprimé',
|
||||
'%s rows updated': 'lignes %s mis à jour',
|
||||
'%s %%{row} deleted': 'lignes %s supprimé',
|
||||
'%s %%{row} updated': 'lignes %s mis à jour',
|
||||
'(requires internet access)': '(requires internet access)',
|
||||
'(something like "it-it")': '(quelque chose comme "it-it") ',
|
||||
'@markmin\x01Searching: **%s** %%{file}': 'Searching: **%s** files',
|
||||
'A new version of web2py is available: %s': 'Une nouvelle version de web2py est disponible: %s ',
|
||||
'A new version of web2py is available: Version 1.68.2 (2009-10-21 09:59:29)\n': 'Une nouvelle version de web2py est disponible: Version 1.68.2 (2009-10-21 09:59:29)\r\n',
|
||||
'ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.': 'ATTENTION: nécessite une connexion sécurisée (HTTPS) ou être en localhost. ',
|
||||
'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.': 'ATTENTION: les tests ne sont pas thread-safe DONC NE PAS EFFECTUER DES TESTS MULTIPLES SIMULTANÉMENT.',
|
||||
'ATTENTION: you cannot edit the running application!': "ATTENTION: vous ne pouvez pas modifier l'application qui tourne!",
|
||||
'About': 'À propos',
|
||||
'About': 'à propos',
|
||||
'About application': "A propos de l'application",
|
||||
'Additional code for your application': 'Additional code for your application',
|
||||
'Admin is disabled because insecure channel': 'Admin est désactivé parce que canal non sécurisé',
|
||||
@@ -28,9 +31,14 @@
|
||||
'Cannot be empty': 'Ne peut pas être vide',
|
||||
'Cannot compile: there are errors in your app. Debug it, correct errors and try again.': 'Ne peut pas compiler: il y a des erreurs dans votre application. corriger les erreurs et essayez à nouveau.',
|
||||
'Cannot compile: there are errors in your app:': 'Cannot compile: there are errors in your app:',
|
||||
'Change admin password': 'change admin password',
|
||||
'Check for upgrades': 'check for upgrades',
|
||||
'Check to delete': 'Cocher pour supprimer',
|
||||
'Checking for upgrades...': 'Vérification des mises à jour ... ',
|
||||
'Clean': 'nettoyer',
|
||||
'Compile': 'compiler',
|
||||
'Controllers': 'Contrôleurs',
|
||||
'Create': 'create',
|
||||
'Create new simple application': 'Créer une nouvelle application',
|
||||
'Current request': 'Requête actuel',
|
||||
'Current response': 'Réponse actuelle',
|
||||
@@ -39,8 +47,10 @@
|
||||
'Delete': 'Supprimer',
|
||||
'Delete this file (you will be asked to confirm deletion)': 'Delete this file (you will be asked to confirm deletion)',
|
||||
'Delete:': 'Supprimer:',
|
||||
'Deploy': 'deploy',
|
||||
'Deploy on Google App Engine': 'Déployer sur Google App Engine',
|
||||
'EDIT': 'MODIFIER',
|
||||
'Edit': 'modifier',
|
||||
'Edit application': "Modifier l'application",
|
||||
'Edit current record': 'Modifier cet entrée',
|
||||
'Editing Language file': 'Modifier le fichier de langue',
|
||||
@@ -48,10 +58,13 @@
|
||||
'Editing file "%s"': 'Modifier le fichier "% s" ',
|
||||
'Enterprise Web Framework': 'Enterprise Web Framework',
|
||||
'Error logs for "%(app)s"': 'Journal d\'erreurs pour "%(app)s"',
|
||||
'Errors': 'erreurs',
|
||||
'Exception instance attributes': 'Exception instance attributes',
|
||||
'Functions with no doctests will result in [passed] tests.': 'Des fonctions sans doctests entraînera tests [passed] .',
|
||||
'Help': 'aide',
|
||||
'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.': "Si le rapport ci-dessus contient un numéro de ticket, cela indique une défaillance dans l'exécution du contrôleur, avant toute tentative d'exécuter les doctests. Cela est généralement dû à une erreur d'indentation ou une erreur à l'extérieur du code de la fonction.\r\nUn titre verte indique que tous les tests (si définie) passed. Dans ce cas, les résultats des essais ne sont pas affichées.",
|
||||
'Import/Export': 'Importer/Exporter',
|
||||
'Install': 'install',
|
||||
'Installed applications': 'Les applications installées',
|
||||
'Internal State': 'État Interne',
|
||||
'Invalid Query': 'Requête non valide',
|
||||
@@ -62,6 +75,7 @@
|
||||
'License for': 'Licence pour',
|
||||
'Login': 'Connexion',
|
||||
'Login to the Administrative Interface': "Se connecter à l'interface d'administration",
|
||||
'Logout': 'déconnexion',
|
||||
'Models': 'Modèles',
|
||||
'Modules': 'Modules',
|
||||
'NO': 'NON',
|
||||
@@ -70,19 +84,24 @@
|
||||
'New simple application': 'New simple application',
|
||||
'No databases in this application': 'Aucune base de données dans cette application',
|
||||
'Original/Translation': 'Original / Traduction',
|
||||
'Overwrite installed app': 'overwrite installed app',
|
||||
'PAM authenticated user, cannot change password here': 'PAM authenticated user, cannot change password here',
|
||||
'Pack all': 'tout empaqueter',
|
||||
'Pack compiled': 'paquet compilé',
|
||||
'Peeking at file': 'Jeter un oeil au fichier',
|
||||
'Plugin "%s" in application': 'Plugin "%s" dans l\'application',
|
||||
'Plugins': 'Plugins',
|
||||
'Powered by': 'Propulsé par',
|
||||
'Query:': 'Requête: ',
|
||||
'Remove compiled': 'retirer compilé',
|
||||
'Resolve Conflict file': 'Résoudre les conflits de fichiers',
|
||||
'Rows in table': 'Lignes de la table',
|
||||
'Rows selected': 'Lignes sélectionnées',
|
||||
"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')",
|
||||
'Save': 'Save',
|
||||
'Saved file hash:': 'Hash du Fichier enregistré:',
|
||||
'Searching:': 'Searching:',
|
||||
'Site': 'site',
|
||||
'Start wizard': 'start wizard',
|
||||
'Static files': 'Fichiers statiques',
|
||||
'Sure you want to delete this object?': 'Vous êtes sûr de vouloir supprimer cet objet? ',
|
||||
'TM': 'MD',
|
||||
@@ -108,6 +127,7 @@
|
||||
'Unable to download app': 'Impossible de télécharger app',
|
||||
'Unable to download app because:': 'Unable to download app because:',
|
||||
'Unable to download because': 'Unable to download because',
|
||||
'Uninstall': 'désinstaller',
|
||||
'Update:': 'Mise à jour:',
|
||||
'Upload & install packed application': 'Upload & install packed application',
|
||||
'Upload a package:': 'Upload a package:',
|
||||
@@ -118,7 +138,6 @@
|
||||
'Views': 'Vues',
|
||||
'Web Framework': 'Web Framework',
|
||||
'YES': 'OUI',
|
||||
'About': 'à propos',
|
||||
'additional code for your application': 'code supplémentaire pour votre application',
|
||||
'admin disabled because no admin password': 'admin désactivé car aucun mot de passe admin',
|
||||
'admin disabled because not supported on google app engine': 'admin désactivé car non pris en charge sur Google Apps engine',
|
||||
@@ -138,17 +157,12 @@
|
||||
'cache, errors and sessions cleaned': 'cache, erreurs et sessions nettoyé',
|
||||
'cannot create file': 'ne peu pas créer de fichier',
|
||||
'cannot upload file "%(filename)s"': 'ne peu pas charger le fichier "%(filename)s"',
|
||||
'Change admin password': 'change admin password',
|
||||
'check all': 'tous vérifier ',
|
||||
'Check for upgrades': 'check for upgrades',
|
||||
'Clean': 'nettoyer',
|
||||
'click to check for upgrades': 'Cliquez pour vérifier les mises à niveau',
|
||||
'code': 'code',
|
||||
'collapse/expand all': 'collapse/expand all',
|
||||
'Compile': 'compiler',
|
||||
'compiled application removed': 'application compilée enlevé',
|
||||
'controllers': 'contrôleurs',
|
||||
'Create': 'create',
|
||||
'create file with filename:': 'créer un fichier avec nom de fichier:',
|
||||
'create new application:': 'créer une nouvelle application:',
|
||||
'created by': 'créé par',
|
||||
@@ -164,17 +178,14 @@
|
||||
'delete': 'supprimer',
|
||||
'delete all checked': 'supprimer tout ce qui est cocher',
|
||||
'delete plugin': ' supprimer plugin',
|
||||
'Deploy': 'deploy',
|
||||
'design': 'conception',
|
||||
'direction: ltr': 'direction: ltr',
|
||||
'docs': 'docs',
|
||||
'done!': 'fait!',
|
||||
'download layouts': 'download layouts',
|
||||
'download plugins': 'download plugins',
|
||||
'Edit': 'modifier',
|
||||
'edit controller': 'modifier contrôleur',
|
||||
'edit views:': 'edit views:',
|
||||
'Errors': 'erreurs',
|
||||
'export as csv file': 'exportation au format CSV',
|
||||
'exposes': 'expose',
|
||||
'exposes:': 'exposes:',
|
||||
@@ -189,15 +200,12 @@
|
||||
'file does not exist': "fichier n'existe pas",
|
||||
'file saved on %(time)s': 'fichier enregistré le %(time)s',
|
||||
'file saved on %s': 'fichier enregistré le %s',
|
||||
'files': 'files',
|
||||
'filter': 'filter',
|
||||
'Help': 'aide',
|
||||
'htmledit': 'edition html',
|
||||
'includes': 'inclus',
|
||||
'index': 'index',
|
||||
'insert new': 'insérer nouveau',
|
||||
'insert new %s': 'insérer nouveau %s',
|
||||
'Install': 'install',
|
||||
'internal error': 'erreur interne',
|
||||
'invalid password': 'mot de passe invalide',
|
||||
'invalid request': 'Demande incorrecte',
|
||||
@@ -206,7 +214,6 @@
|
||||
'languages': 'langues',
|
||||
'loading...': 'Chargement ...',
|
||||
'login': 'connexion',
|
||||
'Logout': 'déconnexion',
|
||||
'merge': 'fusionner',
|
||||
'models': 'modèles',
|
||||
'modules': 'modules',
|
||||
@@ -218,9 +225,6 @@
|
||||
'or import from csv file': 'ou importer depuis un fichier CSV ',
|
||||
'or provide app url:': 'or provide app url:',
|
||||
'or provide application url:': "ou fournir l'URL de l'application:",
|
||||
'Overwrite installed app': 'overwrite installed app',
|
||||
'Pack all': 'tout empaqueter',
|
||||
'Pack compiled': 'paquet compilé',
|
||||
'pack plugin': 'paquet plugin',
|
||||
'password changed': 'password changed',
|
||||
'plugin "%(plugin)s" deleted': 'plugin "%(plugin)s" supprimé',
|
||||
@@ -229,16 +233,13 @@
|
||||
'record': 'entrée',
|
||||
'record does not exist': "l'entrée n'existe pas",
|
||||
'record id': 'id entrée',
|
||||
'Remove compiled': 'retirer compilé',
|
||||
'restore': 'restaurer',
|
||||
'revert': 'revenir',
|
||||
'save': 'sauver',
|
||||
'selected': 'sélectionnés',
|
||||
'session expired': 'la session a expiré ',
|
||||
'shell': 'shell',
|
||||
'Site': 'site',
|
||||
'some files could not be removed': 'certains fichiers ne peuvent pas être supprimés',
|
||||
'Start wizard': 'start wizard',
|
||||
'state': 'état',
|
||||
'static': 'statiques',
|
||||
'submit': 'envoyer',
|
||||
@@ -259,7 +260,6 @@
|
||||
'unable to uninstall "%s"': 'impossible de désinstaller "%s"',
|
||||
'unable to upgrade because "%s"': 'unable to upgrade because "%s"',
|
||||
'uncheck all': 'tout décocher',
|
||||
'Uninstall': 'désinstaller',
|
||||
'update': 'mettre à jour',
|
||||
'update all languages': 'mettre à jour toutes les langues',
|
||||
'upgrade now': 'upgrade now',
|
||||
@@ -277,5 +277,3 @@
|
||||
'web2py is up to date': 'web2py est à jour',
|
||||
'web2py upgraded; please restart it': 'web2py upgraded; please restart it',
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,12 +1,15 @@
|
||||
# coding: utf8
|
||||
{
|
||||
'!langcode!': 'he-il',
|
||||
'!langname!': 'עברית',
|
||||
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"עדכן" הוא ביטוי אופציונאלי, כגון "field1=newvalue". אינך יוכל להשתמש בjoin, בעת שימוש ב"עדכן" או "מחק".',
|
||||
'%Y-%m-%d': '%Y-%m-%d',
|
||||
'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
|
||||
'%s rows deleted': '%s רשומות נמחקו',
|
||||
'%s rows updated': '%s רשומות עודכנו',
|
||||
'%s %%{row} deleted': '%s רשומות נמחקו',
|
||||
'%s %%{row} updated': '%s רשומות עודכנו',
|
||||
'(requires internet access)': '(requires internet access)',
|
||||
'(something like "it-it")': '(למשל "it-it")',
|
||||
'@markmin\x01Searching: **%s** %%{file}': 'Searching: **%s** files',
|
||||
'A new version of web2py is available: %s': 'גירסא חדשה של web2py זמינה: %s',
|
||||
'A new version of web2py is available: Version 1.85.3 (2010-09-18 07:07:46)\n': 'A new version of web2py is available: Version 1.85.3 (2010-09-18 07:07:46)\r\n',
|
||||
'ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.': 'לתשומת ליבך: ניתן להתחבר רק בערוץ מאובטח (HTTPS) או מlocalhost',
|
||||
@@ -26,9 +29,14 @@
|
||||
'Available databases and tables': 'מסדי נתונים וטבלאות זמינים',
|
||||
'Cannot be empty': 'אינו יכול להישאר ריק',
|
||||
'Cannot compile: there are errors in your app:': 'לא ניתן לקמפל: ישנן שגיאות באפליקציה שלך:',
|
||||
'Change admin password': 'סיסמת מנהל שונתה',
|
||||
'Check for upgrades': 'check for upgrades',
|
||||
'Check to delete': 'סמן כדי למחוק',
|
||||
'Checking for upgrades...': 'מחפש עדכונים',
|
||||
'Clean': 'נקה',
|
||||
'Compile': 'קמפל',
|
||||
'Controllers': 'בקרים',
|
||||
'Create': 'צור',
|
||||
'Create new simple application': 'צור אפליקציה חדשה',
|
||||
'Current request': 'בקשה נוכחית',
|
||||
'Current response': 'מענה נוכחי',
|
||||
@@ -36,9 +44,11 @@
|
||||
'Date and Time': 'תאריך ושעה',
|
||||
'Delete': 'מחק',
|
||||
'Delete:': 'מחק:',
|
||||
'Deploy': 'deploy',
|
||||
'Deploy on Google App Engine': 'העלה ל Google App Engine',
|
||||
'Detailed traceback description': 'Detailed traceback description',
|
||||
'EDIT': 'ערוך!',
|
||||
'Edit': 'ערוך',
|
||||
'Edit application': 'ערוך אפליקציה',
|
||||
'Edit current record': 'ערוך רשומה נוכחית',
|
||||
'Editing Language file': 'עורך את קובץ השפה',
|
||||
@@ -47,11 +57,14 @@
|
||||
'Error logs for "%(app)s"': 'דו"ח שגיאות עבור אפליקציה "%(app)s"',
|
||||
'Error snapshot': 'Error snapshot',
|
||||
'Error ticket': 'Error ticket',
|
||||
'Errors': 'שגיאות',
|
||||
'Exception instance attributes': 'נתוני החריגה',
|
||||
'Frames': 'Frames',
|
||||
'Functions with no doctests will result in [passed] tests.': 'פונקציות שלא הוגדר להן doctest ירשמו כבדיקות ש[עברו בהצלחה].',
|
||||
'Help': 'עזרה',
|
||||
'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.': 'אם בדו"ח לעיל מופיע מספר דו"ח שגיאה, זה מצביע על שגיאה בבקר, עוד לפני שניתן היה להריץ את הdoctest. לרוב מדובר בשגיאת הזחה, או שגיאה שאינה בקוד של הפונקציה.\r\nכותרת ירוקה מצביע על כך שכל הבדיקות (אם הוגדרו) עברו בהצלחה, במידה ותוצאות הבדיקה אינן מופיעות.',
|
||||
'Import/Export': 'יבא\יצא',
|
||||
'Install': 'התקן',
|
||||
'Installed applications': 'אפליקציות מותקנות',
|
||||
'Internal State': 'מצב מובנה',
|
||||
'Invalid Query': 'שאילתה לא תקינה',
|
||||
@@ -62,6 +75,7 @@
|
||||
'License for': 'רשיון עבור',
|
||||
'Login': 'התחבר',
|
||||
'Login to the Administrative Interface': 'התחבר לממשק המנהל',
|
||||
'Logout': 'התנתק',
|
||||
'Models': 'מבני נתונים',
|
||||
'Modules': 'מודולים',
|
||||
'NO': 'לא',
|
||||
@@ -70,16 +84,22 @@
|
||||
'New simple application': 'New simple application',
|
||||
'No databases in this application': 'אין מסדי נתונים לאפליקציה זו',
|
||||
'Original/Translation': 'מקור\תרגום',
|
||||
'Overwrite installed app': 'התקן על גבי אפלקציה מותקנת',
|
||||
'PAM authenticated user, cannot change password here': 'שינוי סיסמא באמצעות PAM אינו יכול להתבצע כאן',
|
||||
'Pack all': 'ארוז הכל',
|
||||
'Pack compiled': 'ארוז מקומפל',
|
||||
'Peeking at file': 'מעיין בקובץ',
|
||||
'Plugin "%s" in application': 'פלאגין "%s" של אפליקציה',
|
||||
'Plugins': 'תוספים',
|
||||
'Powered by': 'מופעל ע"י',
|
||||
'Query:': 'שאילתה:',
|
||||
'Remove compiled': 'הסר מקומפל',
|
||||
'Resolve Conflict file': 'הסר קובץ היוצר קונפליקט',
|
||||
'Rows in table': 'רשומות בטבלה',
|
||||
'Rows selected': 'רשומות נבחרו',
|
||||
'Saved file hash:': 'גיבוב הקובץ השמור:',
|
||||
'Site': 'אתר',
|
||||
'Start wizard': 'start wizard',
|
||||
'Static files': 'קבצים סטאטיים',
|
||||
'Sure you want to delete this object?': 'האם אתה בטוח שברצונך למחוק אובייקט זה?',
|
||||
'TM': 'סימן רשום',
|
||||
@@ -105,6 +125,7 @@
|
||||
'Unable to check for upgrades': 'לא ניתן היה לבדוק אם יש שדרוגים',
|
||||
'Unable to download app because:': 'לא ניתן היה להוריד את האפליקציה כי:',
|
||||
'Unable to download because': 'לא הצלחתי להוריד כי',
|
||||
'Uninstall': 'הסר התקנה',
|
||||
'Update:': 'עדכן:',
|
||||
'Upload & install packed application': 'העלה והתקן אפליקציה ארוזה',
|
||||
'Upload a package:': 'Upload a package:',
|
||||
@@ -113,7 +134,6 @@
|
||||
'Version': 'גירסא',
|
||||
'Views': 'מראה',
|
||||
'YES': 'כן',
|
||||
'About': 'אודות',
|
||||
'additional code for your application': 'קוד נוסף עבור האפליקציה שלך',
|
||||
'admin disabled because no admin password': 'ממשק המנהל מנוטרל כי לא הוגדרה סיסמת מנהל',
|
||||
'admin disabled because not supported on google app engine': 'ממשק המנהל נוטרל, כי אין תמיכה בGoogle app engine',
|
||||
@@ -132,17 +152,12 @@
|
||||
'cache, errors and sessions cleaned': 'מטמון, שגיאות וסשן נוקו',
|
||||
'cannot create file': 'לא מצליח ליצור קובץ',
|
||||
'cannot upload file "%(filename)s"': 'לא הצלחתי להעלות את הקובץ "%(filename)s"',
|
||||
'Change admin password': 'סיסמת מנהל שונתה',
|
||||
'check all': 'סמן הכל',
|
||||
'Check for upgrades': 'check for upgrades',
|
||||
'Clean': 'נקה',
|
||||
'click to check for upgrades': 'לחץ כדי לחפש עדכונים',
|
||||
'code': 'קוד',
|
||||
'collapse/expand all': 'collapse/expand all',
|
||||
'Compile': 'קמפל',
|
||||
'compiled application removed': 'אפליקציה מקומפלת הוסרה',
|
||||
'controllers': 'בקרים',
|
||||
'Create': 'צור',
|
||||
'create file with filename:': 'צור קובץ בשם:',
|
||||
'create new application:': 'צור אפליקציה חדשה:',
|
||||
'created by': 'נוצר ע"י',
|
||||
@@ -158,16 +173,13 @@
|
||||
'delete': 'מחק',
|
||||
'delete all checked': 'סמן הכל למחיקה',
|
||||
'delete plugin': 'מחק תוסף',
|
||||
'Deploy': 'deploy',
|
||||
'design': 'עיצוב',
|
||||
'direction: ltr': 'direction: rtl',
|
||||
'done!': 'הסתיים!',
|
||||
'download layouts': 'download layouts',
|
||||
'download plugins': 'download plugins',
|
||||
'Edit': 'ערוך',
|
||||
'edit controller': 'ערוך בקר',
|
||||
'edit views:': 'ערוך קיבצי תצוגה:',
|
||||
'Errors': 'שגיאות',
|
||||
'export as csv file': 'יצא לקובץ csv',
|
||||
'exposes': 'חושף את',
|
||||
'extends': 'הרחבה של',
|
||||
@@ -181,13 +193,11 @@
|
||||
'file saved on %(time)s': 'הקובץ נשמר בשעה %(time)s',
|
||||
'file saved on %s': 'הקובץ נשמר ב%s',
|
||||
'filter': 'filter',
|
||||
'Help': 'עזרה',
|
||||
'htmledit': 'עורך ויזואלי',
|
||||
'includes': 'מכיל',
|
||||
'insert new': 'הכנס נוסף',
|
||||
'insert new %s': 'הכנס %s נוסף',
|
||||
'inspect attributes': 'inspect attributes',
|
||||
'Install': 'התקן',
|
||||
'internal error': 'שגיאה מובנית',
|
||||
'invalid password': 'סיסמא שגויה',
|
||||
'invalid request': 'בקשה לא תקינה',
|
||||
@@ -197,7 +207,6 @@
|
||||
'loading...': 'טוען...',
|
||||
'locals': 'locals',
|
||||
'login': 'התחבר',
|
||||
'Logout': 'התנתק',
|
||||
'merge': 'מזג',
|
||||
'models': 'מבני נתונים',
|
||||
'modules': 'מודולים',
|
||||
@@ -208,9 +217,6 @@
|
||||
'no match': 'לא נמצאה התאמה',
|
||||
'or import from csv file': 'או יבא מקובץ csv',
|
||||
'or provide app url:': 'או ספק כתובת url של אפליקציה',
|
||||
'Overwrite installed app': 'התקן על גבי אפלקציה מותקנת',
|
||||
'Pack all': 'ארוז הכל',
|
||||
'Pack compiled': 'ארוז מקומפל',
|
||||
'pack plugin': 'ארוז תוסף',
|
||||
'password changed': 'סיסמא שונתה',
|
||||
'plugin "%(plugin)s" deleted': 'תוסף "%(plugin)s" נמחק',
|
||||
@@ -219,7 +225,6 @@
|
||||
'record': 'רשומה',
|
||||
'record does not exist': 'הרשומה אינה קיימת',
|
||||
'record id': 'מזהה רשומה',
|
||||
'Remove compiled': 'הסר מקומפל',
|
||||
'request': 'request',
|
||||
'response': 'response',
|
||||
'restore': 'שחזר',
|
||||
@@ -228,9 +233,7 @@
|
||||
'session': 'session',
|
||||
'session expired': 'תם הסשן',
|
||||
'shell': 'שורת פקודה',
|
||||
'Site': 'אתר',
|
||||
'some files could not be removed': 'לא ניתן היה להסיר חלק מהקבצים',
|
||||
'Start wizard': 'start wizard',
|
||||
'state': 'מצב',
|
||||
'static': 'קבצים סטאטיים',
|
||||
'submit': 'שלח',
|
||||
@@ -251,7 +254,6 @@
|
||||
'unable to uninstall "%s"': 'לא ניתן להסיר את "%s"',
|
||||
'unable to upgrade because "%s"': 'לא ניתן היה לשדרג כי "%s"',
|
||||
'uncheck all': 'הסר סימון מהכל',
|
||||
'Uninstall': 'הסר התקנה',
|
||||
'update': 'עדכן',
|
||||
'update all languages': 'עדכן את כלל קיבצי השפה',
|
||||
'upgrade now': 'upgrade now',
|
||||
@@ -268,5 +270,3 @@
|
||||
'web2py is up to date': 'web2py מותקנת בגירסתה האחרונה',
|
||||
'web2py upgraded; please restart it': 'web2py שודרגה; נא אתחל אותה',
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,17 +1,20 @@
|
||||
# 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 ',
|
||||
'%Y-%m-%d': '%d/%m/%Y',
|
||||
'%Y-%m-%d %H:%M:%S': '%d/%m/%Y %H:%M:%S',
|
||||
'%s rows deleted': '%s righe ("record") cancellate',
|
||||
'%s rows updated': '%s righe ("record") modificate',
|
||||
'%s %%{row} deleted': '%s righe ("record") cancellate',
|
||||
'%s %%{row} updated': '%s righe ("record") modificate',
|
||||
'(requires internet access)': '(requires internet access)',
|
||||
'(something like "it-it")': '(qualcosa simile a "it-it")',
|
||||
'@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': 'informazioni',
|
||||
'About application': "Informazioni sull'applicazione",
|
||||
'Admin is disabled because insecure channel': 'amministrazione disabilitata: comunicazione non sicura',
|
||||
'Admin language': 'Admin language',
|
||||
@@ -24,11 +27,16 @@
|
||||
'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',
|
||||
@@ -38,9 +46,10 @@
|
||||
'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': 'modifica',
|
||||
'Edit This App': 'Modifica questa applicazione',
|
||||
'Edit application': 'Modifica applicazione',
|
||||
'Edit current record': 'Modifica record corrente',
|
||||
@@ -48,12 +57,15 @@
|
||||
'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',
|
||||
@@ -65,6 +77,7 @@
|
||||
'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',
|
||||
@@ -75,16 +88,22 @@
|
||||
'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?',
|
||||
@@ -104,6 +123,7 @@
|
||||
'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:',
|
||||
@@ -115,7 +135,6 @@
|
||||
'Welcome %s': 'Benvenuto %s',
|
||||
'Welcome to web2py': 'Benvenuto su web2py',
|
||||
'YES': 'SI',
|
||||
'About': 'informazioni',
|
||||
'additional code for your application': 'righe di codice aggiuntive per la tua applicazione',
|
||||
'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',
|
||||
@@ -134,19 +153,14 @@
|
||||
'cache, errors and sessions cleaned': 'pulitura cache, errori and sessioni ',
|
||||
'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',
|
||||
'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',
|
||||
'Compile': 'compila',
|
||||
'compiled application removed': "rimosso il codice compilato dell'applicazione",
|
||||
'controllers': 'controllers',
|
||||
'Create': 'crea',
|
||||
'create file with filename:': 'crea un file col nome:',
|
||||
'create new application:': 'create new application:',
|
||||
'created by': 'creato da',
|
||||
@@ -163,15 +177,12 @@
|
||||
'delete': 'Cancella',
|
||||
'delete all checked': 'cancella tutti i selezionati',
|
||||
'delete plugin': 'cancella plugin',
|
||||
'Deploy': 'deploy',
|
||||
'design': 'progetta',
|
||||
'direction: ltr': 'direction: ltr',
|
||||
'done!': 'fatto!',
|
||||
'Edit': 'modifica',
|
||||
'edit controller': 'modifica controller',
|
||||
'edit profile': 'modifica profilo',
|
||||
'edit views:': 'modifica viste (view):',
|
||||
'Errors': 'errori',
|
||||
'export as csv file': 'esporta come file CSV',
|
||||
'exposes': 'espone',
|
||||
'extends': 'estende',
|
||||
@@ -184,12 +195,10 @@
|
||||
'file does not exist': 'file inesistente',
|
||||
'file saved on %(time)s': "file salvato nell'istante %(time)s",
|
||||
'file saved on %s': 'file salvato: %s',
|
||||
'Help': 'aiuto',
|
||||
'htmledit': 'modifica come html',
|
||||
'includes': 'include',
|
||||
'insert new': 'inserisci nuovo',
|
||||
'insert new %s': 'inserisci nuovo %s',
|
||||
'Install': 'installa',
|
||||
'internal error': 'errore interno',
|
||||
'invalid password': 'password non valida',
|
||||
'invalid request': 'richiesta non valida',
|
||||
@@ -198,7 +207,6 @@
|
||||
'languages': 'linguaggi',
|
||||
'loading...': 'caricamento...',
|
||||
'login': 'accesso',
|
||||
'Logout': 'uscita',
|
||||
'merge': 'unisci',
|
||||
'models': 'modelli',
|
||||
'modules': 'moduli',
|
||||
@@ -209,9 +217,6 @@
|
||||
'no match': 'nessuna corrispondenza',
|
||||
'or import from csv file': 'oppure importa da file CSV',
|
||||
'or provide app url:': "oppure fornisci url dell'applicazione:",
|
||||
'Overwrite installed app': 'sovrascrivi applicazione installata',
|
||||
'Pack all': 'crea pacchetto',
|
||||
'Pack compiled': 'crea pacchetto del codice compilato',
|
||||
'pack plugin': 'crea pacchetto del plugin',
|
||||
'password changed': 'password modificata',
|
||||
'plugin "%(plugin)s" deleted': 'plugin "%(plugin)s" cancellato',
|
||||
@@ -220,15 +225,12 @@
|
||||
'record does not exist': 'il record non esiste',
|
||||
'record id': 'ID del record',
|
||||
'register': 'registrazione',
|
||||
'Remove compiled': 'rimozione codice compilato',
|
||||
'restore': 'ripristino',
|
||||
'revert': 'versione precedente',
|
||||
'selected': 'selezionato',
|
||||
'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',
|
||||
'submit': 'invia',
|
||||
@@ -249,7 +251,6 @@
|
||||
'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',
|
||||
'upgrade web2py now': 'upgrade web2py now',
|
||||
@@ -264,5 +265,3 @@
|
||||
'web2py is up to date': 'web2py è aggiornato',
|
||||
'web2py upgraded; please restart it': 'web2py aggiornato; prego riavviarlo',
|
||||
}
|
||||
|
||||
|
||||
|
||||
+189
-186
@@ -1,186 +1,189 @@
|
||||
# coding: utf8
|
||||
{
|
||||
'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
|
||||
'%Y-%m-%d': '%Y-%m-%d',
|
||||
'(requires internet access)': '(インターネットアクセスが必要)',
|
||||
'(something like "it-it")': '(例: "it-it")',
|
||||
'Abort': '中断',
|
||||
'About application': 'アプリケーションについて',
|
||||
'About': 'About',
|
||||
'Additional code for your application': 'アプリケーションに必要な追加記述',
|
||||
'Admin language': '管理画面の言語',
|
||||
'administrative interface': '管理画面',
|
||||
'Administrator Password:': '管理者パスワード:',
|
||||
'and rename it:': 'ファイル名を変更:',
|
||||
'appadmin': 'アプリ管理画面',
|
||||
'application "%s" uninstalled': '"%s"アプリケーションが削除されました',
|
||||
'application compiled': 'アプリケーションがコンパイルされました',
|
||||
'Application name:': 'アプリケーション名:',
|
||||
'Are you sure you want to delete plugin "%s"?': '"%s"プラグインを削除してもよろしいですか?',
|
||||
'Are you sure you want to delete this object?': 'このオブジェクトを削除してもよろしいですか?',
|
||||
'Are you sure you want to uninstall application "%s"?': '"%s"アプリケーションを削除してもよろしいですか?',
|
||||
'arguments': '引数',
|
||||
'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!': '注意: 実行中のアプリケーションは編集できません!',
|
||||
'Available databases and tables': '利用可能なデータベースとテーブル一覧',
|
||||
'back': '戻る',
|
||||
'Basics': '基本情報',
|
||||
'Begin': '開始',
|
||||
'cache': 'cache',
|
||||
'cannot upload file "%(filename)s"': '"%(filename)s"ファイルをアップロードできません',
|
||||
'Change admin password': '管理者パスワード変更',
|
||||
'check all': '全てを選択',
|
||||
'Check for upgrades': '更新チェック',
|
||||
'Checking for upgrades...': '更新を確認中...',
|
||||
'Clean': '一時データ削除',
|
||||
'Click row to expand traceback': '列をクリックしてトレースバックを展開',
|
||||
'code': 'コード',
|
||||
'collapse/expand all': '全て開閉する',
|
||||
'Compile': 'コンパイル',
|
||||
'compiled application removed': 'コンパイル済みのアプリケーションが削除されました',
|
||||
'Controllers': 'コントローラ',
|
||||
'controllers': 'コントローラ',
|
||||
'Count': '回数',
|
||||
'create file with filename:': 'ファイル名:',
|
||||
'Create': '作成',
|
||||
'created by': '作成者',
|
||||
'crontab': 'crontab',
|
||||
'currently running': '現在実行中',
|
||||
'currently saved or': '現在保存されているデータ または',
|
||||
'database administration': 'データベース管理',
|
||||
'db': 'db',
|
||||
'defines tables': 'テーブル定義',
|
||||
'delete all checked': '選択したデータを全て削除',
|
||||
'delete plugin': 'プラグイン削除',
|
||||
'Delete this file (you will be asked to confirm deletion)': 'ファイルの削除(確認画面が出ます)',
|
||||
'Delete': '削除',
|
||||
'Deploy on Google App Engine': 'Google App Engineにデプロイ',
|
||||
'Deploy': 'デプロイ',
|
||||
'design': 'デザイン',
|
||||
'Detailed traceback description': '詳細なトレースバック内容',
|
||||
'details': '詳細',
|
||||
'direction: ltr': 'direction: ltr',
|
||||
'Disable': '無効',
|
||||
'docs': 'ドキュメント',
|
||||
'download layouts': 'レイアウトのダウンロード',
|
||||
'download plugins': 'プラグインのダウンロード',
|
||||
'edit all': '全て編集',
|
||||
'Edit application': 'アプリケーションを編集',
|
||||
'edit views:': 'ビューの編集:',
|
||||
'Edit': '編集',
|
||||
'Editing file "%s"': '"%s"ファイルを編集中',
|
||||
'Enable': '有効',
|
||||
'Error logs for "%(app)s"': '"%(app)s"のエラーログ',
|
||||
'Error snapshot': 'エラー発生箇所',
|
||||
'Error ticket': 'エラーチケット',
|
||||
'Error': 'エラー',
|
||||
'Errors': 'エラー',
|
||||
'Exception instance attributes': '例外インスタンス引数',
|
||||
'exposes': '公開',
|
||||
'exposes:': '公開:',
|
||||
'extends': '継承',
|
||||
'File': 'ファイル',
|
||||
'files': 'ファイル',
|
||||
'filter': 'フィルタ',
|
||||
'Frames': 'フレーム',
|
||||
'Functions with no doctests will result in [passed] tests.': 'doctestsのない関数は自動的にテストをパスします。',
|
||||
'Generate': 'アプリ生成',
|
||||
'Get from URL:': 'URLから取得:',
|
||||
'go!': '実行!',
|
||||
'Help': 'ヘルプ',
|
||||
'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.': 'もし上記のレポートにチケット番号が含まれる場合は、doctestを実行する前に、コントローラの実行で問題があったことを示します。これはインデントの問題やその関数の外部で問題があった場合に起きるが一般的です。\n緑色のタイトルは全てのテスト(もし定義されていれば)をパスしたことを示します。その場合、テスト結果は表示されません。',
|
||||
'includes': 'インクルード',
|
||||
'index': 'index',
|
||||
'inspect attributes': '引数の検査',
|
||||
'Install': 'インストール',
|
||||
'Installed applications': 'アプリケーション一覧',
|
||||
'Languages': '言語',
|
||||
'languages': '言語',
|
||||
'Last saved on:': '最終保存日時:',
|
||||
'License for': 'License for',
|
||||
'loading...': 'ロードしています...',
|
||||
'locals': 'ローカル',
|
||||
'Login to the Administrative Interface': '管理画面へログイン',
|
||||
'Login': 'ログイン',
|
||||
'Logout': 'ログアウト',
|
||||
'Models': 'モデル',
|
||||
'models': 'モデル',
|
||||
'Modules': 'モジュール',
|
||||
'modules': 'モジュール',
|
||||
'New Application Wizard': '新規アプリケーション作成ウィザード',
|
||||
'New application wizard': '新規アプリケーション作成ウィザード',
|
||||
'new plugin installed': '新しいプラグインがインストールされました',
|
||||
'New simple application': '新規アプリケーション',
|
||||
'No databases in this application': 'このアプリケーションにはデータベースが存在しません',
|
||||
'NO': 'いいえ',
|
||||
'online designer': 'オンラインデザイナー',
|
||||
'Overwrite installed app': 'アプリケーションを上書き',
|
||||
'Pack all': 'パッケージ化',
|
||||
'Pack compiled': 'コンパイルデータのパッケージ化',
|
||||
'pack plugin': 'プラグインのパッケージ化',
|
||||
'Peeking at file': 'ファイルを参照',
|
||||
'plugin "%(plugin)s" deleted': '"%(plugin)s"プラグインは削除されました',
|
||||
'Plugin "%s" in application': '"%s"プラグイン',
|
||||
'Plugins': 'プラグイン',
|
||||
'plugins': 'プラグイン',
|
||||
'Powered by': 'Powered by',
|
||||
'Reload routes': 'ルーティング再読み込み',
|
||||
'Remove compiled': 'コンパイルデータの削除',
|
||||
'request': 'リクエスト',
|
||||
'response': 'レスポンス',
|
||||
'restart': '最初からやり直し',
|
||||
'restore': '復元',
|
||||
'revert': '一つ前に戻す',
|
||||
"Run tests in this file (to run all files, you may also use the button labelled 'test')": "このファイルのテストを実行(全てのファイルに対して実行する場合は、'テスト'というボタンを使用できます)",
|
||||
'Save': '保存',
|
||||
'Saved file hash:': '保存されたファイルハッシュ:',
|
||||
'Searching:': '検索中:',
|
||||
'session expired': 'セッションの有効期限が切れました',
|
||||
'session': 'セッション',
|
||||
'shell': 'shell',
|
||||
'Site': 'サイト',
|
||||
'skip to generate': 'スキップしてアプリ生成画面へ移動',
|
||||
'Sorry, could not find mercurial installed': 'インストールされているmercurialが見つかりません',
|
||||
'Start a new app': '新規アプリの作成',
|
||||
'Start wizard': 'ウィザードの開始',
|
||||
'state': 'state',
|
||||
'Static files': '静的ファイル',
|
||||
'static': '静的ファイル',
|
||||
'Step': 'ステップ',
|
||||
'test': 'テスト',
|
||||
'Testing application': 'アプリケーションをテスト中',
|
||||
'The application logic, each URL path is mapped in one exposed function in the controller': 'アプリケーションロジック、それぞれのURLパスはコントローラで公開されている各関数にマッピングされています',
|
||||
'The data representation, define database tables and sets': 'データの表示方法, テーブルとセットの定義',
|
||||
'The presentations layer, views are also known as templates': 'プレゼンテーション層、ビューはテンプレートとしても知られています',
|
||||
'There are no controllers': 'コントローラがありません',
|
||||
'There are no modules': 'モジュールがありません',
|
||||
'There are no plugins': 'プラグインはありません',
|
||||
'There are no translators, only default language is supported': '翻訳がないためデフォルト言語のみをサポートします',
|
||||
'There are no views': 'ビューがありません',
|
||||
'These files are served without processing, your images go here': 'これらのファイルは直接参照されます, ここに画像が入ります',
|
||||
'Ticket ID': 'チケットID',
|
||||
'to previous version.': '前のバージョンへ戻す。',
|
||||
'To create a plugin, name a file/folder plugin_[name]': 'ファイル名/フォルダ名 plugin_[名称]としてプラグインを作成してください',
|
||||
'Traceback': 'トレースバック',
|
||||
'Translation strings for the application': 'アプリケーションの翻訳文字列',
|
||||
'Unable to download because:': '以下の理由でダウンロードできません:',
|
||||
'uncheck all': '全ての選択を解除',
|
||||
'Uninstall': 'アプリ削除',
|
||||
'update all languages': '全ての言語を更新',
|
||||
'Upload a package:': 'パッケージをアップロード:',
|
||||
'Upload and install packed application': 'パッケージのアップロードとインストール',
|
||||
'upload file:': 'ファイルをアップロード:',
|
||||
'upload plugin file:': 'プラグインファイルをアップロード:',
|
||||
'upload': 'アップロード',
|
||||
'user': 'ユーザー',
|
||||
'variables': '変数',
|
||||
'Version': 'バージョン',
|
||||
'Versioning': 'バージョン管理',
|
||||
'Views': 'ビュー',
|
||||
'views': 'ビュー',
|
||||
'Web Framework': 'Web Framework',
|
||||
'web2py is up to date': 'web2pyは最新です',
|
||||
'web2py Recent Tweets': '最近のweb2pyTweets',
|
||||
'YES': 'はい',
|
||||
}
|
||||
# coding: utf8
|
||||
{
|
||||
'!langcode!': 'ja-jp',
|
||||
'!langname!': '日本語',
|
||||
'%Y-%m-%d': '%Y-%m-%d',
|
||||
'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
|
||||
'%s %%{row} deleted': '%s rows deleted',
|
||||
'%s %%{row} updated': '%s rows updated',
|
||||
'(requires internet access)': '(インターネットアクセスが必要)',
|
||||
'(something like "it-it")': '(例: "it-it")',
|
||||
'@markmin\x01Searching: **%s** %%{file}': '検索中: **%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!': '注意: 実行中のアプリケーションは編集できません!',
|
||||
'Abort': '中断',
|
||||
'About': 'About',
|
||||
'About application': 'アプリケーションについて',
|
||||
'Additional code for your application': 'アプリケーションに必要な追加記述',
|
||||
'Admin language': '管理画面の言語',
|
||||
'Administrator Password:': '管理者パスワード:',
|
||||
'Application name:': 'アプリケーション名:',
|
||||
'Are you sure you want to delete plugin "%s"?': '"%s"プラグインを削除してもよろしいですか?',
|
||||
'Are you sure you want to delete this object?': 'このオブジェクトを削除してもよろしいですか?',
|
||||
'Are you sure you want to uninstall application "%s"?': '"%s"アプリケーションを削除してもよろしいですか?',
|
||||
'Available databases and tables': '利用可能なデータベースとテーブル一覧',
|
||||
'Basics': '基本情報',
|
||||
'Begin': '開始',
|
||||
'Change admin password': '管理者パスワード変更',
|
||||
'Check for upgrades': '更新チェック',
|
||||
'Checking for upgrades...': '更新を確認中...',
|
||||
'Clean': '一時データ削除',
|
||||
'Click row to expand traceback': '列をクリックしてトレースバックを展開',
|
||||
'Compile': 'コンパイル',
|
||||
'Controllers': 'コントローラ',
|
||||
'Count': '回数',
|
||||
'Create': '作成',
|
||||
'Delete': '削除',
|
||||
'Delete this file (you will be asked to confirm deletion)': 'ファイルの削除(確認画面が出ます)',
|
||||
'Deploy': 'デプロイ',
|
||||
'Deploy on Google App Engine': 'Google App Engineにデプロイ',
|
||||
'Detailed traceback description': '詳細なトレースバック内容',
|
||||
'Disable': '無効',
|
||||
'Edit': '編集',
|
||||
'Edit application': 'アプリケーションを編集',
|
||||
'Editing file "%s"': '"%s"ファイルを編集中',
|
||||
'Enable': '有効',
|
||||
'Error': 'エラー',
|
||||
'Error logs for "%(app)s"': '"%(app)s"のエラーログ',
|
||||
'Error snapshot': 'エラー発生箇所',
|
||||
'Error ticket': 'エラーチケット',
|
||||
'Errors': 'エラー',
|
||||
'Exception instance attributes': '例外インスタンス引数',
|
||||
'File': 'ファイル',
|
||||
'Frames': 'フレーム',
|
||||
'Functions with no doctests will result in [passed] tests.': 'doctestsのない関数は自動的にテストをパスします。',
|
||||
'Generate': 'アプリ生成',
|
||||
'Get from URL:': 'URLから取得:',
|
||||
'Help': 'ヘルプ',
|
||||
'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.': 'もし上記のレポートにチケット番号が含まれる場合は、doctestを実行する前に、コントローラの実行で問題があったことを示します。これはインデントの問題やその関数の外部で問題があった場合に起きるが一般的です。\n緑色のタイトルは全てのテスト(もし定義されていれば)をパスしたことを示します。その場合、テスト結果は表示されません。',
|
||||
'Install': 'インストール',
|
||||
'Installed applications': 'アプリケーション一覧',
|
||||
'Languages': '言語',
|
||||
'Last saved on:': '最終保存日時:',
|
||||
'License for': 'License for',
|
||||
'Login': 'ログイン',
|
||||
'Login to the Administrative Interface': '管理画面へログイン',
|
||||
'Logout': 'ログアウト',
|
||||
'Models': 'モデル',
|
||||
'Modules': 'モジュール',
|
||||
'NO': 'いいえ',
|
||||
'New Application Wizard': '新規アプリケーション作成ウィザード',
|
||||
'New application wizard': '新規アプリケーション作成ウィザード',
|
||||
'New simple application': '新規アプリケーション',
|
||||
'No databases in this application': 'このアプリケーションにはデータベースが存在しません',
|
||||
'Overwrite installed app': 'アプリケーションを上書き',
|
||||
'Pack all': 'パッケージ化',
|
||||
'Pack compiled': 'コンパイルデータのパッケージ化',
|
||||
'Peeking at file': 'ファイルを参照',
|
||||
'Plugin "%s" in application': '"%s"プラグイン',
|
||||
'Plugins': 'プラグイン',
|
||||
'Powered by': 'Powered by',
|
||||
'Reload routes': 'ルーティング再読み込み',
|
||||
'Remove compiled': 'コンパイルデータの削除',
|
||||
"Run tests in this file (to run all files, you may also use the button labelled 'test')": "このファイルのテストを実行(全てのファイルに対して実行する場合は、'テスト'というボタンを使用できます)",
|
||||
'Save': '保存',
|
||||
'Saved file hash:': '保存されたファイルハッシュ:',
|
||||
'Site': 'サイト',
|
||||
'Sorry, could not find mercurial installed': 'インストールされているmercurialが見つかりません',
|
||||
'Start a new app': '新規アプリの作成',
|
||||
'Start wizard': 'ウィザードの開始',
|
||||
'Static files': '静的ファイル',
|
||||
'Step': 'ステップ',
|
||||
'Testing application': 'アプリケーションをテスト中',
|
||||
'The application logic, each URL path is mapped in one exposed function in the controller': 'アプリケーションロジック、それぞれのURLパスはコントローラで公開されている各関数にマッピングされています',
|
||||
'The data representation, define database tables and sets': 'データの表示方法, テーブルとセットの定義',
|
||||
'The presentations layer, views are also known as templates': 'プレゼンテーション層、ビューはテンプレートとしても知られています',
|
||||
'There are no controllers': 'コントローラがありません',
|
||||
'There are no modules': 'モジュールがありません',
|
||||
'There are no plugins': 'プラグインはありません',
|
||||
'There are no translators, only default language is supported': '翻訳がないためデフォルト言語のみをサポートします',
|
||||
'There are no views': 'ビューがありません',
|
||||
'These files are served without processing, your images go here': 'これらのファイルは直接参照されます, ここに画像が入ります',
|
||||
'Ticket ID': 'チケットID',
|
||||
'To create a plugin, name a file/folder plugin_[name]': 'ファイル名/フォルダ名 plugin_[名称]としてプラグインを作成してください',
|
||||
'Traceback': 'トレースバック',
|
||||
'Translation strings for the application': 'アプリケーションの翻訳文字列',
|
||||
'Unable to download because:': '以下の理由でダウンロードできません:',
|
||||
'Uninstall': 'アプリ削除',
|
||||
'Upload a package:': 'パッケージをアップロード:',
|
||||
'Upload and install packed application': 'パッケージのアップロードとインストール',
|
||||
'Version': 'バージョン',
|
||||
'Versioning': 'バージョン管理',
|
||||
'Views': 'ビュー',
|
||||
'Web Framework': 'Web Framework',
|
||||
'YES': 'はい',
|
||||
'administrative interface': '管理画面',
|
||||
'and rename it:': 'ファイル名を変更:',
|
||||
'appadmin': 'アプリ管理画面',
|
||||
'application "%s" uninstalled': '"%s"アプリケーションが削除されました',
|
||||
'application compiled': 'アプリケーションがコンパイルされました',
|
||||
'arguments': '引数',
|
||||
'back': '戻る',
|
||||
'cache': 'cache',
|
||||
'cannot upload file "%(filename)s"': '"%(filename)s"ファイルをアップロードできません',
|
||||
'check all': '全てを選択',
|
||||
'code': 'コード',
|
||||
'collapse/expand all': '全て開閉する',
|
||||
'compiled application removed': 'コンパイル済みのアプリケーションが削除されました',
|
||||
'controllers': 'コントローラ',
|
||||
'create file with filename:': 'ファイル名:',
|
||||
'created by': '作成者',
|
||||
'crontab': 'crontab',
|
||||
'currently running': '現在実行中',
|
||||
'currently saved or': '現在保存されているデータ または',
|
||||
'database administration': 'データベース管理',
|
||||
'db': 'db',
|
||||
'defines tables': 'テーブル定義',
|
||||
'delete all checked': '選択したデータを全て削除',
|
||||
'delete plugin': 'プラグイン削除',
|
||||
'design': 'デザイン',
|
||||
'details': '詳細',
|
||||
'direction: ltr': 'direction: ltr',
|
||||
'docs': 'ドキュメント',
|
||||
'download layouts': 'レイアウトのダウンロード',
|
||||
'download plugins': 'プラグインのダウンロード',
|
||||
'edit all': '全て編集',
|
||||
'edit views:': 'ビューの編集:',
|
||||
'exposes': '公開',
|
||||
'exposes:': '公開:',
|
||||
'extends': '継承',
|
||||
'filter': 'フィルタ',
|
||||
'go!': '実行!',
|
||||
'includes': 'インクルード',
|
||||
'index': 'index',
|
||||
'inspect attributes': '引数の検査',
|
||||
'languages': '言語',
|
||||
'loading...': 'ロードしています...',
|
||||
'locals': 'ローカル',
|
||||
'models': 'モデル',
|
||||
'modules': 'モジュール',
|
||||
'new plugin installed': '新しいプラグインがインストールされました',
|
||||
'online designer': 'オンラインデザイナー',
|
||||
'pack plugin': 'プラグインのパッケージ化',
|
||||
'plugin "%(plugin)s" deleted': '"%(plugin)s"プラグインは削除されました',
|
||||
'plugins': 'プラグイン',
|
||||
'request': 'リクエスト',
|
||||
'response': 'レスポンス',
|
||||
'restart': '最初からやり直し',
|
||||
'restore': '復元',
|
||||
'revert': '一つ前に戻す',
|
||||
'session': 'セッション',
|
||||
'session expired': 'セッションの有効期限が切れました',
|
||||
'shell': 'shell',
|
||||
'skip to generate': 'スキップしてアプリ生成画面へ移動',
|
||||
'state': 'state',
|
||||
'static': '静的ファイル',
|
||||
'test': 'テスト',
|
||||
'to previous version.': '前のバージョンへ戻す。',
|
||||
'uncheck all': '全ての選択を解除',
|
||||
'update all languages': '全ての言語を更新',
|
||||
'upload': 'アップロード',
|
||||
'upload file:': 'ファイルをアップロード:',
|
||||
'upload plugin file:': 'プラグインファイルをアップロード:',
|
||||
'user': 'ユーザー',
|
||||
'variables': '変数',
|
||||
'views': 'ビュー',
|
||||
'web2py Recent Tweets': '最近のweb2pyTweets',
|
||||
'web2py is up to date': 'web2pyは最新です',
|
||||
}
|
||||
|
||||
@@ -1,18 +1,21 @@
|
||||
# coding: utf8
|
||||
{
|
||||
'!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 rows deleted': 'Wierszy usuniętych: %s',
|
||||
'%s rows updated': 'Wierszy uaktualnionych: %s',
|
||||
'%s %%{row} deleted': 'Wierszy usuniętych: %s',
|
||||
'%s %%{row} updated': 'Wierszy uaktualnionych: %s',
|
||||
'(requires internet access)': '(requires internet access)',
|
||||
'(something like "it-it")': '(coś podobnego do "it-it")',
|
||||
'@markmin\x01Searching: **%s** %%{file}': 'Searching: **%s** files',
|
||||
'A new version of web2py is available': 'Nowa wersja web2py jest dostępna',
|
||||
'A new version of web2py is available: %s': 'Nowa wersja web2py jest dostępna: %s',
|
||||
'ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.': 'UWAGA: Wymagane jest bezpieczne (HTTPS) połączenie lub połączenie z lokalnego adresu.',
|
||||
'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.': 'UWAGA: TESTOWANIE NIE JEST BEZPIECZNE W ŚRODOWISKU WIELOWĄTKOWYM, TAK WIĘC NIE URUCHAMIAJ WIELU TESTÓW JEDNOCZEŚNIE.',
|
||||
'ATTENTION: you cannot edit the running application!': 'UWAGA: nie można edytować uruchomionych aplikacji!',
|
||||
'About': 'Informacje o',
|
||||
'About': 'informacje',
|
||||
'About application': 'Informacje o aplikacji',
|
||||
'Additional code for your application': 'Additional code for your application',
|
||||
'Admin is disabled because insecure channel': 'Panel administracyjny wyłączony z powodu braku bezpiecznego połączenia',
|
||||
@@ -28,9 +31,14 @@
|
||||
'Cannot be empty': 'Nie może być puste',
|
||||
'Cannot compile: there are errors in your app. Debug it, correct errors and try again.': 'Nie można skompilować: w Twojej aplikacji są błędy . Znajdź je, popraw a następnie spróbój ponownie.',
|
||||
'Cannot compile: there are errors in your app:': 'Cannot compile: there are errors in your app:',
|
||||
'Change admin password': 'change admin password',
|
||||
'Check for upgrades': 'check for upgrades',
|
||||
'Check to delete': 'Zaznacz aby usunąć',
|
||||
'Checking for upgrades...': 'Sprawdzanie aktualizacji...',
|
||||
'Clean': 'oczyść',
|
||||
'Compile': 'skompiluj',
|
||||
'Controllers': 'Kontrolery',
|
||||
'Create': 'create',
|
||||
'Create new simple application': 'Utwórz nową aplikację',
|
||||
'Current request': 'Aktualne żądanie',
|
||||
'Current response': 'Aktualna odpowiedź',
|
||||
@@ -39,9 +47,11 @@
|
||||
'Date and Time': 'Data i godzina',
|
||||
'Delete': 'Usuń',
|
||||
'Delete:': 'Usuń:',
|
||||
'Deploy': 'deploy',
|
||||
'Deploy on Google App Engine': 'Umieść na Google App Engine',
|
||||
'Design for': 'Projekt dla',
|
||||
'EDIT': 'EDYTUJ',
|
||||
'Edit': 'edytuj',
|
||||
'Edit application': 'Edycja aplikacji',
|
||||
'Edit current record': 'Edytuj aktualny rekord',
|
||||
'Editing Language file': 'Edytuj plik tłumaczeń',
|
||||
@@ -49,11 +59,14 @@
|
||||
'Editing file "%s"': 'Edycja pliku "%s"',
|
||||
'Enterprise Web Framework': 'Enterprise Web Framework',
|
||||
'Error logs for "%(app)s"': 'Wpisy błędów dla "%(app)s"',
|
||||
'Errors': 'błędy',
|
||||
'Exception instance attributes': 'Exception instance attributes',
|
||||
'Functions with no doctests will result in [passed] tests.': 'Funkcje bez doctestów będą dołączone do [zaliczonych] testów.',
|
||||
'Hello World': 'Witaj Świecie',
|
||||
'Help': 'pomoc',
|
||||
'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.': 'Jeżeli powyższy raport zawiera numer biletu błędu, oznacza to błąd podczas wykonywania kontrolera przez próbą uruchomienia doctestów. Zazwyczaj jest to spowodowane nieprawidłowymi wcięciami linii kodu lub błędami w module poza ciałem funkcji.\nTytuł w kolorze zielonym oznacza, ze wszystkie (zdefiniowane) testy zakończyły się sukcesem. W tej sytuacji ich wyniki nie są pokazane.',
|
||||
'Import/Export': 'Importuj/eksportuj',
|
||||
'Install': 'install',
|
||||
'Installed applications': 'Zainstalowane aplikacje',
|
||||
'Internal State': 'Stan wewnętrzny',
|
||||
'Invalid Query': 'Błędne zapytanie',
|
||||
@@ -64,6 +77,7 @@
|
||||
'License for': 'Licencja dla',
|
||||
'Login': 'Zaloguj',
|
||||
'Login to the Administrative Interface': 'Logowanie do panelu administracyjnego',
|
||||
'Logout': 'wyloguj',
|
||||
'Models': 'Modele',
|
||||
'Modules': 'Moduły',
|
||||
'NO': 'NIE',
|
||||
@@ -72,17 +86,22 @@
|
||||
'New simple application': 'New simple application',
|
||||
'No databases in this application': 'Brak baz danych w tej aplikacji',
|
||||
'Original/Translation': 'Oryginał/tłumaczenie',
|
||||
'Overwrite installed app': 'overwrite installed app',
|
||||
'PAM authenticated user, cannot change password here': 'PAM authenticated user, cannot change password here',
|
||||
'Pack all': 'spakuj wszystko',
|
||||
'Pack compiled': 'spakuj skompilowane',
|
||||
'Peeking at file': 'Podgląd pliku',
|
||||
'Plugin "%s" in application': 'Wtyczka "%s" w aplikacji',
|
||||
'Plugins': 'Wtyczki',
|
||||
'Powered by': 'Zasilane przez',
|
||||
'Query:': 'Zapytanie:',
|
||||
'Remove compiled': 'usuń skompilowane',
|
||||
'Resolve Conflict file': 'Rozwiąż konflikt plików',
|
||||
'Rows in table': 'Wiersze w tabeli',
|
||||
'Rows selected': 'Wierszy wybranych',
|
||||
'Saved file hash:': 'Suma kontrolna zapisanego pliku:',
|
||||
'Searching:': 'Searching:',
|
||||
'Site': 'strona główna',
|
||||
'Start wizard': 'start wizard',
|
||||
'Static files': 'Pliki statyczne',
|
||||
'Sure you want to delete this object?': 'Czy na pewno chcesz usunąć ten obiekt?',
|
||||
'TM': 'TM',
|
||||
@@ -108,6 +127,7 @@
|
||||
'Unable to download app': 'Nie można ściągnąć aplikacji',
|
||||
'Unable to download app because:': 'Unable to download app because:',
|
||||
'Unable to download because': 'Unable to download because',
|
||||
'Uninstall': 'odinstaluj',
|
||||
'Update:': 'Uaktualnij:',
|
||||
'Upload & install packed application': 'Upload & install packed application',
|
||||
'Upload a package:': 'Upload a package:',
|
||||
@@ -118,7 +138,6 @@
|
||||
'Views': 'Widoki',
|
||||
'Welcome to web2py': 'Witaj w web2py',
|
||||
'YES': 'TAK',
|
||||
'About': 'informacje',
|
||||
'additional code for your application': 'dodatkowy kod Twojej aplikacji',
|
||||
'admin disabled because no admin password': 'panel administracyjny wyłączony z powodu braku hasła administracyjnego',
|
||||
'admin disabled because not supported on google app engine': 'panel administracyjny wyłączony z powodu braku wsparcia na google apps engine',
|
||||
@@ -137,19 +156,14 @@
|
||||
'cache, errors and sessions cleaned': 'pamięć podręczna, bilety błędów oraz pliki sesji zostały wyczyszczone',
|
||||
'cannot create file': 'nie można utworzyć pliku',
|
||||
'cannot upload file "%(filename)s"': 'nie można wysłać pliku "%(filename)s"',
|
||||
'Change admin password': 'change admin password',
|
||||
'check all': 'zaznacz wszystko',
|
||||
'Check for upgrades': 'check for upgrades',
|
||||
'Clean': 'oczyść',
|
||||
'click here for online examples': 'kliknij aby przejść do interaktywnych przykładów',
|
||||
'click here for the administrative interface': 'kliknij aby przejść do panelu administracyjnego',
|
||||
'click to check for upgrades': 'kliknij aby sprawdzić aktualizacje',
|
||||
'code': 'code',
|
||||
'collapse/expand all': 'collapse/expand all',
|
||||
'Compile': 'skompiluj',
|
||||
'compiled application removed': 'skompilowana aplikacja została usunięta',
|
||||
'controllers': 'kontrolery',
|
||||
'Create': 'create',
|
||||
'create file with filename:': 'utwórz plik o nazwie:',
|
||||
'create new application:': 'utwórz nową aplikację:',
|
||||
'created by': 'utworzone przez',
|
||||
@@ -165,16 +179,13 @@
|
||||
'delete': 'usuń',
|
||||
'delete all checked': 'usuń wszystkie zaznaczone',
|
||||
'delete plugin': 'usuń wtyczkę',
|
||||
'Deploy': 'deploy',
|
||||
'design': 'projektuj',
|
||||
'direction: ltr': 'direction: ltr',
|
||||
'done!': 'zrobione!',
|
||||
'download layouts': 'download layouts',
|
||||
'download plugins': 'download plugins',
|
||||
'Edit': 'edytuj',
|
||||
'edit controller': 'edytuj kontroler',
|
||||
'edit views:': 'edit views:',
|
||||
'Errors': 'błędy',
|
||||
'export as csv file': 'eksportuj jako plik csv',
|
||||
'exposes': 'eksponuje',
|
||||
'extends': 'rozszerza',
|
||||
@@ -189,14 +200,11 @@
|
||||
'file does not exist': 'plik nie istnieje',
|
||||
'file saved on %(time)s': 'plik zapisany o %(time)s',
|
||||
'file saved on %s': 'plik zapisany o %s',
|
||||
'files': 'files',
|
||||
'filter': 'filter',
|
||||
'Help': 'pomoc',
|
||||
'htmledit': 'edytuj HTML',
|
||||
'includes': 'zawiera',
|
||||
'insert new': 'wstaw nowy rekord tabeli',
|
||||
'insert new %s': 'wstaw nowy rekord do tabeli %s',
|
||||
'Install': 'install',
|
||||
'internal error': 'wewnętrzny błąd',
|
||||
'invalid password': 'błędne hasło',
|
||||
'invalid request': 'błędne zapytanie',
|
||||
@@ -206,7 +214,6 @@
|
||||
'languages updated': 'pliki tłumaczeń zostały uaktualnione',
|
||||
'loading...': 'wczytywanie...',
|
||||
'login': 'zaloguj',
|
||||
'Logout': 'wyloguj',
|
||||
'merge': 'zespól',
|
||||
'models': 'modele',
|
||||
'modules': 'moduły',
|
||||
@@ -218,9 +225,6 @@
|
||||
'or import from csv file': 'lub zaimportuj z pliku csv',
|
||||
'or provide app url:': 'or provide app url:',
|
||||
'or provide application url:': 'lub podaj url aplikacji:',
|
||||
'Overwrite installed app': 'overwrite installed app',
|
||||
'Pack all': 'spakuj wszystko',
|
||||
'Pack compiled': 'spakuj skompilowane',
|
||||
'pack plugin': 'spakuj wtyczkę',
|
||||
'password changed': 'password changed',
|
||||
'plugin "%(plugin)s" deleted': 'wtyczka "%(plugin)s" została usunięta',
|
||||
@@ -229,16 +233,13 @@
|
||||
'record': 'rekord',
|
||||
'record does not exist': 'rekord nie istnieje',
|
||||
'record id': 'ID rekordu',
|
||||
'Remove compiled': 'usuń skompilowane',
|
||||
'restore': 'odtwórz',
|
||||
'revert': 'przywróć',
|
||||
'save': 'zapisz',
|
||||
'selected': 'zaznaczone',
|
||||
'session expired': 'sesja wygasła',
|
||||
'shell': 'powłoka',
|
||||
'Site': 'strona główna',
|
||||
'some files could not be removed': 'niektóre pliki nie mogły zostać usunięte',
|
||||
'Start wizard': 'start wizard',
|
||||
'state': 'stan',
|
||||
'static': 'pliki statyczne',
|
||||
'submit': 'wyślij',
|
||||
@@ -259,7 +260,6 @@
|
||||
'unable to uninstall "%s"': 'nie można odinstalować "%s"',
|
||||
'unable to upgrade because "%s"': 'unable to upgrade because "%s"',
|
||||
'uncheck all': 'odznacz wszystko',
|
||||
'Uninstall': 'odinstaluj',
|
||||
'update': 'uaktualnij',
|
||||
'update all languages': 'uaktualnij wszystkie pliki tłumaczeń',
|
||||
'upgrade web2py now': 'upgrade web2py now',
|
||||
@@ -275,5 +275,3 @@
|
||||
'web2py is up to date': 'web2py jest aktualne',
|
||||
'web2py upgraded; please restart it': 'web2py upgraded; please restart it',
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
#!/usr/bin/env python
|
||||
{
|
||||
# "singular form (0)": ["first plural form (1)", "second plural form (2)", ...],
|
||||
'file': ['files'],
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
#!/usr/bin/env python
|
||||
{
|
||||
# "singular form (0)": ["first plural form (1)", "second plural form (2)", ...],
|
||||
'файл': ['файла','файлов'],
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
#!/usr/bin/env python
|
||||
{
|
||||
# "singular form (0)": ["first plural form (1)", "second plural form (2)", ...],
|
||||
'файл': ['файли','файлів'],
|
||||
}
|
||||
@@ -1,18 +1,21 @@
|
||||
# coding: utf8
|
||||
{
|
||||
'!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 "campo1=\'novo_valor\'". Não é permitido atualizar ou apagar resultados de um JOIN',
|
||||
'%Y-%m-%d': '%d/%m/%Y',
|
||||
'%Y-%m-%d %H:%M:%S': '%d/%m/%Y %H:%M:%S',
|
||||
'%s rows deleted': '%s registros apagados',
|
||||
'%s rows updated': '%s registros atualizados',
|
||||
'%s %%{row} deleted': '%s registros apagados',
|
||||
'%s %%{row} updated': '%s registros atualizados',
|
||||
'(requires internet access)': '(requer acesso a internet)',
|
||||
'(something like "it-it")': '(algo como "it-it")',
|
||||
'@markmin\x01Searching: **%s** %%{file}': 'Searching: **%s** files',
|
||||
'A new version of web2py is available': 'Está disponível uma nova versão do web2py',
|
||||
'A new version of web2py is available: %s': 'Está disponível uma nova versão do web2py: %s',
|
||||
'ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.': 'ATENÇÃO o login requer uma conexão segura (HTTPS) ou executar de localhost.',
|
||||
'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.': 'ATENÇÃO OS TESTES NÃO THREAD SAFE, NÃO EFETUE MÚLTIPLOS TESTES AO MESMO TEMPO.',
|
||||
'ATTENTION: you cannot edit the running application!': 'ATENÇÃO: Não pode modificar a aplicação em execução!',
|
||||
'About': 'Sobre',
|
||||
'About': 'sobre',
|
||||
'About application': 'Sobre a aplicação',
|
||||
'Additional code for your application': 'Additional code for your application',
|
||||
'Admin is disabled because insecure channel': 'Admin desabilitado pois o canal não é seguro',
|
||||
@@ -30,12 +33,17 @@
|
||||
'Cannot compile: there are errors in your app. Debug it, correct errors and try again.': 'Não é possível compilar: Existem erros em sua aplicação. Depure, corrija os errros e tente novamente',
|
||||
'Cannot compile: there are errors in your app:': 'Não é possível compilar: Existem erros em sua aplicação',
|
||||
'Change Password': 'Trocar Senha',
|
||||
'Change admin password': 'mudar senha de administrador',
|
||||
'Check for upgrades': 'checar por atualizações',
|
||||
'Check to delete': 'Marque para apagar',
|
||||
'Checking for upgrades...': 'Buscando atualizações...',
|
||||
'Clean': 'limpar',
|
||||
'Click row to expand traceback': 'Clique em uma coluna para expandir o log do erro',
|
||||
'Client IP': 'IP do cliente',
|
||||
'Compile': 'compilar',
|
||||
'Controllers': 'Controladores',
|
||||
'Count': 'Contagem',
|
||||
'Create': 'criar',
|
||||
'Create new application using the Wizard': 'Criar nova aplicação utilizando o assistente',
|
||||
'Create new simple application': 'Crie uma nova aplicação',
|
||||
'Current request': 'Requisição atual',
|
||||
@@ -45,12 +53,14 @@
|
||||
'Date and Time': 'Data e Hora',
|
||||
'Delete': 'Apague',
|
||||
'Delete:': 'Apague:',
|
||||
'Deploy': 'publicar',
|
||||
'Deploy on Google App Engine': 'Publicar no Google App Engine',
|
||||
'Description': 'Descrição',
|
||||
'Design for': 'Projeto de',
|
||||
'Detailed traceback description': 'Detailed traceback description',
|
||||
'E-mail': 'E-mail',
|
||||
'EDIT': 'EDITAR',
|
||||
'Edit': 'editar',
|
||||
'Edit Profile': 'Editar Perfil',
|
||||
'Edit application': 'Editar aplicação',
|
||||
'Edit current record': 'Editar o registro atual',
|
||||
@@ -62,6 +72,7 @@
|
||||
'Error logs for "%(app)s"': 'Logs de erro para "%(app)s"',
|
||||
'Error snapshot': 'Error snapshot',
|
||||
'Error ticket': 'Error ticket',
|
||||
'Errors': 'erros',
|
||||
'Exception instance attributes': 'Atributos da instancia de excessão',
|
||||
'File': 'Arquivo',
|
||||
'First name': 'Nome',
|
||||
@@ -69,8 +80,10 @@
|
||||
'Functions with no doctests will result in [passed] tests.': 'Funções sem doctests resultarão em testes [aceitos].',
|
||||
'Group ID': 'ID do Grupo',
|
||||
'Hello World': 'Olá Mundo',
|
||||
'Help': 'ajuda',
|
||||
'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.': 'Se o relatório acima contém um número de ticket, isso indica uma falha no controlador em execução, antes de tantar executar os doctests. Isto acontece geralmente por erro de endentação ou erro fora do código da função.\nO titulo em verde indica que os testes (se definidos) passaram. Neste caso os testes não são mostrados.',
|
||||
'Import/Export': 'Importar/Exportar',
|
||||
'Install': 'instalar',
|
||||
'Installed applications': 'Aplicações instaladas',
|
||||
'Internal State': 'Estado Interno',
|
||||
'Invalid Query': 'Consulta inválida',
|
||||
@@ -83,7 +96,7 @@
|
||||
'License for': 'Licença para',
|
||||
'Login': 'Entrar',
|
||||
'Login to the Administrative Interface': 'Entrar na interface adminitrativa',
|
||||
'Logout': 'Sair',
|
||||
'Logout': 'finalizar sessão',
|
||||
'Lost Password': 'Senha perdida',
|
||||
'Models': 'Modelos',
|
||||
'Modules': 'Módulos',
|
||||
@@ -95,7 +108,10 @@
|
||||
'No databases in this application': 'Não existem bancos de dados nesta aplicação',
|
||||
'Origin': 'Origem',
|
||||
'Original/Translation': 'Original/Tradução',
|
||||
'Overwrite installed app': 'sobrescrever aplicação instalada',
|
||||
'PAM authenticated user, cannot change password here': 'usuario autenticado por PAM, não pode alterar a senha por aqui',
|
||||
'Pack all': 'criar pacote',
|
||||
'Pack compiled': 'criar pacote compilado',
|
||||
'Password': 'Senha',
|
||||
'Peeking at file': 'Visualizando arquivo',
|
||||
'Plugin "%s" in application': 'Plugin "%s" na aplicação',
|
||||
@@ -105,12 +121,14 @@
|
||||
'Record ID': 'ID do Registro',
|
||||
'Register': 'Registrar-se',
|
||||
'Registration key': 'Chave de registro',
|
||||
'Remove compiled': 'eliminar compilados',
|
||||
'Resolve Conflict file': 'Arquivo de resolução de conflito',
|
||||
'Role': 'Papel',
|
||||
'Rows in table': 'Registros na tabela',
|
||||
'Rows selected': 'Registros selecionados',
|
||||
'Saved file hash:': 'Hash do arquivo salvo:',
|
||||
'Searching:': 'Searching:',
|
||||
'Site': 'site',
|
||||
'Start wizard': 'iniciar assistente',
|
||||
'Static files': 'Arquivos estáticos',
|
||||
'Sure you want to delete this object?': 'Tem certeza que deseja apaagr este objeto?',
|
||||
'TM': 'MR',
|
||||
@@ -140,6 +158,7 @@
|
||||
'Unable to download app': 'Não é possível baixar a aplicação',
|
||||
'Unable to download app because:': 'Não é possível baixar a aplicação porque:',
|
||||
'Unable to download because': 'Não é possível baixar porque',
|
||||
'Uninstall': 'desinstalar',
|
||||
'Update:': 'Atualizar:',
|
||||
'Upload & install packed application': 'Faça upload e instale uma aplicação empacotada',
|
||||
'Upload a package:': 'Faça upload de um pacote:',
|
||||
@@ -151,7 +170,6 @@
|
||||
'Views': 'Visões',
|
||||
'Welcome to web2py': 'Bem-vindo ao web2py',
|
||||
'YES': 'SIM',
|
||||
'About': 'sobre',
|
||||
'additional code for your application': 'código adicional para sua aplicação',
|
||||
'admin disabled because no admin password': ' admin desabilitado por falta de senha definida',
|
||||
'admin disabled because not supported on google app engine': 'admin dehabilitado, não é soportado no GAE',
|
||||
@@ -171,10 +189,7 @@
|
||||
'cache, errors and sessions cleaned': 'cache, erros e sessões eliminadas',
|
||||
'cannot create file': 'Não é possível criar o arquivo',
|
||||
'cannot upload file "%(filename)s"': 'não é possível fazer upload do arquivo "%(filename)s"',
|
||||
'Change admin password': 'mudar senha de administrador',
|
||||
'check all': 'marcar todos',
|
||||
'Check for upgrades': 'checar por atualizações',
|
||||
'Clean': 'limpar',
|
||||
'click here for online examples': 'clique para ver exemplos online',
|
||||
'click here for the administrative interface': 'Clique aqui para acessar a interface administrativa',
|
||||
'click to check for upgrades': 'clique aqui para checar por atualizações',
|
||||
@@ -182,10 +197,8 @@
|
||||
'code': 'código',
|
||||
'collapse/expand all': 'collapse/expand all',
|
||||
'commit (mercurial)': 'commit (mercurial)',
|
||||
'Compile': 'compilar',
|
||||
'compiled application removed': 'aplicação compilada removida',
|
||||
'controllers': 'controladores',
|
||||
'Create': 'criar',
|
||||
'create file with filename:': 'criar um arquivo com o nome:',
|
||||
'create new application:': 'nome da nova aplicação:',
|
||||
'created by': 'criado por',
|
||||
@@ -202,16 +215,13 @@
|
||||
'delete': 'apagar',
|
||||
'delete all checked': 'apagar marcados',
|
||||
'delete plugin': 'apagar plugin',
|
||||
'Deploy': 'publicar',
|
||||
'design': 'modificar',
|
||||
'direction: ltr': 'direção: ltr',
|
||||
'done!': 'feito!',
|
||||
'download layouts': 'download layouts',
|
||||
'download plugins': 'download plugins',
|
||||
'Edit': 'editar',
|
||||
'edit controller': 'editar controlador',
|
||||
'edit views:': 'editar visões:',
|
||||
'Errors': 'erros',
|
||||
'export as csv file': 'exportar como arquivo CSV',
|
||||
'exposes': 'expõe',
|
||||
'extends': 'estende',
|
||||
@@ -226,15 +236,12 @@
|
||||
'file does not exist': 'arquivo não existe',
|
||||
'file saved on %(time)s': 'arquivo salvo em %(time)s',
|
||||
'file saved on %s': 'arquivo salvo em %s',
|
||||
'files': 'files',
|
||||
'filter': 'filter',
|
||||
'Help': 'ajuda',
|
||||
'htmledit': 'htmledit',
|
||||
'includes': 'inclui',
|
||||
'insert new': 'inserir novo',
|
||||
'insert new %s': 'inserir novo %s',
|
||||
'inspect attributes': 'inspect attributes',
|
||||
'Install': 'instalar',
|
||||
'internal error': 'erro interno',
|
||||
'invalid password': 'senha inválida',
|
||||
'invalid request': 'solicitação inválida',
|
||||
@@ -245,7 +252,6 @@
|
||||
'loading...': 'carregando...',
|
||||
'locals': 'locals',
|
||||
'login': 'inicio de sessão',
|
||||
'Logout': 'finalizar sessão',
|
||||
'manage': 'gerenciar',
|
||||
'merge': 'juntar',
|
||||
'models': 'modelos',
|
||||
@@ -258,9 +264,6 @@
|
||||
'or import from csv file': 'ou importar de um arquivo CSV',
|
||||
'or provide app url:': 'ou forneça a url de uma aplicação:',
|
||||
'or provide application url:': 'ou forneça a url de uma aplicação:',
|
||||
'Overwrite installed app': 'sobrescrever aplicação instalada',
|
||||
'Pack all': 'criar pacote',
|
||||
'Pack compiled': 'criar pacote compilado',
|
||||
'pack plugin': 'empacotar plugin',
|
||||
'password changed': 'senha alterada',
|
||||
'plugin "%(plugin)s" deleted': 'plugin "%(plugin)s" eliminado',
|
||||
@@ -269,7 +272,6 @@
|
||||
'record': 'registro',
|
||||
'record does not exist': 'o registro não existe',
|
||||
'record id': 'id do registro',
|
||||
'Remove compiled': 'eliminar compilados',
|
||||
'request': 'request',
|
||||
'response': 'response',
|
||||
'restore': 'restaurar',
|
||||
@@ -279,9 +281,7 @@
|
||||
'session': 'session',
|
||||
'session expired': 'sessão expirada',
|
||||
'shell': 'Terminal',
|
||||
'Site': 'site',
|
||||
'some files could not be removed': 'alguns arquicos não puderam ser removidos',
|
||||
'Start wizard': 'iniciar assistente',
|
||||
'state': 'estado',
|
||||
'static': 'estáticos',
|
||||
'submit': 'enviar',
|
||||
@@ -302,7 +302,6 @@
|
||||
'unable to uninstall "%s"': 'não é possível instalar "%s"',
|
||||
'unable to upgrade because "%s"': 'não é possível atualizar porque "%s"',
|
||||
'uncheck all': 'desmarcar todos',
|
||||
'Uninstall': 'desinstalar',
|
||||
'update': 'atualizar',
|
||||
'update all languages': 'atualizar todas as linguagens',
|
||||
'upgrade web2py now': 'atualize o web2py agora',
|
||||
@@ -318,5 +317,3 @@
|
||||
'web2py is up to date': 'web2py está atualizado',
|
||||
'web2py upgraded; please restart it': 'web2py atualizado; favor reiniciar',
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,12 +1,14 @@
|
||||
# coding: utf8
|
||||
{
|
||||
'!=': '!=',
|
||||
'!langcode!': 'ro',
|
||||
'!langname!': 'Română',
|
||||
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"update" (actualizează) este o expresie opțională precum "câmp1=\'valoare_nouă\'". Nu puteți actualiza sau șterge rezultatele unui JOIN',
|
||||
'%(nrows)s records found': '%(nrows)s înregistrări găsite',
|
||||
'%Y-%m-%d': '%Y-%m-%d',
|
||||
'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
|
||||
'%s rows deleted': '%s linii șterse',
|
||||
'%s rows updated': '%s linii actualizate',
|
||||
'%s %%{row} deleted': '%s linii șterse',
|
||||
'%s %%{row} updated': '%s linii actualizate',
|
||||
'(requires internet access)': '(are nevoie de acces internet)',
|
||||
'(something like "it-it")': '(ceva ce seamănă cu "it-it")',
|
||||
'<': '<',
|
||||
@@ -14,6 +16,7 @@
|
||||
'=': '=',
|
||||
'>': '>',
|
||||
'>=': '>=',
|
||||
'@markmin\x01Searching: **%s** %%{file}': 'Căutare: **%s** fișiere',
|
||||
'A new version of web2py is available': 'O nouă versiune de web2py este disponibilă',
|
||||
'A new version of web2py is available: %s': 'O nouă versiune de web2py este disponibilă: %s',
|
||||
'ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.': 'ATENȚIE: Nu vă puteți conecta decât utilizând o conexiune securizată (HTTPS) sau rulând aplicația pe computerul local.',
|
||||
@@ -174,11 +177,11 @@
|
||||
'Next Edit Point': 'Următorul punct de editare',
|
||||
'No databases in this application': 'Aplicație fără bază de date',
|
||||
'No ticket_storage.txt found under /private folder': 'No ticket_storage.txt found under /private folder',
|
||||
'OR': 'SAU',
|
||||
'Object or table name': 'Obiect sau nume de tabel',
|
||||
'Old password': 'Parola veche',
|
||||
'Online examples': 'Exemple online',
|
||||
'Or': 'Sau',
|
||||
'OR': 'SAU',
|
||||
'Origin': 'Origine',
|
||||
'Original/Translation': 'Original/Traducere',
|
||||
'Other Plugins': 'Alte plugin-uri',
|
||||
@@ -220,7 +223,6 @@
|
||||
'Save via Ajax': 'Salvează utilizând Ajax',
|
||||
'Saved file hash:': 'Hash fișier salvat:',
|
||||
'Search': 'Căutare',
|
||||
'Searching:': 'Căutare:',
|
||||
'Semantic': 'Semantică',
|
||||
'Services': 'Servicii',
|
||||
'Set Breakpoint on %s at line %s: %s': 'Set Breakpoint on %s at line %s: %s',
|
||||
@@ -368,7 +370,6 @@
|
||||
'file does not exist': 'fișier inexistent',
|
||||
'file saved on %(time)s': 'fișier salvat %(time)s',
|
||||
'file saved on %s': 'fișier salvat pe %s',
|
||||
'files': 'fișiere',
|
||||
'filter': 'filtru',
|
||||
'help': 'ajutor',
|
||||
'htmledit': 'editare html',
|
||||
|
||||
+196
-166
@@ -1,183 +1,31 @@
|
||||
# coding: utf8
|
||||
{
|
||||
'!langcode!': 'ru',
|
||||
'!langname!': 'Русский',
|
||||
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"Update" ist ein optionaler Ausdruck wie "Feld1 = \'newvalue". JOIN Ergebnisse können nicht aktualisiert oder gelöscht werden',
|
||||
'%s %%{row} deleted': '%s %%{строкa} %%{удаленa}',
|
||||
'%s %%{row} updated': '%s %%{строкa} %%{обновленa}',
|
||||
'%Y-%m-%d': '%Y-%m-%d',
|
||||
'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
|
||||
'%s rows deleted': '%s строк удалено',
|
||||
'%s rows updated': '%s строк обновлено',
|
||||
'(requires internet access)': '(требует подключения к интернету)',
|
||||
'(something like "it-it")': '(наподобие "it-it")',
|
||||
'@markmin\x01Searching: **%s** %%{file}': 'Найдено: **%s** %%{файл}',
|
||||
'A new version of web2py is available': 'Доступна новая версия web2py',
|
||||
'A new version of web2py is available: %s': 'Доступна новая версия web2py: %s',
|
||||
'A new version of web2py is available: Version 1.85.3 (2010-09-18 07:07:46)\n': 'Доступна новая версия web2py: Версия 1.85.3 (2010-09-18 07:07:46)\n',
|
||||
'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: This is an experimental feature and it needs more testing.': 'ВНИМАНИЕ: Это экспериментальная возможность и требует тестирования.',
|
||||
'ATTENTION: you cannot edit the running application!': 'ВНИМАНИЕ: Вы не можете редактировать работающее приложение!',
|
||||
'Abort': 'Отмена',
|
||||
'About': 'О',
|
||||
'About application': 'О приложении',
|
||||
'Additional code for your application': 'Допольнительный код для вашего приложения',
|
||||
'Admin is disabled because insecure channel': 'Админпанель выключена из-за небезопасного соединения',
|
||||
'Admin is disabled because unsecure channel': 'Админпанель выключен из-за небезопасного соединения',
|
||||
'Admin language': 'Язык админпанели',
|
||||
'Administrator Password:': 'Пароль администратора:',
|
||||
'Application name:': 'Название приложения:',
|
||||
'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"?',
|
||||
'Are you sure you want to upgrade web2py now?': 'Вы действительно хотите обновить web2py сейчас?',
|
||||
'Authentication': 'Аутентификация',
|
||||
'Available databases and tables': 'Доступные базы данных и таблицы',
|
||||
'Cannot be empty': 'Не может быть пустым',
|
||||
'Cannot compile: there are errors in your app. Debug it, correct errors and try again.': 'Невозможно компилировать: в приложении присутствуют ошибки. Отладьте его, исправьте ошибки и попробуйте заново.',
|
||||
'Change Password': 'Изменить пароль',
|
||||
'Check to delete': 'Поставьте для удаления',
|
||||
'Checking for upgrades...': 'Проверка обновлений...',
|
||||
'Client IP': 'IP клиента',
|
||||
'Controller': 'Контроллер',
|
||||
'Controllers': 'Контроллеры',
|
||||
'Copyright': 'Copyright',
|
||||
'Create new simple application': 'Создать новое простое приложение',
|
||||
'Current request': 'Текущий запрос',
|
||||
'Current response': 'Текущий ответ',
|
||||
'Current session': 'Текущая сессия',
|
||||
'DB Model': 'Модель БД',
|
||||
'DESIGN': 'ДИЗАЙН',
|
||||
'Database': 'База данных',
|
||||
'Date and Time': 'Дата и время',
|
||||
'Delete': 'Удалить',
|
||||
'Delete:': 'Удалить:',
|
||||
'Deploy on Google App Engine': 'Развернуть на Google App Engine',
|
||||
'Description': 'Описание',
|
||||
'Design for': 'Дизайн для',
|
||||
'E-mail': 'E-mail',
|
||||
'EDIT': 'ПРАВКА',
|
||||
'Edit': 'Правка',
|
||||
'Edit Profile': 'Правка профиля',
|
||||
'Edit This App': 'Правка данного приложения',
|
||||
'Edit application': 'Правка приложения',
|
||||
'Edit current record': 'Правка текущей записи',
|
||||
'Editing Language file': 'Правка языкового файла',
|
||||
'Editing file': 'Правка файла',
|
||||
'Editing file "%s"': 'Правка файла "%s"',
|
||||
'Enterprise Web Framework': 'Enterprise Web Framework',
|
||||
'Error logs for "%(app)s"': 'Журнал ошибок для "%(app)"',
|
||||
'Exception instance attributes': 'Атрибуты объекта исключения',
|
||||
'Expand Abbreviation': 'Раскрыть аббревиатуру',
|
||||
'First name': 'Имя',
|
||||
'Functions with no doctests will result in [passed] tests.': 'Функции без doctest будут давать [прошел] в тестах.',
|
||||
'Go to Matching Pair': 'К подходящей паре',
|
||||
'Group ID': 'ID группы',
|
||||
'Hello World': 'Привет, Мир',
|
||||
'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.': 'Если отчет выше содержит номер ошибки, это указывает на ошибку при работе контроллера, до попытки выполнить doctest. Причиной чаще является неверные отступы или ошибки в коде вне функции. \nЗеленый заголовок указывает на успешное выполнение всех тестов. В этом случае результаты тестов не показываются.',
|
||||
'If you answer "yes", be patient, it may take a while to download': 'Если вы ответили "Да", потерпите, загрузка может потребовать времени',
|
||||
'If you answer yes, be patient, it may take a while to download': 'Если вы ответили "Да", потерпите, загрузка может потребовать времени',
|
||||
'Import/Export': 'Импорт/Экспорт',
|
||||
'Index': 'Индекс',
|
||||
'Installed applications': 'Установленные приложения',
|
||||
'Internal State': 'Внутренний статус',
|
||||
'Invalid Query': 'Неверный запрос',
|
||||
'Invalid action': 'Неверное действие',
|
||||
'Invalid email': 'Неверный email',
|
||||
'Key bindings': 'Связываник клавиш',
|
||||
'Key bindings for ZenConding Plugin': 'Связывание клавиш для плагина ZenConding',
|
||||
'Language files (static strings) updated': 'Языковые файлы (статичные строки) обновлены',
|
||||
'Languages': 'Языки',
|
||||
'Last name': 'Фамилия',
|
||||
'Last saved on:': 'Последнее сохранение:',
|
||||
'Layout': 'Верстка',
|
||||
'License for': 'Лицензия для',
|
||||
'Login': 'Логин',
|
||||
'Login to the Administrative Interface': 'Вход в интерфейс администратора',
|
||||
'Logout': 'Выход',
|
||||
'Lost Password': 'Забыли пароль',
|
||||
'Main Menu': 'Главное меню',
|
||||
'Match Pair': 'Найти пару',
|
||||
'Menu Model': 'Модель меню',
|
||||
'Merge Lines': 'Объединить линии',
|
||||
'Models': 'Модели',
|
||||
'Modules': 'Модули',
|
||||
'NO': 'НЕТ',
|
||||
'Name': 'Название',
|
||||
'New Record': 'Новая запись',
|
||||
'New application wizard': 'Мастер нового приложения',
|
||||
'New simple application': 'Новое простое приложение',
|
||||
'Next Edit Point': 'Следующее место правки',
|
||||
'No databases in this application': 'В приложении нет базы данных',
|
||||
'Origin': 'Оригинал',
|
||||
'Original/Translation': 'Оригинал/Перевод',
|
||||
'Password': 'Пароль',
|
||||
'Peeking at file': 'Просмотр',
|
||||
'Plugin "%s" in application': 'Плагин "%s" в приложении',
|
||||
'Plugins': 'Плагины',
|
||||
'Powered by': 'Обеспечен',
|
||||
'Previous Edit Point': 'Предыдущее место правки',
|
||||
'Query:': 'Запрос:',
|
||||
'Record ID': 'ID записи',
|
||||
'Register': 'Зарегистрироваться',
|
||||
'Registration key': 'Ключ регистрации',
|
||||
'Reset Password key': 'Сброс пароля',
|
||||
'Resolve Conflict file': 'Решить конфликт в файле',
|
||||
'Role': 'Роль',
|
||||
'Rows in table': 'Строк в таблице',
|
||||
'Rows selected': 'Выбрано строк',
|
||||
'Save via Ajax': 'Сохранить через Ajax',
|
||||
'Saved file hash:': 'Хэш сохраненного файла:',
|
||||
'Searching:': 'Поиск:',
|
||||
'Static files': 'Статические файлы',
|
||||
'Stylesheet': 'Таблицы стилей',
|
||||
'Sure you want to delete this object?': 'Действительно хотите удалить данный объект?',
|
||||
'TM': 'TM',
|
||||
'Table name': 'Название таблицы',
|
||||
'Testing application': 'Тест приложения',
|
||||
'Testing controller': 'Тест контроллера',
|
||||
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': '"query" является условием вида "db.table1.field1 == \'значение\'". Что-либо типа "db.table1.field1 db.table2.field2 ==" ведет к SQL JOIN.',
|
||||
'The application logic, each URL path is mapped in one exposed function in the controller': 'Логика приложения, каждый URL отображается к одной функции в контроллере',
|
||||
'The data representation, define database tables and sets': 'Представление данных, определите таблицы базы данных и наборы',
|
||||
'The output of the file is a dictionary that was rendered by the view': 'Выводом файла является словарь, который создан в виде',
|
||||
'The presentations layer, views are also known as templates': 'Слой презентации, виды так же известны, как шаблоны',
|
||||
'There are no controllers': 'Отсутствуют контроллеры',
|
||||
'There are no models': 'Отсутствуют модели',
|
||||
'There are no modules': 'Отсутствуют модули',
|
||||
'There are no plugins': 'Отсутствуют плагины',
|
||||
'There are no static files': 'Отсутствуют статичные файлы',
|
||||
'There are no translators, only default language is supported': 'Отсутствуют переводчики, поддерживается только стандартный язык',
|
||||
'There are no views': 'Отсутствуют виды',
|
||||
'These files are served without processing, your images go here': 'Эти файлы обслуживаются без обработки, ваши изображения попадут сюда',
|
||||
'This is a copy of the scaffolding application': 'Это копия сгенерированного приложения',
|
||||
'This is the %(filename)s template': 'Это шаблон %(filename)s',
|
||||
'Ticket': 'Тикет',
|
||||
'Timestamp': 'Время',
|
||||
'To create a plugin, name a file/folder plugin_[name]': 'Для создания плагина назовите файл/папку plugin_[название]',
|
||||
'Translation strings for the application': 'Строки перевода для приложения',
|
||||
'Unable to check for upgrades': 'Невозможно проверить обновления',
|
||||
'Unable to download': 'Невозможно загрузить',
|
||||
'Unable to download app': 'Невозможно загрузить',
|
||||
'Update:': 'Обновить:',
|
||||
'Upload & install packed application': 'Загрузить и установить приложение в архиве',
|
||||
'Upload a package:': 'Загрузить пакет:',
|
||||
'Upload existing application': 'Загрузить существующее приложение',
|
||||
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Используйте (...)&(...) для AND, (...)|(...) для OR, и ~(...) для NOT при создании сложных запросов.',
|
||||
'Use an url:': 'Используйте url:',
|
||||
'User ID': 'ID пользователя',
|
||||
'Version': 'Версия',
|
||||
'View': 'Вид',
|
||||
'Views': 'Виды',
|
||||
'Welcome %s': 'Добро пожаловать, %s',
|
||||
'Welcome to web2py': 'Добро пожаловать в web2py',
|
||||
'Which called the function': 'Который вызвал функцию',
|
||||
'Wrap with Abbreviation': 'Заключить в аббревиатуру',
|
||||
'YES': 'ДА',
|
||||
'You are successfully running web2py': 'Вы успешно запустили web2by',
|
||||
'You can modify this application and adapt it to your needs': 'Вы можете изменить это приложение и подогнать под свои нужды',
|
||||
'You visited the url': 'Вы посетили URL',
|
||||
'About': 'О',
|
||||
'additional code for your application': 'добавочный код для вашего приложения',
|
||||
'Additional code for your application': 'Допольнительный код для вашего приложения',
|
||||
'admin disabled because no admin password': 'админка отключена, потому что отсутствует пароль администратора',
|
||||
'admin disabled because not supported on google apps engine': 'админка отключена, т.к. не поддерживается на google app engine',
|
||||
'admin disabled because unable to access password file': 'админка отключена, т.к. невозможно получить доступ к файлу с паролями ',
|
||||
'Admin is disabled because insecure channel': 'Админпанель выключена из-за небезопасного соединения',
|
||||
'Admin is disabled because unsecure channel': 'Админпанель выключен из-за небезопасного соединения',
|
||||
'Admin language': 'Язык админпанели',
|
||||
'administrative interface': 'интерфейс администратора',
|
||||
'Administrator Password:': 'Пароль администратора:',
|
||||
'and rename it (required):': 'и переименуйте его (необходимо):',
|
||||
'and rename it:': ' и переименуйте его:',
|
||||
'appadmin': 'appadmin',
|
||||
@@ -185,57 +33,115 @@
|
||||
'application "%s" uninstalled': 'Приложение "%s" удалено',
|
||||
'application compiled': 'Приложение скомпилировано',
|
||||
'application is compiled and cannot be designed': 'Приложение скомпилировано и дизайн не может быть изменен',
|
||||
'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"?': 'Вы действительно хотите удалить файл "%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"?',
|
||||
'Are you sure you want to upgrade web2py now?': 'Вы действительно хотите обновить web2py сейчас?',
|
||||
'arguments': 'аргументы',
|
||||
'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: This is an experimental feature and it needs more testing.': 'ВНИМАНИЕ: Это экспериментальная возможность и требует тестирования.',
|
||||
'ATTENTION: you cannot edit the running application!': 'ВНИМАНИЕ: Вы не можете редактировать работающее приложение!',
|
||||
'Authentication': 'Аутентификация',
|
||||
'Available databases and tables': 'Доступные базы данных и таблицы',
|
||||
'back': 'назад',
|
||||
'beautify': 'Раскрасить',
|
||||
'cache': 'кэш',
|
||||
'cache, errors and sessions cleaned': 'Кэш, ошибки и сессии очищены',
|
||||
'call': 'вызов',
|
||||
'Cannot be empty': 'Не может быть пустым',
|
||||
'Cannot compile: there are errors in your app. Debug it, correct errors and try again.': 'Невозможно компилировать: в приложении присутствуют ошибки. Отладьте его, исправьте ошибки и попробуйте заново.',
|
||||
'cannot create file': 'Невозможно создать файл',
|
||||
'cannot upload file "%(filename)s"': 'Невозможно загрузить файл "%(filename)s"',
|
||||
'Change admin password': 'Изменить пароль администратора',
|
||||
'Change Password': 'Изменить пароль',
|
||||
'change password': 'изменить пароль',
|
||||
'check all': 'проверить все',
|
||||
'Check for upgrades': 'проверить обновления',
|
||||
'Check to delete': 'Поставьте для удаления',
|
||||
'Checking for upgrades...': 'Проверка обновлений...',
|
||||
'Clean': 'Очистить',
|
||||
'click here for online examples': 'нажмите здесь для онлайн примеров',
|
||||
'click here for the administrative interface': 'нажмите здесь для интерфейса администратора',
|
||||
'click to check for upgrades': 'нажмите для проверки обновления',
|
||||
'Client IP': 'IP клиента',
|
||||
'code': 'код',
|
||||
'collapse/expand all': 'свернуть/развернуть все',
|
||||
'Compile': 'Компилировать',
|
||||
'compiled application removed': 'скомпилированное приложение удалено',
|
||||
'Controller': 'Контроллер',
|
||||
'Controllers': 'Контроллеры',
|
||||
'controllers': 'контроллеры',
|
||||
'Copyright': 'Copyright',
|
||||
'Create': 'Создать',
|
||||
'create file with filename:': 'Создать файл с названием:',
|
||||
'create new application:': 'создать новое приложение:',
|
||||
'Create new simple application': 'Создать новое простое приложение',
|
||||
'created by': 'создано',
|
||||
'crontab': 'crontab',
|
||||
'Current request': 'Текущий запрос',
|
||||
'Current response': 'Текущий ответ',
|
||||
'Current session': 'Текущая сессия',
|
||||
'currently running': 'сейчас работает',
|
||||
'currently saved or': 'сейчас сохранено или',
|
||||
'customize me!': 'настрой меня!',
|
||||
'data uploaded': 'дата загрузки',
|
||||
'Database': 'База данных',
|
||||
'database': 'база данных',
|
||||
'database %s select': 'Выбор базы данных %s ',
|
||||
'database administration': 'администраторирование базы данных',
|
||||
'Date and Time': 'Дата и время',
|
||||
'db': 'бд',
|
||||
'DB Model': 'Модель БД',
|
||||
'Debug': 'Debug',
|
||||
'defines tables': 'определить таблицы',
|
||||
'Delete': 'Удалить',
|
||||
'delete': 'удалить',
|
||||
'delete all checked': 'удалить выбранные',
|
||||
'delete plugin': 'удалить плагин',
|
||||
'Delete this file (you will be asked to confirm deletion)': 'Delete this file (you will be asked to confirm deletion)',
|
||||
'Delete:': 'Удалить:',
|
||||
'Deploy': 'Развернуть',
|
||||
'Deploy on Google App Engine': 'Развернуть на Google App Engine',
|
||||
'Deploy to OpenShift': 'Deploy to OpenShift',
|
||||
'Description': 'Описание',
|
||||
'design': 'дизайн',
|
||||
'DESIGN': 'ДИЗАЙН',
|
||||
'Design for': 'Дизайн для',
|
||||
'Detailed traceback description': 'Detailed traceback description',
|
||||
'direction: ltr': 'направление: ltr',
|
||||
'Disable': 'Disable',
|
||||
'docs': 'docs',
|
||||
'documentation': 'документация',
|
||||
'done!': 'выполнено!',
|
||||
'download layouts': 'загрузить шаблоны',
|
||||
'download plugins': 'загрузить плагины',
|
||||
'E-mail': 'E-mail',
|
||||
'EDIT': 'ПРАВКА',
|
||||
'Edit': 'Правка',
|
||||
'Edit application': 'Правка приложения',
|
||||
'edit controller': 'правка контроллера',
|
||||
'Edit current record': 'Правка текущей записи',
|
||||
'Edit Profile': 'Правка профиля',
|
||||
'edit profile': 'правка профиля',
|
||||
'Edit This App': 'Правка данного приложения',
|
||||
'edit views:': 'правка видов:',
|
||||
'Editing file': 'Правка файла',
|
||||
'Editing file "%s"': 'Правка файла "%s"',
|
||||
'Editing Language file': 'Правка языкового файла',
|
||||
'Editing Plural Forms File': 'Editing Plural Forms File',
|
||||
'Enterprise Web Framework': 'Enterprise Web Framework',
|
||||
'Error logs for "%(app)s"': 'Журнал ошибок для "%(app)"',
|
||||
'Error snapshot': 'Error snapshot',
|
||||
'Error ticket': 'Error ticket',
|
||||
'Errors': 'Ошибка',
|
||||
'escape': 'escape',
|
||||
'Exception instance attributes': 'Атрибуты объекта исключения',
|
||||
'Expand Abbreviation': 'Раскрыть аббревиатуру',
|
||||
'export as csv file': 'Экспорт в CSV',
|
||||
'exposes': 'открывает',
|
||||
'extends': 'расширяет',
|
||||
@@ -249,95 +155,219 @@
|
||||
'file does not exist': 'файл не существует',
|
||||
'file saved on %(time)s': 'файл сохранен %(time)s',
|
||||
'file saved on %s': 'файл сохранен %s',
|
||||
'files': 'файлы',
|
||||
'filter': 'фильтр',
|
||||
'First name': 'Имя',
|
||||
'Frames': 'Frames',
|
||||
'Functions with no doctests will result in [passed] tests.': 'Функции без doctest будут давать [прошел] в тестах.',
|
||||
'Get from URL:': 'Get from URL:',
|
||||
'Go to Matching Pair': 'К подходящей паре',
|
||||
'Group ID': 'ID группы',
|
||||
'Hello World': 'Привет, Мир',
|
||||
'Help': 'Помощь',
|
||||
'Hide/Show Translated strings': 'Hide/Show Translated strings',
|
||||
'htmledit': 'htmledit',
|
||||
'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.': 'Если отчет выше содержит номер ошибки, это указывает на ошибку при работе контроллера, до попытки выполнить doctest. Причиной чаще является неверные отступы или ошибки в коде вне функции. \nЗеленый заголовок указывает на успешное выполнение всех тестов. В этом случае результаты тестов не показываются.',
|
||||
'If you answer "yes", be patient, it may take a while to download': 'Если вы ответили "Да", потерпите, загрузка может потребовать времени',
|
||||
'If you answer yes, be patient, it may take a while to download': 'Если вы ответили "Да", потерпите, загрузка может потребовать времени',
|
||||
'Import/Export': 'Импорт/Экспорт',
|
||||
'includes': 'включает',
|
||||
'Index': 'Индекс',
|
||||
'index': 'index',
|
||||
'insert new': 'вставить новый',
|
||||
'insert new %s': 'вставить новый %s',
|
||||
'inspect attributes': 'inspect attributes',
|
||||
'Install': 'Установить',
|
||||
'Installed applications': 'Установленные приложения',
|
||||
'internal error': 'внутренняя ошибка',
|
||||
'Internal State': 'Внутренний статус',
|
||||
'Invalid action': 'Неверное действие',
|
||||
'Invalid email': 'Неверный email',
|
||||
'invalid password': 'неверный пароль',
|
||||
'Invalid Query': 'Неверный запрос',
|
||||
'invalid request': 'неверный запрос',
|
||||
'invalid ticket': 'неверный тикет',
|
||||
'Key bindings': 'Связываник клавиш',
|
||||
'Key bindings for ZenConding Plugin': 'Связывание клавиш для плагина ZenConding',
|
||||
'language file "%(filename)s" created/updated': 'Языковой файл "%(filename)s" создан/обновлен',
|
||||
'Language files (static strings) updated': 'Языковые файлы (статичные строки) обновлены',
|
||||
'languages': 'языки',
|
||||
'Languages': 'Языки',
|
||||
'languages updated': 'языки обновлены',
|
||||
'Last name': 'Фамилия',
|
||||
'Last saved on:': 'Последнее сохранение:',
|
||||
'Layout': 'Верстка',
|
||||
'License for': 'Лицензия для',
|
||||
'loading...': 'загрузка...',
|
||||
'locals': 'locals',
|
||||
'located in the file': 'расположенный в файле',
|
||||
'Login': 'Логин',
|
||||
'login': 'логин',
|
||||
'Login to the Administrative Interface': 'Вход в интерфейс администратора',
|
||||
'Logout': 'выход',
|
||||
'Lost Password': 'Забыли пароль',
|
||||
'lost password?': 'Пароль утерен?',
|
||||
'Main Menu': 'Главное меню',
|
||||
'Match Pair': 'Найти пару',
|
||||
'Menu Model': 'Модель меню',
|
||||
'merge': 'объединить',
|
||||
'Merge Lines': 'Объединить линии',
|
||||
'Models': 'Модели',
|
||||
'models': 'модели',
|
||||
'Modules': 'Модули',
|
||||
'modules': 'модули',
|
||||
'Name': 'Название',
|
||||
'new application "%s" created': 'новое приложение "%s" создано',
|
||||
'New application wizard': 'Мастер нового приложения',
|
||||
'New Record': 'Новая запись',
|
||||
'new record inserted': 'новая запись вставлена',
|
||||
'New simple application': 'Новое простое приложение',
|
||||
'next 100 rows': 'следующие 100 строк',
|
||||
'Next Edit Point': 'Следующее место правки',
|
||||
'NO': 'НЕТ',
|
||||
'No databases in this application': 'В приложении нет базы данных',
|
||||
'or import from csv file': 'или испорт из cvs файла',
|
||||
'or provide app url:': 'или URL приложения:',
|
||||
'or provide application url:': 'или URL приложения:',
|
||||
'Origin': 'Оригинал',
|
||||
'Original/Translation': 'Оригинал/Перевод',
|
||||
'Overwrite installed app': 'Переписать на установленное приложение',
|
||||
'Pack all': 'упаковать все',
|
||||
'Pack compiled': 'Архив скомпилирован',
|
||||
'pack plugin': 'Упаковать плагин',
|
||||
'Password': 'Пароль',
|
||||
'Peeking at file': 'Просмотр',
|
||||
'please wait!': 'подождите, пожалуйста!',
|
||||
'Plugin "%s" in application': 'Плагин "%s" в приложении',
|
||||
'plugins': 'плагины',
|
||||
'Plugins': 'Плагины',
|
||||
'Plural Form #%s': 'Plural Form #%s',
|
||||
'Plural-Forms:': 'Plural-Forms:',
|
||||
'Powered by': 'Обеспечен',
|
||||
'previous 100 rows': 'предыдущие 100 строк',
|
||||
'Previous Edit Point': 'Предыдущее место правки',
|
||||
'Query:': 'Запрос:',
|
||||
'record': 'запись',
|
||||
'record does not exist': 'запись не существует',
|
||||
'record id': 'id записи',
|
||||
'Record ID': 'ID записи',
|
||||
'register': 'зарегистрироваться',
|
||||
'Register': 'Зарегистрироваться',
|
||||
'Registration key': 'Ключ регистрации',
|
||||
'Reload routes': 'Reload routes',
|
||||
'Remove compiled': 'Удалить скомпилированное',
|
||||
'request': 'request',
|
||||
'Reset Password key': 'Сброс пароля',
|
||||
'Resolve Conflict file': 'Решить конфликт в файле',
|
||||
'response': 'response',
|
||||
'restore': 'восстановить',
|
||||
'revert': 'откатиться',
|
||||
'Role': 'Роль',
|
||||
'Rows in table': 'Строк в таблице',
|
||||
'Rows selected': 'Выбрано строк',
|
||||
'rules:': 'rules:',
|
||||
"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': 'сохранить',
|
||||
'Save via Ajax': 'Сохранить через Ajax',
|
||||
'Saved file hash:': 'Хэш сохраненного файла:',
|
||||
'selected': 'выбрано',
|
||||
'session': 'session',
|
||||
'session expired': 'сессия истекла',
|
||||
'shell': 'shell',
|
||||
'Singular Form': 'Singular Form',
|
||||
'Site': 'сайт',
|
||||
'some files could not be removed': 'некоторые файлы нельзя удалить',
|
||||
'Start wizard': 'запустить мастер',
|
||||
'state': 'статус',
|
||||
'static': 'статичные файлы',
|
||||
'Static files': 'Статические файлы',
|
||||
'Stylesheet': 'Таблицы стилей',
|
||||
'submit': 'Отправить',
|
||||
'Sure you want to delete this object?': 'Действительно хотите удалить данный объект?',
|
||||
'table': 'таблица',
|
||||
'Table name': 'Название таблицы',
|
||||
'test': 'тест',
|
||||
'test_def': 'test_def',
|
||||
'test_for': 'test_for',
|
||||
'test_if': 'test_if',
|
||||
'test_try': 'test_try',
|
||||
'Testing application': 'Тест приложения',
|
||||
'Testing controller': 'Тест контроллера',
|
||||
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': '"query" является условием вида "db.table1.field1 == \'значение\'". Что-либо типа "db.table1.field1 db.table2.field2 ==" ведет к SQL JOIN.',
|
||||
'the application logic, each URL path is mapped in one exposed function in the controller': 'Логика приложения, каждый URL отображается в открытую функцию в контроллере',
|
||||
'The application logic, each URL path is mapped in one exposed function in the controller': 'Логика приложения, каждый URL отображается к одной функции в контроллере',
|
||||
'the data representation, define database tables and sets': 'представление данных, определить таблицы и наборы',
|
||||
'The data representation, define database tables and sets': 'Представление данных, определите таблицы базы данных и наборы',
|
||||
'The output of the file is a dictionary that was rendered by the view': 'Выводом файла является словарь, который создан в виде',
|
||||
'The presentations layer, views are also known as templates': 'Слой презентации, виды так же известны, как шаблоны',
|
||||
'the presentations layer, views are also known as templates': 'слой представления, виды известные так же как шаблоны',
|
||||
'There are no controllers': 'Отсутствуют контроллеры',
|
||||
'There are no models': 'Отсутствуют модели',
|
||||
'There are no modules': 'Отсутствуют модули',
|
||||
'There are no plugins': 'Отсутствуют плагины',
|
||||
'There are no static files': 'Отсутствуют статичные файлы',
|
||||
'There are no translators, only default language is supported': 'Отсутствуют переводчики, поддерживается только стандартный язык',
|
||||
'There are no views': 'Отсутствуют виды',
|
||||
'These files are served without processing, your images go here': 'Эти файлы обслуживаются без обработки, ваши изображения попадут сюда',
|
||||
'these files are served without processing, your images go here': 'Эти файлы обслуживаются без обработки, ваши изображения попадут сюда',
|
||||
'This is a copy of the scaffolding application': 'Это копия сгенерированного приложения',
|
||||
'This is the %(filename)s template': 'Это шаблон %(filename)s',
|
||||
'Ticket': 'Тикет',
|
||||
'Ticket ID': 'Ticket ID',
|
||||
'Timestamp': 'Время',
|
||||
'TM': 'TM',
|
||||
'to previous version.': 'на предыдущую версию.',
|
||||
'To create a plugin, name a file/folder plugin_[name]': 'Для создания плагина назовите файл/папку plugin_[название]',
|
||||
'toggle breakpoint': 'toggle breakpoint',
|
||||
'Traceback': 'Traceback',
|
||||
'translation strings for the application': 'строки перевода для приложения',
|
||||
'Translation strings for the application': 'Строки перевода для приложения',
|
||||
'try': 'try',
|
||||
'try something like': 'попробовать что-либо вида',
|
||||
'Unable to check for upgrades': 'Невозможно проверить обновления',
|
||||
'unable to create application "%s"': 'невозможно создать приложение "%s" nicht möglich',
|
||||
'unable to delete file "%(filename)s"': 'невозможно удалить файл "%(filename)s"',
|
||||
'Unable to download': 'Невозможно загрузить',
|
||||
'Unable to download app': 'Невозможно загрузить',
|
||||
'unable to parse csv file': 'невозможно разобрать файл csv',
|
||||
'unable to uninstall "%s"': 'невозможно удалить "%s"',
|
||||
'uncheck all': 'снять выбор всего',
|
||||
'Uninstall': 'Удалить',
|
||||
'update': 'обновить',
|
||||
'update all languages': 'обновить все языки',
|
||||
'Update:': 'Обновить:',
|
||||
'upgrade web2py now': 'обновить web2py сейчас',
|
||||
'upload': 'загрузить',
|
||||
'Upload & install packed application': 'Загрузить и установить приложение в архиве',
|
||||
'Upload a package:': 'Загрузить пакет:',
|
||||
'Upload and install packed application': 'Upload and install packed application',
|
||||
'upload application:': 'загрузить файл:',
|
||||
'Upload existing application': 'Загрузить существующее приложение',
|
||||
'upload file:': 'загрузить файл:',
|
||||
'upload plugin file:': 'загрузить файл плагина:',
|
||||
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Используйте (...)&(...) для AND, (...)|(...) для OR, и ~(...) для NOT при создании сложных запросов.',
|
||||
'Use an url:': 'Используйте url:',
|
||||
'user': 'пользователь',
|
||||
'User ID': 'ID пользователя',
|
||||
'variables': 'переменные',
|
||||
'Version': 'Версия',
|
||||
'versioning': 'версии',
|
||||
'Versioning': 'Versioning',
|
||||
'View': 'Вид',
|
||||
'view': 'вид',
|
||||
'Views': 'Виды',
|
||||
'views': 'виды',
|
||||
'web2py Recent Tweets': 'последние твиты по web2py',
|
||||
'Web Framework': 'Web Framework',
|
||||
'web2py is up to date': 'web2py обновлен',
|
||||
'web2py Recent Tweets': 'последние твиты по web2py',
|
||||
'Welcome %s': 'Добро пожаловать, %s',
|
||||
'Welcome to web2py': 'Добро пожаловать в web2py',
|
||||
'Which called the function': 'Который вызвал функцию',
|
||||
'Wrap with Abbreviation': 'Заключить в аббревиатуру',
|
||||
'xml': 'xml',
|
||||
'YES': 'ДА',
|
||||
'You are successfully running web2py': 'Вы успешно запустили web2by',
|
||||
'You can modify this application and adapt it to your needs': 'Вы можете изменить это приложение и подогнать под свои нужды',
|
||||
'You visited the url': 'Вы посетили URL',
|
||||
}
|
||||
|
||||
|
||||
|
||||
+369
-368
@@ -1,368 +1,369 @@
|
||||
# coding: utf8
|
||||
{
|
||||
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"Popravi" je izbirni izraz kot npr.: "stolpec1 = \'novavrednost\'". Rezultatov JOIN operacije ne morete popravljati ali brisati',
|
||||
'%Y-%m-%d': '%Y-%m-%d',
|
||||
'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
|
||||
'%s rows deleted': '%s vrstic izbrisanih',
|
||||
'%s rows updated': '%s vrstic popravljeno',
|
||||
'(requires internet access)': '(zahteva internetni dostop)',
|
||||
'(something like "it-it")': '(nekaj kot "sl-SI" ali samo "sl")',
|
||||
'A new version of web2py is available': 'Nova različica web2py je na voljo',
|
||||
'A new version of web2py is available: %s': 'Nova različica web2py je na voljo: %s',
|
||||
'A new version of web2py is available: Version 1.85.3 (2010-09-18 07:07:46)\n': 'Nova različica web2py je na voljo: Različica 1.85.3 (2010-09-18 07:07:46)\n',
|
||||
'ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.': 'POZOR: Prijava zahteva varno povezavo (HTTPS) ali lokalni (localhost) dostop.',
|
||||
'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.': 'POZOR: Testiranje ni večopravilno, zato ne poganjajte več testov hkrati.',
|
||||
'ATTENTION: This is an experimental feature and it needs more testing.': 'POZOR: To je preizkusni fazi in potrebuje več testiranja.',
|
||||
'ATTENTION: you cannot edit the running application!': 'POZOR: Ne morete urejati aplikacije, ki že teče!',
|
||||
'Abort': 'Preklic',
|
||||
'About': 'Vizitka',
|
||||
'About application': 'O aplikaciji',
|
||||
'Additional code for your application': 'Dodatna koda za vašo aplikacijo',
|
||||
'Admin is disabled because insecure channel': 'Skrbnik je izključen zaradi nezavarovane povezave',
|
||||
'Admin is disabled because unsecure channel': 'Skrbnik je izključen zaradi nezavarovane povezave',
|
||||
'Admin language': 'Skrbniški jezik',
|
||||
'Administrator Password:': 'Skrbniško geslo:',
|
||||
'Application name:': 'Ime aplikacije:',
|
||||
'Are you sure you want to delete file "%s"?': 'Ali res želite pobrisati datoteko "%s"?',
|
||||
'Are you sure you want to delete this object?': 'Ali res želite izbrisati ta predmet?',
|
||||
'Are you sure you want to uninstall application "%s"': 'Ali res želite odstraniti program "%s"',
|
||||
'Are you sure you want to uninstall application "%s"?': 'Ali res želite odstraniti program "%s"?',
|
||||
'Are you sure you want to upgrade web2py now?': 'Ali želite sedaj nadgraditi web2py?',
|
||||
'Authentication': 'Avtentikacija',
|
||||
'Available databases and tables': 'Podatkovne baze in tabele',
|
||||
'Begin': 'Začni',
|
||||
'Cannot be empty': 'Ne sme biti prazno',
|
||||
'Cannot compile: there are errors in your app. Debug it, correct errors and try again.': 'Nemogoče prevajanje: napake v programu. Odpravite napake in poskusite ponovno.',
|
||||
'Change Password': 'Spremeni geslo',
|
||||
'Change admin password': 'Spremenite skrbniško geslo',
|
||||
'Check for upgrades': 'Preveri za posodobitve',
|
||||
'Check to delete': 'Odkljukajte, če želite izbrisati',
|
||||
'Checking for upgrades...': 'Preverjam posodobitve...',
|
||||
'Clean': 'Počisti',
|
||||
'Click row to expand traceback': 'Kliknite vrstico da razširite sledenje',
|
||||
'Click row to view a ticket': 'Kliknite vrstico za ogled listka',
|
||||
'Client IP': 'IP klienta',
|
||||
'Compile': 'Prevedi',
|
||||
'Controller': 'Krmilnik',
|
||||
'Controllers': 'Krmilniki',
|
||||
'Copyright': 'Copyright',
|
||||
'Count': 'Število',
|
||||
'Create': 'Ustvari',
|
||||
'Create new simple application': 'Ustvari novo enostavno aplikacijo',
|
||||
'Current request': 'Trenutna zahteva',
|
||||
'Current response': 'Trenutni odgovor',
|
||||
'Current session': 'Trenutna seja',
|
||||
'DB Model': 'Podatkovni model',
|
||||
'DESIGN': 'Izgled',
|
||||
'Database': 'Podatkovna baza',
|
||||
'Date and Time': 'Datum in čas',
|
||||
'Delete': 'Izbriši',
|
||||
'Delete this file (you will be asked to confirm deletion)': 'Izbriši to datoteko (izbris boste morali potrditi)',
|
||||
'Delete:': 'Izbriši:',
|
||||
'Deploy': 'Namesti',
|
||||
'Deploy on Google App Engine': 'Prenesi na Google App sistem',
|
||||
'Description': 'Opis',
|
||||
'Design for': 'Oblikuj za',
|
||||
'Detailed traceback description': 'Natačen opis sledenja',
|
||||
'Disable': 'Izključi',
|
||||
'E-mail': 'E-mail',
|
||||
'EDIT': 'UREDI',
|
||||
'Edit': 'Uredi',
|
||||
'Edit Profile': 'Uredi profil',
|
||||
'Edit This App': 'Uredi ta program',
|
||||
'Edit application': 'Uredi program',
|
||||
'Edit current record': 'Uredi trenutni zapis',
|
||||
'Editing Language file': 'Uredi jezikovno datoteko',
|
||||
'Editing file': 'Urejanje datoteke',
|
||||
'Editing file "%s"': 'Urejanje datoteke "%s"',
|
||||
'Enterprise Web Framework': 'Enterprise Web Framework',
|
||||
'Error': 'Napaka',
|
||||
'Error logs for "%(app)s"': 'Dnevnik napak za "%(app)s"',
|
||||
'Error snapshot': 'Posnetek napake',
|
||||
'Error ticket': 'Listek napake',
|
||||
'Errors': 'Napake',
|
||||
'Exception instance attributes': 'Lastnosti instance izjeme',
|
||||
'Expand Abbreviation': 'Razširi okrajšave',
|
||||
'File': 'Datoteka',
|
||||
'First name': 'Ime',
|
||||
'Frames': 'Okvirji',
|
||||
'Functions with no doctests will result in [passed] tests.': 'Funkcije brez doctest bodo opravile teste brez preverjanja.',
|
||||
'Get from URL:': 'Naloži iz URL:',
|
||||
'Go to Matching Pair': 'Pojdi k ujemalnemu paru',
|
||||
'Group ID': 'ID skupine',
|
||||
'Hello World': 'Pozdravljen, Svet!',
|
||||
'Help': 'Pomoč',
|
||||
'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.': 'Če poročilo zgoraj vsebuje številko listka to pomeni napako pri izvajanju krmilnika, še preden so se izvedli doctesti. To ponavadi pomeni napako pri zamiku programske vrstice ali izven funkcije.\nZelen naslov označuje, da so vsi testi opravljeni. V tem primeru testi niso prikazani.',
|
||||
'If you answer "yes", be patient, it may take a while to download': 'Če odgovorite z "DA", potrpite. Prenos traja nekaj časa',
|
||||
'If you answer yes, be patient, it may take a while to download': 'Če odgovorite z "DA", potrpite. Prenos traja nekaj časa',
|
||||
'Import/Export': 'Uvoz/Izvoz',
|
||||
'Index': 'Indeks',
|
||||
'Install': 'Namesti',
|
||||
'Installed applications': 'Nameščene aplikacije',
|
||||
'Internal State': 'Notranje stanje',
|
||||
'Invalid Query': 'Napačno povpraševanje',
|
||||
'Invalid action': 'Napačno dejanje',
|
||||
'Invalid email': 'Napačen e-naslov',
|
||||
'Key bindings': 'Povezave tipk',
|
||||
'Key bindings for ZenConding Plugin': 'Povezave tipk za ZenConding vtičnik',
|
||||
'Language files (static strings) updated': 'Jezikovna datoteka (statično besedilo) posodobljeno',
|
||||
'Languages': 'Jeziki',
|
||||
'Last name': 'Priimek',
|
||||
'Last saved on:': 'Zadnjič shranjeno:',
|
||||
'Layout': 'Postavitev',
|
||||
'License for': 'Licenca za',
|
||||
'Login': 'Prijava',
|
||||
'Login to the Administrative Interface': 'Prijava v skrbniški vmesnik',
|
||||
'Logout': 'Odjava',
|
||||
'Lost Password': 'Izgubljeno geslo',
|
||||
'Main Menu': 'Glavni meni',
|
||||
'Match Pair': 'Ujemalni par',
|
||||
'Menu Model': 'Model menija',
|
||||
'Merge Lines': 'Združi vrstice',
|
||||
'Models': 'Modeli',
|
||||
'Modules': 'Moduli',
|
||||
'NO': 'NE',
|
||||
'Name': 'Ime',
|
||||
'New Application Wizard': 'Čarovnik za novo aplikacijo',
|
||||
'New Record': 'Nov zapis',
|
||||
'New application wizard': 'Čarovnik za novo aplikacijo',
|
||||
'New simple application': 'Nova enostavna aplikacija',
|
||||
'Next Edit Point': 'Naslednja točka urejanja',
|
||||
'No databases in this application': 'V tem programu ni podatkovnih baz',
|
||||
'Origin': 'Izvor',
|
||||
'Original/Translation': 'Izvor/Prevod',
|
||||
'Overwrite installed app': 'Prepiši obstoječi program',
|
||||
'Pack all': 'Zapakiraj vse',
|
||||
'Pack compiled': 'Paket preveden',
|
||||
'Password': 'Geslo',
|
||||
'Peeking at file': 'Vpogled v datoteko',
|
||||
'Plugin "%s" in application': 'Vtičnik "%s" v aplikaciji',
|
||||
'Plugins': 'Vtičniki',
|
||||
'Powered by': 'Narejeno z',
|
||||
'Previous Edit Point': 'Prejšnja točka urejanja',
|
||||
'Query:': 'Vprašanje:',
|
||||
'Record ID': 'ID zapisa',
|
||||
'Register': 'Registracija',
|
||||
'Registration key': 'Registracijski ključ',
|
||||
'Reload routes': 'Ponovno naloži preusmeritve',
|
||||
'Remove compiled': 'Odstrani prevedeno',
|
||||
'Reset Password key': 'Ponastavi ključ gesla',
|
||||
'Resolve Conflict file': 'Datoteka za razrešitev problemov',
|
||||
'Role': 'Vloga',
|
||||
'Rows in table': 'Vrstic v tabeli',
|
||||
'Rows selected': 'Izbranih vrstic',
|
||||
"Run tests in this file (to run all files, you may also use the button labelled 'test')": "Poženi teste v tej datoteki (za vse teste uporabite gumb 'test')",
|
||||
'Save via Ajax': 'Shrani preko AJAX',
|
||||
'Saved file hash:': 'Koda shranjene datoteke:',
|
||||
'Searching:': 'Iskanje:',
|
||||
'Site': 'Spletišče',
|
||||
'Sorry, could not find mercurial installed': 'Oprostite. Mercurial ni nameščen.',
|
||||
'Start a new app': 'Začnite z novo aplikacijo',
|
||||
'Start wizard': 'Zaženi čarovnika',
|
||||
'Static files': 'Statične datoteke',
|
||||
'Stylesheet': 'CSS datoteka',
|
||||
'Sure you want to delete this object?': 'Ali res želite izbrisati ta predmet?',
|
||||
'TM': 'TM',
|
||||
'Table name': 'Ime tabele',
|
||||
'Testing application': 'Testiranje programa',
|
||||
'Testing controller': 'Testiranje krmilnika',
|
||||
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': '"vprašanje" je pogoj kot npr. "db.table1.field1 == \'vrednost\'". Nekaj kot "db.table1.field1 == db.table2.field2" izvede SQL operacijo JOIN.',
|
||||
'The application logic, each URL path is mapped in one exposed function in the controller': 'Logika delovanja aplikacije. Vsak URL je povezan z eno objavljeno funkcijo v krmilniku',
|
||||
'The data representation, define database tables and sets': 'Predstavitev podatkov. Definirajte podatkovne tabele in množice',
|
||||
'The output of the file is a dictionary that was rendered by the view': 'Rezultat datoteke je slovar, ki ga predela pogled',
|
||||
'The presentations layer, views are also known as templates': 'Predstavitveni nivo. Pogledi so znani tudi kot predloge',
|
||||
'There are no controllers': 'Ni krmilnikov',
|
||||
'There are no models': 'Ni modelov',
|
||||
'There are no modules': 'Ni modulov',
|
||||
'There are no plugins': 'Ni vtičnikov',
|
||||
'There are no static files': 'Ni statičnih datotek',
|
||||
'There are no translators, only default language is supported': 'Ni prevodov. Podprt je samo privzeti jezik',
|
||||
'There are no views': 'Ni pogledov',
|
||||
'These files are served without processing, your images go here': 'Te datoteke so poslane brez obdelave. Vaše slike shranite tu.',
|
||||
'This is a copy of the scaffolding application': 'To je kopija okvirne aplikacije',
|
||||
'This is the %(filename)s template': 'To je predloga %(filename)s',
|
||||
'Ticket': 'Listek',
|
||||
'Ticket ID': 'ID listka',
|
||||
'Timestamp': 'Časovni žig',
|
||||
'To create a plugin, name a file/folder plugin_[name]': 'Če želite ustvariti vtičnik, poimenujte datoteko/mapo plugin_[ime]',
|
||||
'Traceback': 'Sledljivost',
|
||||
'Translation strings for the application': 'Prevajalna besedila za aplikacijo',
|
||||
'Unable to check for upgrades': 'Ne morem preveriti posodobitev',
|
||||
'Unable to download': 'Ne morem prenesti datoteke',
|
||||
'Unable to download app': 'Ne morem prenesti programa',
|
||||
'Uninstall': 'Odstrani',
|
||||
'Update:': 'Posodobitev:',
|
||||
'Upload & install packed application': 'Naloži in namesti pakirano aplikacijo',
|
||||
'Upload a package:': 'Naloži paket:',
|
||||
'Upload and install packed application': 'Naloži in namesti pakirano aplikacijo',
|
||||
'Upload existing application': 'Naloži obstoječo aplikacijo',
|
||||
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Uporabie (...)&(...) za AND, (...)|(...) za OR, in ~(...) za NOT pri gradnji kompleksnih povpraševanj.',
|
||||
'Use an url:': 'Uporabite URL:',
|
||||
'User ID': 'ID uporabnika',
|
||||
'Version': 'Različica',
|
||||
'Versioning': 'Versioning',
|
||||
'View': 'Pogled',
|
||||
'Views': 'Pogledi',
|
||||
'Web Framework': 'Web Framework',
|
||||
'Welcome %s': 'Dobrodošli, %s',
|
||||
'Welcome to web2py': 'Dobrodošli v web2py',
|
||||
'Which called the function': 'Ki je klical funkcijo',
|
||||
'Wrap with Abbreviation': 'Ovij z okrajšavo',
|
||||
'YES': 'DA',
|
||||
'You are successfully running web2py': 'Uspešno ste pognali web2py',
|
||||
'You can modify this application and adapt it to your needs': 'Lahko spremenite to aplikacijo in jo prilagodite vašim potrebam',
|
||||
'You visited the url': 'Obiskali ste URL',
|
||||
'additional code for your application': 'dodatna koda za vašo aplikacijo',
|
||||
'admin disabled because no admin password': 'skrbnik izključen, ker ni skrbniškega gesla',
|
||||
'admin disabled because not supported on google apps engine': 'skrbnik izključen, ker ni podprt na Google App sistemu',
|
||||
'admin disabled because unable to access password file': 'skrbnik izključen, ker ne morem dostopati do datoteke z gesli',
|
||||
'administrative interface': 'skrbniški vmesnik',
|
||||
'and rename it (required):': 'in jo preimenujte (obvezno):',
|
||||
'and rename it:': ' in jo preimenujte:',
|
||||
'appadmin': 'appadmin',
|
||||
'appadmin is disabled because insecure channel': 'Appadmin izključen, ker zahteva varno (HTTPS) povezavo',
|
||||
'application "%s" uninstalled': 'Aplikacija "%s" odstranjena',
|
||||
'application compiled': 'aplikacija prevedena',
|
||||
'application is compiled and cannot be designed': 'aplikacija je prevedena in je ne morete popravljati',
|
||||
'arguments': 'argumenti',
|
||||
'back': 'nazaj',
|
||||
'beautify': 'olepšaj',
|
||||
'cache': 'predpomnilnik',
|
||||
'cache, errors and sessions cleaned': 'Predpomnilnik, napake in seja so očiščeni',
|
||||
'call': 'kliči',
|
||||
'cannot create file': 'ne morem ustvariti datoteke',
|
||||
'cannot upload file "%(filename)s"': 'ne morem naložiti datoteke "%(filename)s"',
|
||||
'change password': 'spremeni geslo',
|
||||
'check all': 'označi vse',
|
||||
'click here for online examples': 'kliknite za spletne primere',
|
||||
'click here for the administrative interface': 'kliknite za skrbniški vmesnik',
|
||||
'click to check for upgrades': 'kliknite za preverjanje nadgradenj',
|
||||
'code': 'koda',
|
||||
'collapse/expand all': 'zapri/odpri vse',
|
||||
'compiled application removed': 'prevedena aplikacija je odstranjena',
|
||||
'controllers': 'krmilniki',
|
||||
'create file with filename:': 'Ustvari datoteko z imenom:',
|
||||
'create new application:': 'Ustvari novo aplikacijo:',
|
||||
'created by': 'ustvaril',
|
||||
'crontab': 'crontab',
|
||||
'currently running': 'trenutno teče',
|
||||
'currently saved or': 'trenutno shranjeno ali',
|
||||
'customize me!': 'Spremeni me!',
|
||||
'data uploaded': 'podatki naloženi',
|
||||
'database': 'podatkovna baza',
|
||||
'database %s select': 'izberi podatkovno bazo %s ',
|
||||
'database administration': 'upravljanje s podatkovno bazo',
|
||||
'db': 'db',
|
||||
'defines tables': 'definiraj tabele',
|
||||
'delete': 'izbriši',
|
||||
'delete all checked': 'izbriši vse označene',
|
||||
'delete plugin': 'izbriši vtičnik',
|
||||
'design': 'oblikuj',
|
||||
'details': 'podrobnosti',
|
||||
'direction: ltr': 'smer: ltr',
|
||||
'documentation': 'dokumentacija',
|
||||
'done!': 'Narejeno!',
|
||||
'download layouts': 'prenesi postavitev',
|
||||
'download plugins': 'prenesi vtičnik',
|
||||
'edit controller': 'uredi krmilnik',
|
||||
'edit profile': 'uredi profil',
|
||||
'edit views:': 'urejaj poglede:',
|
||||
'escape': 'escape',
|
||||
'export as csv file': 'izvozi kot CSV',
|
||||
'exposes': 'objavlja',
|
||||
'extends': 'razširja',
|
||||
'failed to reload module': 'nisem uspel ponovno naložiti modula',
|
||||
'file "%(filename)s" created': 'datoteka "%(filename)s" ustvarjena',
|
||||
'file "%(filename)s" deleted': 'datoteka "%(filename)s" izbrisana',
|
||||
'file "%(filename)s" uploaded': 'datoteka "%(filename)s" prenešena',
|
||||
'file "%(filename)s" was not deleted': 'datoteka "%(filename)s" ni bila izbrisana',
|
||||
'file "%s" of %s restored': 'datoteka "%s" od %s obnovljena',
|
||||
'file changed on disk': 'datoteka je bila spremenjena',
|
||||
'file does not exist': 'datoteka ne obstaja',
|
||||
'file saved on %(time)s': 'datoteka shranjena %(time)s',
|
||||
'file saved on %s': 'datoteka shranjena %s',
|
||||
'files': 'datoteke',
|
||||
'filter': 'fiter',
|
||||
'htmledit': 'htmledit',
|
||||
'includes': 'vključuje',
|
||||
'index': 'indeks',
|
||||
'insert new': 'vstavi nov',
|
||||
'insert new %s': 'vstavi nov %s',
|
||||
'inspect attributes': 'pregled lastnosti',
|
||||
'internal error': 'notranja napaka',
|
||||
'invalid password': 'napačno geslo',
|
||||
'invalid request': 'napačna zahteva',
|
||||
'invalid ticket': 'napačen kartonček',
|
||||
'language file "%(filename)s" created/updated': 'jezikovna datoteka "%(filename)s" ustvarjena/posodobljena',
|
||||
'languages': 'jeziki',
|
||||
'languages updated': 'jeziki posodobljeni',
|
||||
'loading...': 'nalaganje...',
|
||||
'locals': 'locals',
|
||||
'located in the file': 'se nahaja v datoteki',
|
||||
'login': 'prijava',
|
||||
'lost password?': 'Izgubljeno geslo?',
|
||||
'merge': 'združi',
|
||||
'models': 'modeli',
|
||||
'modules': 'moduli',
|
||||
'new application "%s" created': 'ustvarjen nov program "%s"',
|
||||
'new record inserted': 'vstavljen nov zapis',
|
||||
'next 100 rows': 'naslednjih 100 zapisov',
|
||||
'or import from csv file': 'ali uvozi iz CSV datoteke',
|
||||
'or provide app url:': 'ali vpišite URL programa:',
|
||||
'or provide application url:': 'ali vpišite URL programa:',
|
||||
'pack plugin': 'zapakiraj vtičnik',
|
||||
'please wait!': 'Prosim počakajte!',
|
||||
'plugins': 'vtičniki',
|
||||
'previous 100 rows': 'prejšnjih 100 zapisov',
|
||||
'record': 'zapis',
|
||||
'record does not exist': 'zapis ne obstaja',
|
||||
'record id': 'id zapisa',
|
||||
'register': 'registracija',
|
||||
'request': 'zahteva',
|
||||
'response': 'odgovor',
|
||||
'restore': 'obnovi',
|
||||
'revert': 'povrni',
|
||||
'save': 'shrani',
|
||||
'selected': 'izbrano',
|
||||
'session': 'seja',
|
||||
'session expired': 'seja pretekla',
|
||||
'shell': 'lupina',
|
||||
'some files could not be removed': 'nekaterih datotek se ni dalo izbrisati',
|
||||
'state': 'stanje',
|
||||
'static': 'statično',
|
||||
'submit': 'pošlji',
|
||||
'table': 'tabela',
|
||||
'test': 'test',
|
||||
'test_def': 'test_def',
|
||||
'test_for': 'test_for',
|
||||
'test_if': 'test_if',
|
||||
'test_try': 'test_try',
|
||||
'the application logic, each URL path is mapped in one exposed function in the controller': 'krmilna logika, vsaka URL pot je preslikana v eno funkcijo v krmilniku',
|
||||
'the data representation, define database tables and sets': 'podatkovna predstavitev, definirajte tabele in množice',
|
||||
'the presentations layer, views are also known as templates': 'predstavitveni nivo, pogledi so tudi znani kot predloge',
|
||||
'these files are served without processing, your images go here': 'te datoteke so poslane brez posredovanja in obdelave, svoje slike shranite tu',
|
||||
'to previous version.': 'na prejšnjo različico.',
|
||||
'translation strings for the application': 'prevodna besedila za program',
|
||||
'try': 'poskusi',
|
||||
'try something like': 'poskusite na primer',
|
||||
'unable to create application "%s"': 'ne morem ustvariti programa "%s" ',
|
||||
'unable to delete file "%(filename)s"': 'ne morem izbrisati datoteke "%(filename)s"',
|
||||
'unable to parse csv file': 'ne morem obdelati csv datoteke',
|
||||
'unable to uninstall "%s"': 'ne morem odstraniti "%s"',
|
||||
'uncheck all': 'odznači vse',
|
||||
'update': 'posodobi',
|
||||
'update all languages': 'posodobi vse jezike',
|
||||
'upgrade web2py now': 'posodobi web2py',
|
||||
'upload': 'naloži',
|
||||
'upload application:': 'naloži program:',
|
||||
'upload file:': 'naloži datoteko:',
|
||||
'upload plugin file:': 'naloži vtičnik:',
|
||||
'user': 'uporabnik',
|
||||
'variables': 'spremenljivke',
|
||||
'versioning': 'različice',
|
||||
'view': 'pogled',
|
||||
'views': 'pogledi',
|
||||
'web2py Recent Tweets': 'zadnji tviti na web2py',
|
||||
'web2py is up to date': 'web2py je ažuren',
|
||||
'xml': 'xml',
|
||||
}
|
||||
# coding: utf8
|
||||
{
|
||||
'!langcode!': 'sl',
|
||||
'!langname!': 'Slovenski',
|
||||
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"Popravi" je izbirni izraz kot npr.: "stolpec1 = \'novavrednost\'". Rezultatov JOIN operacije ne morete popravljati ali brisati',
|
||||
'%Y-%m-%d': '%Y-%m-%d',
|
||||
'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
|
||||
'%s %%{row} deleted': '%s vrstic izbrisanih',
|
||||
'%s %%{row} updated': '%s vrstic popravljeno',
|
||||
'(requires internet access)': '(zahteva internetni dostop)',
|
||||
'(something like "it-it")': '(nekaj kot "sl-SI" ali samo "sl")',
|
||||
'@markmin\x01Searching: **%s** %%{file}': 'Iskanje: **%s** datoteke',
|
||||
'A new version of web2py is available': 'Nova različica web2py je na voljo',
|
||||
'A new version of web2py is available: %s': 'Nova različica web2py je na voljo: %s',
|
||||
'A new version of web2py is available: Version 1.85.3 (2010-09-18 07:07:46)\n': 'Nova različica web2py je na voljo: Različica 1.85.3 (2010-09-18 07:07:46)\n',
|
||||
'ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.': 'POZOR: Prijava zahteva varno povezavo (HTTPS) ali lokalni (localhost) dostop.',
|
||||
'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.': 'POZOR: Testiranje ni večopravilno, zato ne poganjajte več testov hkrati.',
|
||||
'ATTENTION: This is an experimental feature and it needs more testing.': 'POZOR: To je preizkusni fazi in potrebuje več testiranja.',
|
||||
'ATTENTION: you cannot edit the running application!': 'POZOR: Ne morete urejati aplikacije, ki že teče!',
|
||||
'Abort': 'Preklic',
|
||||
'About': 'Vizitka',
|
||||
'About application': 'O aplikaciji',
|
||||
'Additional code for your application': 'Dodatna koda za vašo aplikacijo',
|
||||
'Admin is disabled because insecure channel': 'Skrbnik je izključen zaradi nezavarovane povezave',
|
||||
'Admin is disabled because unsecure channel': 'Skrbnik je izključen zaradi nezavarovane povezave',
|
||||
'Admin language': 'Skrbniški jezik',
|
||||
'Administrator Password:': 'Skrbniško geslo:',
|
||||
'Application name:': 'Ime aplikacije:',
|
||||
'Are you sure you want to delete file "%s"?': 'Ali res želite pobrisati datoteko "%s"?',
|
||||
'Are you sure you want to delete this object?': 'Ali res želite izbrisati ta predmet?',
|
||||
'Are you sure you want to uninstall application "%s"': 'Ali res želite odstraniti program "%s"',
|
||||
'Are you sure you want to uninstall application "%s"?': 'Ali res želite odstraniti program "%s"?',
|
||||
'Are you sure you want to upgrade web2py now?': 'Ali želite sedaj nadgraditi web2py?',
|
||||
'Authentication': 'Avtentikacija',
|
||||
'Available databases and tables': 'Podatkovne baze in tabele',
|
||||
'Begin': 'Začni',
|
||||
'Cannot be empty': 'Ne sme biti prazno',
|
||||
'Cannot compile: there are errors in your app. Debug it, correct errors and try again.': 'Nemogoče prevajanje: napake v programu. Odpravite napake in poskusite ponovno.',
|
||||
'Change Password': 'Spremeni geslo',
|
||||
'Change admin password': 'Spremenite skrbniško geslo',
|
||||
'Check for upgrades': 'Preveri za posodobitve',
|
||||
'Check to delete': 'Odkljukajte, če želite izbrisati',
|
||||
'Checking for upgrades...': 'Preverjam posodobitve...',
|
||||
'Clean': 'Počisti',
|
||||
'Click row to expand traceback': 'Kliknite vrstico da razširite sledenje',
|
||||
'Click row to view a ticket': 'Kliknite vrstico za ogled listka',
|
||||
'Client IP': 'IP klienta',
|
||||
'Compile': 'Prevedi',
|
||||
'Controller': 'Krmilnik',
|
||||
'Controllers': 'Krmilniki',
|
||||
'Copyright': 'Copyright',
|
||||
'Count': 'Število',
|
||||
'Create': 'Ustvari',
|
||||
'Create new simple application': 'Ustvari novo enostavno aplikacijo',
|
||||
'Current request': 'Trenutna zahteva',
|
||||
'Current response': 'Trenutni odgovor',
|
||||
'Current session': 'Trenutna seja',
|
||||
'DB Model': 'Podatkovni model',
|
||||
'DESIGN': 'Izgled',
|
||||
'Database': 'Podatkovna baza',
|
||||
'Date and Time': 'Datum in čas',
|
||||
'Delete': 'Izbriši',
|
||||
'Delete this file (you will be asked to confirm deletion)': 'Izbriši to datoteko (izbris boste morali potrditi)',
|
||||
'Delete:': 'Izbriši:',
|
||||
'Deploy': 'Namesti',
|
||||
'Deploy on Google App Engine': 'Prenesi na Google App sistem',
|
||||
'Description': 'Opis',
|
||||
'Design for': 'Oblikuj za',
|
||||
'Detailed traceback description': 'Natačen opis sledenja',
|
||||
'Disable': 'Izključi',
|
||||
'E-mail': 'E-mail',
|
||||
'EDIT': 'UREDI',
|
||||
'Edit': 'Uredi',
|
||||
'Edit Profile': 'Uredi profil',
|
||||
'Edit This App': 'Uredi ta program',
|
||||
'Edit application': 'Uredi program',
|
||||
'Edit current record': 'Uredi trenutni zapis',
|
||||
'Editing Language file': 'Uredi jezikovno datoteko',
|
||||
'Editing file': 'Urejanje datoteke',
|
||||
'Editing file "%s"': 'Urejanje datoteke "%s"',
|
||||
'Enterprise Web Framework': 'Enterprise Web Framework',
|
||||
'Error': 'Napaka',
|
||||
'Error logs for "%(app)s"': 'Dnevnik napak za "%(app)s"',
|
||||
'Error snapshot': 'Posnetek napake',
|
||||
'Error ticket': 'Listek napake',
|
||||
'Errors': 'Napake',
|
||||
'Exception instance attributes': 'Lastnosti instance izjeme',
|
||||
'Expand Abbreviation': 'Razširi okrajšave',
|
||||
'File': 'Datoteka',
|
||||
'First name': 'Ime',
|
||||
'Frames': 'Okvirji',
|
||||
'Functions with no doctests will result in [passed] tests.': 'Funkcije brez doctest bodo opravile teste brez preverjanja.',
|
||||
'Get from URL:': 'Naloži iz URL:',
|
||||
'Go to Matching Pair': 'Pojdi k ujemalnemu paru',
|
||||
'Group ID': 'ID skupine',
|
||||
'Hello World': 'Pozdravljen, Svet!',
|
||||
'Help': 'Pomoč',
|
||||
'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.': 'Če poročilo zgoraj vsebuje številko listka to pomeni napako pri izvajanju krmilnika, še preden so se izvedli doctesti. To ponavadi pomeni napako pri zamiku programske vrstice ali izven funkcije.\nZelen naslov označuje, da so vsi testi opravljeni. V tem primeru testi niso prikazani.',
|
||||
'If you answer "yes", be patient, it may take a while to download': 'Če odgovorite z "DA", potrpite. Prenos traja nekaj časa',
|
||||
'If you answer yes, be patient, it may take a while to download': 'Če odgovorite z "DA", potrpite. Prenos traja nekaj časa',
|
||||
'Import/Export': 'Uvoz/Izvoz',
|
||||
'Index': 'Indeks',
|
||||
'Install': 'Namesti',
|
||||
'Installed applications': 'Nameščene aplikacije',
|
||||
'Internal State': 'Notranje stanje',
|
||||
'Invalid Query': 'Napačno povpraševanje',
|
||||
'Invalid action': 'Napačno dejanje',
|
||||
'Invalid email': 'Napačen e-naslov',
|
||||
'Key bindings': 'Povezave tipk',
|
||||
'Key bindings for ZenConding Plugin': 'Povezave tipk za ZenConding vtičnik',
|
||||
'Language files (static strings) updated': 'Jezikovna datoteka (statično besedilo) posodobljeno',
|
||||
'Languages': 'Jeziki',
|
||||
'Last name': 'Priimek',
|
||||
'Last saved on:': 'Zadnjič shranjeno:',
|
||||
'Layout': 'Postavitev',
|
||||
'License for': 'Licenca za',
|
||||
'Login': 'Prijava',
|
||||
'Login to the Administrative Interface': 'Prijava v skrbniški vmesnik',
|
||||
'Logout': 'Odjava',
|
||||
'Lost Password': 'Izgubljeno geslo',
|
||||
'Main Menu': 'Glavni meni',
|
||||
'Match Pair': 'Ujemalni par',
|
||||
'Menu Model': 'Model menija',
|
||||
'Merge Lines': 'Združi vrstice',
|
||||
'Models': 'Modeli',
|
||||
'Modules': 'Moduli',
|
||||
'NO': 'NE',
|
||||
'Name': 'Ime',
|
||||
'New Application Wizard': 'Čarovnik za novo aplikacijo',
|
||||
'New Record': 'Nov zapis',
|
||||
'New application wizard': 'Čarovnik za novo aplikacijo',
|
||||
'New simple application': 'Nova enostavna aplikacija',
|
||||
'Next Edit Point': 'Naslednja točka urejanja',
|
||||
'No databases in this application': 'V tem programu ni podatkovnih baz',
|
||||
'Origin': 'Izvor',
|
||||
'Original/Translation': 'Izvor/Prevod',
|
||||
'Overwrite installed app': 'Prepiši obstoječi program',
|
||||
'Pack all': 'Zapakiraj vse',
|
||||
'Pack compiled': 'Paket preveden',
|
||||
'Password': 'Geslo',
|
||||
'Peeking at file': 'Vpogled v datoteko',
|
||||
'Plugin "%s" in application': 'Vtičnik "%s" v aplikaciji',
|
||||
'Plugins': 'Vtičniki',
|
||||
'Powered by': 'Narejeno z',
|
||||
'Previous Edit Point': 'Prejšnja točka urejanja',
|
||||
'Query:': 'Vprašanje:',
|
||||
'Record ID': 'ID zapisa',
|
||||
'Register': 'Registracija',
|
||||
'Registration key': 'Registracijski ključ',
|
||||
'Reload routes': 'Ponovno naloži preusmeritve',
|
||||
'Remove compiled': 'Odstrani prevedeno',
|
||||
'Reset Password key': 'Ponastavi ključ gesla',
|
||||
'Resolve Conflict file': 'Datoteka za razrešitev problemov',
|
||||
'Role': 'Vloga',
|
||||
'Rows in table': 'Vrstic v tabeli',
|
||||
'Rows selected': 'Izbranih vrstic',
|
||||
"Run tests in this file (to run all files, you may also use the button labelled 'test')": "Poženi teste v tej datoteki (za vse teste uporabite gumb 'test')",
|
||||
'Save via Ajax': 'Shrani preko AJAX',
|
||||
'Saved file hash:': 'Koda shranjene datoteke:',
|
||||
'Site': 'Spletišče',
|
||||
'Sorry, could not find mercurial installed': 'Oprostite. Mercurial ni nameščen.',
|
||||
'Start a new app': 'Začnite z novo aplikacijo',
|
||||
'Start wizard': 'Zaženi čarovnika',
|
||||
'Static files': 'Statične datoteke',
|
||||
'Stylesheet': 'CSS datoteka',
|
||||
'Sure you want to delete this object?': 'Ali res želite izbrisati ta predmet?',
|
||||
'TM': 'TM',
|
||||
'Table name': 'Ime tabele',
|
||||
'Testing application': 'Testiranje programa',
|
||||
'Testing controller': 'Testiranje krmilnika',
|
||||
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': '"vprašanje" je pogoj kot npr. "db.table1.field1 == \'vrednost\'". Nekaj kot "db.table1.field1 == db.table2.field2" izvede SQL operacijo JOIN.',
|
||||
'The application logic, each URL path is mapped in one exposed function in the controller': 'Logika delovanja aplikacije. Vsak URL je povezan z eno objavljeno funkcijo v krmilniku',
|
||||
'The data representation, define database tables and sets': 'Predstavitev podatkov. Definirajte podatkovne tabele in množice',
|
||||
'The output of the file is a dictionary that was rendered by the view': 'Rezultat datoteke je slovar, ki ga predela pogled',
|
||||
'The presentations layer, views are also known as templates': 'Predstavitveni nivo. Pogledi so znani tudi kot predloge',
|
||||
'There are no controllers': 'Ni krmilnikov',
|
||||
'There are no models': 'Ni modelov',
|
||||
'There are no modules': 'Ni modulov',
|
||||
'There are no plugins': 'Ni vtičnikov',
|
||||
'There are no static files': 'Ni statičnih datotek',
|
||||
'There are no translators, only default language is supported': 'Ni prevodov. Podprt je samo privzeti jezik',
|
||||
'There are no views': 'Ni pogledov',
|
||||
'These files are served without processing, your images go here': 'Te datoteke so poslane brez obdelave. Vaše slike shranite tu.',
|
||||
'This is a copy of the scaffolding application': 'To je kopija okvirne aplikacije',
|
||||
'This is the %(filename)s template': 'To je predloga %(filename)s',
|
||||
'Ticket': 'Listek',
|
||||
'Ticket ID': 'ID listka',
|
||||
'Timestamp': 'Časovni žig',
|
||||
'To create a plugin, name a file/folder plugin_[name]': 'Če želite ustvariti vtičnik, poimenujte datoteko/mapo plugin_[ime]',
|
||||
'Traceback': 'Sledljivost',
|
||||
'Translation strings for the application': 'Prevajalna besedila za aplikacijo',
|
||||
'Unable to check for upgrades': 'Ne morem preveriti posodobitev',
|
||||
'Unable to download': 'Ne morem prenesti datoteke',
|
||||
'Unable to download app': 'Ne morem prenesti programa',
|
||||
'Uninstall': 'Odstrani',
|
||||
'Update:': 'Posodobitev:',
|
||||
'Upload & install packed application': 'Naloži in namesti pakirano aplikacijo',
|
||||
'Upload a package:': 'Naloži paket:',
|
||||
'Upload and install packed application': 'Naloži in namesti pakirano aplikacijo',
|
||||
'Upload existing application': 'Naloži obstoječo aplikacijo',
|
||||
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Uporabie (...)&(...) za AND, (...)|(...) za OR, in ~(...) za NOT pri gradnji kompleksnih povpraševanj.',
|
||||
'Use an url:': 'Uporabite URL:',
|
||||
'User ID': 'ID uporabnika',
|
||||
'Version': 'Različica',
|
||||
'Versioning': 'Versioning',
|
||||
'View': 'Pogled',
|
||||
'Views': 'Pogledi',
|
||||
'Web Framework': 'Web Framework',
|
||||
'Welcome %s': 'Dobrodošli, %s',
|
||||
'Welcome to web2py': 'Dobrodošli v web2py',
|
||||
'Which called the function': 'Ki je klical funkcijo',
|
||||
'Wrap with Abbreviation': 'Ovij z okrajšavo',
|
||||
'YES': 'DA',
|
||||
'You are successfully running web2py': 'Uspešno ste pognali web2py',
|
||||
'You can modify this application and adapt it to your needs': 'Lahko spremenite to aplikacijo in jo prilagodite vašim potrebam',
|
||||
'You visited the url': 'Obiskali ste URL',
|
||||
'additional code for your application': 'dodatna koda za vašo aplikacijo',
|
||||
'admin disabled because no admin password': 'skrbnik izključen, ker ni skrbniškega gesla',
|
||||
'admin disabled because not supported on google apps engine': 'skrbnik izključen, ker ni podprt na Google App sistemu',
|
||||
'admin disabled because unable to access password file': 'skrbnik izključen, ker ne morem dostopati do datoteke z gesli',
|
||||
'administrative interface': 'skrbniški vmesnik',
|
||||
'and rename it (required):': 'in jo preimenujte (obvezno):',
|
||||
'and rename it:': ' in jo preimenujte:',
|
||||
'appadmin': 'appadmin',
|
||||
'appadmin is disabled because insecure channel': 'Appadmin izključen, ker zahteva varno (HTTPS) povezavo',
|
||||
'application "%s" uninstalled': 'Aplikacija "%s" odstranjena',
|
||||
'application compiled': 'aplikacija prevedena',
|
||||
'application is compiled and cannot be designed': 'aplikacija je prevedena in je ne morete popravljati',
|
||||
'arguments': 'argumenti',
|
||||
'back': 'nazaj',
|
||||
'beautify': 'olepšaj',
|
||||
'cache': 'predpomnilnik',
|
||||
'cache, errors and sessions cleaned': 'Predpomnilnik, napake in seja so očiščeni',
|
||||
'call': 'kliči',
|
||||
'cannot create file': 'ne morem ustvariti datoteke',
|
||||
'cannot upload file "%(filename)s"': 'ne morem naložiti datoteke "%(filename)s"',
|
||||
'change password': 'spremeni geslo',
|
||||
'check all': 'označi vse',
|
||||
'click here for online examples': 'kliknite za spletne primere',
|
||||
'click here for the administrative interface': 'kliknite za skrbniški vmesnik',
|
||||
'click to check for upgrades': 'kliknite za preverjanje nadgradenj',
|
||||
'code': 'koda',
|
||||
'collapse/expand all': 'zapri/odpri vse',
|
||||
'compiled application removed': 'prevedena aplikacija je odstranjena',
|
||||
'controllers': 'krmilniki',
|
||||
'create file with filename:': 'Ustvari datoteko z imenom:',
|
||||
'create new application:': 'Ustvari novo aplikacijo:',
|
||||
'created by': 'ustvaril',
|
||||
'crontab': 'crontab',
|
||||
'currently running': 'trenutno teče',
|
||||
'currently saved or': 'trenutno shranjeno ali',
|
||||
'customize me!': 'Spremeni me!',
|
||||
'data uploaded': 'podatki naloženi',
|
||||
'database': 'podatkovna baza',
|
||||
'database %s select': 'izberi podatkovno bazo %s ',
|
||||
'database administration': 'upravljanje s podatkovno bazo',
|
||||
'db': 'db',
|
||||
'defines tables': 'definiraj tabele',
|
||||
'delete': 'izbriši',
|
||||
'delete all checked': 'izbriši vse označene',
|
||||
'delete plugin': 'izbriši vtičnik',
|
||||
'design': 'oblikuj',
|
||||
'details': 'podrobnosti',
|
||||
'direction: ltr': 'smer: ltr',
|
||||
'documentation': 'dokumentacija',
|
||||
'done!': 'Narejeno!',
|
||||
'download layouts': 'prenesi postavitev',
|
||||
'download plugins': 'prenesi vtičnik',
|
||||
'edit controller': 'uredi krmilnik',
|
||||
'edit profile': 'uredi profil',
|
||||
'edit views:': 'urejaj poglede:',
|
||||
'escape': 'escape',
|
||||
'export as csv file': 'izvozi kot CSV',
|
||||
'exposes': 'objavlja',
|
||||
'extends': 'razširja',
|
||||
'failed to reload module': 'nisem uspel ponovno naložiti modula',
|
||||
'file "%(filename)s" created': 'datoteka "%(filename)s" ustvarjena',
|
||||
'file "%(filename)s" deleted': 'datoteka "%(filename)s" izbrisana',
|
||||
'file "%(filename)s" uploaded': 'datoteka "%(filename)s" prenešena',
|
||||
'file "%(filename)s" was not deleted': 'datoteka "%(filename)s" ni bila izbrisana',
|
||||
'file "%s" of %s restored': 'datoteka "%s" od %s obnovljena',
|
||||
'file changed on disk': 'datoteka je bila spremenjena',
|
||||
'file does not exist': 'datoteka ne obstaja',
|
||||
'file saved on %(time)s': 'datoteka shranjena %(time)s',
|
||||
'file saved on %s': 'datoteka shranjena %s',
|
||||
'filter': 'fiter',
|
||||
'htmledit': 'htmledit',
|
||||
'includes': 'vključuje',
|
||||
'index': 'indeks',
|
||||
'insert new': 'vstavi nov',
|
||||
'insert new %s': 'vstavi nov %s',
|
||||
'inspect attributes': 'pregled lastnosti',
|
||||
'internal error': 'notranja napaka',
|
||||
'invalid password': 'napačno geslo',
|
||||
'invalid request': 'napačna zahteva',
|
||||
'invalid ticket': 'napačen kartonček',
|
||||
'language file "%(filename)s" created/updated': 'jezikovna datoteka "%(filename)s" ustvarjena/posodobljena',
|
||||
'languages': 'jeziki',
|
||||
'languages updated': 'jeziki posodobljeni',
|
||||
'loading...': 'nalaganje...',
|
||||
'locals': 'locals',
|
||||
'located in the file': 'se nahaja v datoteki',
|
||||
'login': 'prijava',
|
||||
'lost password?': 'Izgubljeno geslo?',
|
||||
'merge': 'združi',
|
||||
'models': 'modeli',
|
||||
'modules': 'moduli',
|
||||
'new application "%s" created': 'ustvarjen nov program "%s"',
|
||||
'new record inserted': 'vstavljen nov zapis',
|
||||
'next 100 rows': 'naslednjih 100 zapisov',
|
||||
'or import from csv file': 'ali uvozi iz CSV datoteke',
|
||||
'or provide app url:': 'ali vpišite URL programa:',
|
||||
'or provide application url:': 'ali vpišite URL programa:',
|
||||
'pack plugin': 'zapakiraj vtičnik',
|
||||
'please wait!': 'Prosim počakajte!',
|
||||
'plugins': 'vtičniki',
|
||||
'previous 100 rows': 'prejšnjih 100 zapisov',
|
||||
'record': 'zapis',
|
||||
'record does not exist': 'zapis ne obstaja',
|
||||
'record id': 'id zapisa',
|
||||
'register': 'registracija',
|
||||
'request': 'zahteva',
|
||||
'response': 'odgovor',
|
||||
'restore': 'obnovi',
|
||||
'revert': 'povrni',
|
||||
'save': 'shrani',
|
||||
'selected': 'izbrano',
|
||||
'session': 'seja',
|
||||
'session expired': 'seja pretekla',
|
||||
'shell': 'lupina',
|
||||
'some files could not be removed': 'nekaterih datotek se ni dalo izbrisati',
|
||||
'state': 'stanje',
|
||||
'static': 'statično',
|
||||
'submit': 'pošlji',
|
||||
'table': 'tabela',
|
||||
'test': 'test',
|
||||
'test_def': 'test_def',
|
||||
'test_for': 'test_for',
|
||||
'test_if': 'test_if',
|
||||
'test_try': 'test_try',
|
||||
'the application logic, each URL path is mapped in one exposed function in the controller': 'krmilna logika, vsaka URL pot je preslikana v eno funkcijo v krmilniku',
|
||||
'the data representation, define database tables and sets': 'podatkovna predstavitev, definirajte tabele in množice',
|
||||
'the presentations layer, views are also known as templates': 'predstavitveni nivo, pogledi so tudi znani kot predloge',
|
||||
'these files are served without processing, your images go here': 'te datoteke so poslane brez posredovanja in obdelave, svoje slike shranite tu',
|
||||
'to previous version.': 'na prejšnjo različico.',
|
||||
'translation strings for the application': 'prevodna besedila za program',
|
||||
'try': 'poskusi',
|
||||
'try something like': 'poskusite na primer',
|
||||
'unable to create application "%s"': 'ne morem ustvariti programa "%s" ',
|
||||
'unable to delete file "%(filename)s"': 'ne morem izbrisati datoteke "%(filename)s"',
|
||||
'unable to parse csv file': 'ne morem obdelati csv datoteke',
|
||||
'unable to uninstall "%s"': 'ne morem odstraniti "%s"',
|
||||
'uncheck all': 'odznači vse',
|
||||
'update': 'posodobi',
|
||||
'update all languages': 'posodobi vse jezike',
|
||||
'upgrade web2py now': 'posodobi web2py',
|
||||
'upload': 'naloži',
|
||||
'upload application:': 'naloži program:',
|
||||
'upload file:': 'naloži datoteko:',
|
||||
'upload plugin file:': 'naloži vtičnik:',
|
||||
'user': 'uporabnik',
|
||||
'variables': 'spremenljivke',
|
||||
'versioning': 'različice',
|
||||
'view': 'pogled',
|
||||
'views': 'pogledi',
|
||||
'web2py Recent Tweets': 'zadnji tviti na web2py',
|
||||
'web2py is up to date': 'web2py je ažuren',
|
||||
'xml': 'xml',
|
||||
}
|
||||
|
||||
+248
-202
@@ -1,93 +1,185 @@
|
||||
# coding: utf8
|
||||
{
|
||||
' at char %s': ' на символі %s',
|
||||
' at line %s': ' в рядку %s',
|
||||
'"User Exception" debug mode. ': 'Режим ладнання "Сигнали від користувачів" ("User Exception" debug mode) ',
|
||||
'"User Exception" debug mode. An error ticket could be issued!': 'Режим ладнання "Сигнали від користувачів" ("User Exception" debug mode). Користувачі можуть залишати відмітки про помилки!',
|
||||
'!langcode!': 'uk',
|
||||
'!langname!': 'Українська',
|
||||
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"Оновити" це додатковий вираз, такий, як "field1=\'нове_значення\'". Ви не можете змінювати або вилучати дані об\'єднаних таблиць',
|
||||
'"User Exception" debug mode. ': 'Режим ладнання "Сигнали від користувачів" ("User Exception" debug mode) ',
|
||||
'"User Exception" debug mode. An error ticket could be issued!': 'Режим ладнання "Сигнали від користувачів" ("User Exception" debug mode). Користувачі можуть залишати позначки про помилки!',
|
||||
'%s': '%s',
|
||||
'%s %%{row} deleted': 'Вилучено %s %%{рядок}',
|
||||
'%s %%{row} updated': 'Вилучено %s %%{рядок}',
|
||||
'%s Recent Tweets': '%s останніх твітів',
|
||||
'%s students registered': '%s студентів зареєстровано',
|
||||
'%Y-%m-%d': '%Y/%m/%d',
|
||||
'%Y-%m-%d %H:%M:%S': '%Y/%m/%d %H:%M:%S',
|
||||
'%s Recent Tweets': '%s останніх твітів',
|
||||
'%s rows deleted': '%s рядків вилучено',
|
||||
'%s rows updated': '%s рядків оновлено',
|
||||
'%s students registered': '%s студентів зареєстровано',
|
||||
'(requires internet access)': '(потрібно мати доступ в інтернет)',
|
||||
'(something like "it-it")': '(щось схоже на "uk-ua")',
|
||||
'ATTENTION:': 'УВАГА:',
|
||||
'ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.': "УВАГА: Вхід потребує надійного (HTTPS) з'єднання або запуску на локальному комп'ютері.",
|
||||
'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.': 'ОБЕРЕЖНО: ТЕСТУВАННЯ НЕ Є ПОТОКО-БЕЗПЕЧНИМ, ТОЖ НЕ ЗАПУСКАЙТЕ ДЕКІЛЬКА ТЕСТІВ ОДНОЧАСНО.',
|
||||
'ATTENTION: you cannot edit the running application!': 'УВАГА: Ви не можете редагувати додаток, який зараз виконуєте!',
|
||||
'@markmin\x01Searching: **%s** %%{file}': 'Знайдено: **%s** %%{файл}',
|
||||
'Abort': 'Припинити',
|
||||
'About': 'Про',
|
||||
'about': 'про',
|
||||
'About application': 'Про додаток',
|
||||
'Add breakpoint': 'Додати точку зупинки',
|
||||
'Additional code for your application': 'Додатковий код для вашого додатку',
|
||||
'admin disabled because no admin password': 'адмін.інтерфейс відключено, бо не вказано пароль адміністратора',
|
||||
'admin disabled because not supported on google app engine': 'адмін.інтерфейс відключено через те, що Google Application Engine його не підтримує',
|
||||
'admin disabled because too many invalid login attempts': 'адмін.інтерфейс заблоковано, бо кількість хибних спроб входу перевищило граничний рівень',
|
||||
'admin disabled because unable to access password file': 'адмін.інтерфейс відключено через відсутність доступу до файлу паролів',
|
||||
'Admin is disabled because insecure channel': "Адмін.інтерфейс відключено через використання ненадійного каналу звя'зку",
|
||||
'Admin language': 'Мова інтерфейсу:',
|
||||
'administrative interface': 'інтерфейс адміністратора',
|
||||
'Administrator Password:': 'Пароль адміністратора:',
|
||||
'and rename it:': 'i змінити назву на:',
|
||||
'App does not exist or your are not authorized': 'Додаток не існує, або ви не авторизовані',
|
||||
'appadmin': 'Aдм.панель',
|
||||
'appadmin is disabled because insecure channel': "адмін.панель відключено через використання ненадійного каналу зв'язку",
|
||||
'application "%s" uninstalled': 'додаток "%s" вилучено',
|
||||
'application %(appname)s installed with md5sum: %(digest)s': 'додаток %(appname)s встановлено з md5sum: %(digest)s',
|
||||
'Application cannot be generated in demo mode': 'В демо-режимі генерувати додатки не можна',
|
||||
'application compiled': 'додаток скомпільовано',
|
||||
'application is compiled and cannot be designed': 'додаток скомпільований. налаштування змінювати не можна',
|
||||
'Application name:': 'Назва додатку:',
|
||||
'are not used': 'не використовуються',
|
||||
'are not used yet': 'поки що не використовуються',
|
||||
'Are you sure you want to delete file "%s"?': 'Ви впевнені, що хочете вилучити файл "%s"?',
|
||||
'Are you sure you want to delete plugin "%s"?': 'Ви впевнені, що хочете вилучити втулку "%s"?"',
|
||||
'Are you sure you want to delete this object?': "Ви впевнені, що хочете вилучити цей об'єкт?",
|
||||
'Are you sure you want to uninstall application "%s"?': 'Ви впевнені, що хочете вилучити (uninstall) додаток "%s"?',
|
||||
'arguments': 'аргументи',
|
||||
'at char %s': 'на символі %s',
|
||||
'at line %s': 'в рядку %s',
|
||||
'ATTENTION:': 'УВАГА:',
|
||||
'ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.': "УВАГА: Вхід потребує надійного (HTTPS) з'єднання або запуску на локальному комп'ютері.",
|
||||
'ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.': 'ОБЕРЕЖНО: ТЕСТУВАННЯ НЕ Є ПОТОКО-БЕЗПЕЧНИМ, ТОЖ НЕ ЗАПУСКАЙТЕ ДЕКІЛЬКА ТЕСТІВ ОДНОЧАСНО.',
|
||||
'ATTENTION: you cannot edit the running application!': 'УВАГА: Ви не можете редагувати додаток, який зараз виконуєте!',
|
||||
'Available databases and tables': 'Доступні бази даних та таблиці',
|
||||
'back': '<< назад',
|
||||
'bad_resource': 'поганий_ресурс',
|
||||
'Basics': 'Початок',
|
||||
'Begin': 'Початок',
|
||||
'breakpoint': 'точку зупинки',
|
||||
'Breakpoints': 'Точки зупинок',
|
||||
'breakpoints': 'точки зупинок',
|
||||
'Bulk Register': 'Масова реєстрація',
|
||||
'Bulk Student Registration': 'Масова реєстрація студентів',
|
||||
'cache': 'кеш',
|
||||
'Cache Keys': 'Ключі кешу',
|
||||
'cache, errors and sessions cleaned': 'кеш, список зареєстрованих помилок та сесії очищенні',
|
||||
'Cancel': 'Відмінити',
|
||||
'Cannot be empty': 'Не може бути порожнім',
|
||||
'Cannot compile: there are errors in your app:': 'Не вдається скомпілювати: є помилки у вашому додатку:',
|
||||
'cannot create file': 'не можу створити файл',
|
||||
'cannot upload file "%(filename)s"': 'не можу завантажити файл "%(filename)s"',
|
||||
'Change admin password': 'Змінити пароль адміністратора',
|
||||
'check all': 'відмітити всі',
|
||||
'Check for upgrades': 'Перевірити оновлення',
|
||||
'Check to delete': 'Помітити на вилучення',
|
||||
'Checking for upgrades...': 'Відбувається пошук оновлень...',
|
||||
'Clean': 'Очистити',
|
||||
'Clear CACHE?': 'Очистити ВЕСЬ кеш?',
|
||||
'Clear DISK': 'Очистити ДИСКОВИЙ КЕШ',
|
||||
'Clear RAM': "Очистити КЕШ В ПАМ'ЯТІ",
|
||||
'Click row to expand traceback': '"Клацніть" мишкою по рядку, щоб розгорнути стек викликів (traceback)',
|
||||
'Click row to view a ticket': 'Для перегляду відмітки (ticket) "клацніть" мишкою по рядку',
|
||||
'Click row to view a ticket': 'Для перегляду позначки (ticket) "клацніть" мишкою по рядку',
|
||||
'code': 'код',
|
||||
'Code listing': 'Лістинг',
|
||||
'collapse/expand all': 'згорнути/розгорнути все',
|
||||
'Command': 'Команда',
|
||||
'Compile': 'Компілювати',
|
||||
'compiled application removed': 'скомпільований додаток вилучено',
|
||||
'Condition': 'Умова',
|
||||
'contact_admin': "зв'язатись_з_адміністратором",
|
||||
'continue': 'продовжити',
|
||||
'Controllers': 'Контролери',
|
||||
'controllers': 'контролери',
|
||||
'Count': 'К-сть',
|
||||
'Create': 'Створити',
|
||||
'create': 'створити',
|
||||
'create file with filename:': 'створити файл з назвою:',
|
||||
'create plural-form': 'створити форму множини',
|
||||
'Create rules': 'Створити правила',
|
||||
'created by': 'Автор:',
|
||||
'Created On': 'Створено в',
|
||||
'crontab': 'таблиця cron',
|
||||
'Current request': 'Поточний запит',
|
||||
'Current response': 'Поточна відповідь',
|
||||
'Current session': 'Поточна сесія',
|
||||
'currently running': 'наразі, активний додаток',
|
||||
'currently saved or': 'останній збережений, або',
|
||||
'data uploaded': 'дані завантажено',
|
||||
'database': 'база даних',
|
||||
'database %s select': 'Вибірка з бази даних %s',
|
||||
'database administration': 'адміністрування бази даних',
|
||||
'Date and Time': 'Дата і час',
|
||||
'db': 'база даних',
|
||||
'Debug': 'Ладнати (Debug)',
|
||||
'defines tables': "об'являє таблиці",
|
||||
'Delete': 'Вилучити',
|
||||
'delete': 'вилучити',
|
||||
'delete all checked': 'вилучити всі відмічені',
|
||||
'delete plugin': 'вилучити втулку',
|
||||
'Delete this file (you will be asked to confirm deletion)': 'Вилучити цей файл (буде відображено запит на підтвердження операції)',
|
||||
'Delete:': 'Вилучити:',
|
||||
'deleted after first hit': 'автоматично вилучається після першого спрацювання',
|
||||
'Deploy': 'Розгорнути',
|
||||
'Deploy on Google App Engine': 'Розгорнути на Google App Engine (GAE)',
|
||||
'Deploy to OpenShift': 'Розгорнути на OpenShift',
|
||||
'Deployment form': 'Форма розгортання (deployment form)',
|
||||
'design': 'налаштування',
|
||||
'Detailed traceback description': 'Детальний опис стеку викликів (traceback)',
|
||||
'details': 'детальніше',
|
||||
'direction: ltr': 'напрямок: зліва-направо (ltr)',
|
||||
'directory not found': 'каталог не знайдено',
|
||||
'Disable': 'Вимкнути',
|
||||
'Disabled': 'Вимкнено',
|
||||
'disabled in demo mode': 'відключено в демо-режимі',
|
||||
'disabled in multi user mode': 'відключено в багато-користувацькому режимі',
|
||||
'Disk Cache Keys': 'Ключі дискового кешу',
|
||||
'Disk Cleared': 'Дисковий кеш очищено',
|
||||
'docs': 'док.',
|
||||
'done!': 'зроблено!',
|
||||
'Downgrade': 'Повернути попередню версію',
|
||||
'download layouts': 'завантажити макет (layout)',
|
||||
'download plugins': 'завантажити втулки',
|
||||
'Edit': 'Редагувати',
|
||||
'edit all': 'редагувати всі',
|
||||
'Edit application': 'Налаштування додатку',
|
||||
'edit controller': 'редагувати контролер',
|
||||
'Edit current record': 'Редагувати поточний запис',
|
||||
'Editing Language file': 'Редагується файл перекладу',
|
||||
'edit views:': 'редагувати відображення (views):',
|
||||
'Editing file "%s"': 'Редагується файл "%s"',
|
||||
'Editing Language file': 'Редагується файл перекладу',
|
||||
'Editing Plural Forms File': 'Редагується файл форм множини',
|
||||
'Enable': 'Увімкнути',
|
||||
'enter a value': 'введіть значення',
|
||||
'Error': 'Помилка',
|
||||
'Error logs for "%(app)s"': 'Список зареєстрованих помилок додатку "%(app)s"',
|
||||
'Error snapshot': 'Розгорнутий знімок стану (Error snapshot)',
|
||||
'Error ticket': 'Відмітка (ticket) про помилку',
|
||||
'Error ticket': 'Позначка (ticket) про помилку',
|
||||
'Errors': 'Помилки',
|
||||
'Exception %(extype)s: %(exvalue)s': 'Виключення %(extype)s: %(exvalue)s',
|
||||
'Exception %s': 'Виключення %s',
|
||||
'Exception instance attributes': 'Атрибути примірника класу Exception (виключення)',
|
||||
'Expand Abbreviation': 'Розгорнути абревіатуру',
|
||||
'export as csv file': 'експортувати як файл csv',
|
||||
'exposes': 'обслуговує',
|
||||
'exposes:': 'обслуговує:',
|
||||
'extends': 'розширює',
|
||||
'failed to compile file because:': 'не вдалось скомпілювати файл через:',
|
||||
'failed to reload module because:': 'не вдалось перевантажити модуль через:',
|
||||
'faq': 'ЧаПи (faq)',
|
||||
'File': 'Файл',
|
||||
'file "%(filename)s" created': 'файл "%(filename)s" створено',
|
||||
'file "%(filename)s" deleted': 'файл "%(filename)s" вилучено',
|
||||
'file "%(filename)s" uploaded': 'файл "%(filename)s" завантажено',
|
||||
'file "%s" of %s restored': 'файл "%s" з %s відновлено',
|
||||
'file changed on disk': 'файл змінено на диску',
|
||||
'file does not exist': 'файлу не існує',
|
||||
'file not found': 'файл не знайдено',
|
||||
'file saved on %(time)s': 'файл збережено в %(time)s',
|
||||
'file saved on %s': 'файл збережено в %s',
|
||||
'Filename': "Ім'я файлу",
|
||||
'filter': 'фільтр',
|
||||
'Frames': 'Стек викликів',
|
||||
'Functions with no doctests will result in [passed] tests.': 'Функції, в яких відсутні док-тести відносяться до функцій, які успішно пройшли тести.',
|
||||
'GAE Email': 'Ел.пошта GAE',
|
||||
@@ -95,106 +187,192 @@
|
||||
'GAE Password': 'Пароль GAE',
|
||||
'Generate': 'Генерувати',
|
||||
'Get from URL:': 'Отримати з URL:',
|
||||
'Globals': 'Глобальні змінні',
|
||||
'Globals##debug': 'Глобальні змінні',
|
||||
'Go to Matching Pair': 'Перейти до відповідної пари',
|
||||
'go!': 'почали!',
|
||||
'Google App Engine Deployment Interface': 'Інтерфейс розгортання Google App Engine',
|
||||
'Google Application Id': 'Ідентифікатор Google Application',
|
||||
'Goto': 'Перейти до',
|
||||
'Help': 'Допомога',
|
||||
'Hide/Show Translated strings': 'Сховати/показати рядки перекладу',
|
||||
'Hide/Show Translated strings': 'Сховати/показати ВЖЕ ПЕРЕКЛАДЕНІ рядки',
|
||||
'Hits': 'Спрацьовувань',
|
||||
'Home': 'Домівка',
|
||||
'honored only if the expression evaluates to true': 'точка зупинки активується тільки за істинності умови',
|
||||
'If start the downgrade, be patient, it may take a while to rollback': 'Запустивши повернення на попередню версію, будьте терплячими, це може зайняти трохи часу',
|
||||
'If start the upgrade, be patient, it may take a while to download': 'Запустивши оновлення, будьте терплячими, потрібен час для завантаження необхідних даних',
|
||||
'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.': 'Якщо в наданому вище звіті присутня відмітка про помилку (ticket number), то це вказує на збій у виконанні контролера ще до початку запуску док-тестів. Це, зазвичай, сигналізує про помилку вирівнювання тексту програми (indention error) або помилку за межами функції (error outside function code).\r\nЗелений заголовок сигналізує, що всі тести (з наявних) пройшли успішно. В цьому випадку результат тестів показано не буде.',
|
||||
'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.': 'Якщо в наданому вище звіті присутня позначка про помилку (ticket number), то це вказує на збій у виконанні контролера ще до початку запуску док-тестів. Це, зазвичай, сигналізує про помилку вирівнювання тексту програми (indention error) або помилку за межами функції (error outside function code).\r\nЗелений заголовок сигналізує, що всі тести (з наявних) пройшли успішно. В цьому випадку результат тестів показано не буде.',
|
||||
'Import/Export': 'Імпорт/Експорт',
|
||||
'In development, use the default Rocket webserver that is currently supported by this debugger.': 'Під час розробки , використовуйте вбудований веб-сервер Rocket, він найкраще налаштований на спільну роботу з інтерактивним ладначем.',
|
||||
'includes': 'включає',
|
||||
'index': 'індекс',
|
||||
'insert new': 'вставити новий',
|
||||
'insert new %s': 'вставити новий %s',
|
||||
'inspect attributes': 'інспектувати атрибути',
|
||||
'Install': 'Встановлення',
|
||||
'Installed applications': 'Встановлені додатки (applications)',
|
||||
'Interaction at %s line %s': 'Виконується %s рядок %s',
|
||||
'Interactive console': 'Інтерактивна консоль',
|
||||
'internal error': 'внутрішня помилка',
|
||||
'internal error: %s': 'внутрішня помилка: %s',
|
||||
'Internal State': 'Внутрішній стан',
|
||||
'Invalid Query': 'Помилковий запит',
|
||||
'Invalid action': 'Помилкова дія',
|
||||
'invalid circual reference': 'помилкове циклічне посилання',
|
||||
'invalid circular reference': 'помилкове циклічне посилання',
|
||||
'invalid password': 'неправильний пароль',
|
||||
'invalid password.': 'неправильний пароль.',
|
||||
'Invalid Query': 'Помилковий запит',
|
||||
'invalid request': 'хибний запит',
|
||||
'invalid request ': 'Хибний запит',
|
||||
'invalid table names (auth_* tables already defined)': 'хибна назва таблиці (таблиці auth_* вже оголошено)',
|
||||
'invalid ticket': 'недійсна позначка про помилку (ticket)',
|
||||
'Key': 'Ключ',
|
||||
'Key bindings': 'Клавіатурні скорочення:',
|
||||
'Key bindings for ZenCoding Plugin': 'Клавіатурні скорочення для втулки ZenCoding plugin',
|
||||
'Language files (static strings) updated': 'Файли перекладів (незмінні рядки) оновлено',
|
||||
'kill process': 'вбити процес',
|
||||
'language file "%(filename)s" created/updated': 'Файл перекладу "%(filename)s" створено/оновлено',
|
||||
'Language files (static strings) updated': 'Файли перекладів (із статичних рядків в першоджерелах) оновлено',
|
||||
'languages': 'переклади',
|
||||
'Languages': 'Переклади',
|
||||
'Last saved on:': 'Востаннє збережено:',
|
||||
'License for': 'Ліцензія додатку',
|
||||
'Line number': '№ рядка',
|
||||
'LineNo': '№ рядка',
|
||||
'Locals': 'Локальні змінні',
|
||||
'loading...': 'завантаження...',
|
||||
'locals': 'локальні',
|
||||
'Locals##debug': 'Локальні змінні',
|
||||
'Login': 'Вхід',
|
||||
'login': 'вхід',
|
||||
'Login to the Administrative Interface': 'Вхід в адміністративний інтерфейс',
|
||||
'Logout': 'Вихід',
|
||||
'Main Menu': 'Основне меню',
|
||||
'Manage Admin Users/Students': 'Адміністратор керування користувачами/студентами',
|
||||
'Manage Students': 'Керувати студентами',
|
||||
'Match Pair': 'Знайти пару',
|
||||
'merge': "з'єднати",
|
||||
'Merge Lines': "З'єднати рядки",
|
||||
'Minimum length is %s': 'Мінімальна довжина становить %s',
|
||||
'Models': 'Моделі',
|
||||
'models': 'моделі',
|
||||
'Modified On': 'Змінено в',
|
||||
'Modules': 'Модулі',
|
||||
'modules': 'модулі',
|
||||
'Must include at least %s %s': 'Має вміщувати щонайменше %s %s',
|
||||
'Must include at least %s lower case': 'Повинен включати щонайменше %s малих букв',
|
||||
'Must include at least %s of the following : %s': 'Має включати не менше %s таких символів : %s',
|
||||
'Must include at least %s upper case': 'Повинен включати щонайменше %s великих букв',
|
||||
'NO': 'НІ',
|
||||
'new application "%s" created': 'новий додаток "%s" створено',
|
||||
'New Application Wizard': 'Майстер створення нового додатку',
|
||||
'New Record': 'Новий запис',
|
||||
'New application wizard': 'Майстер створення нового додатку',
|
||||
'new plugin installed': 'нова втулка (plugin) встановлена',
|
||||
'New Record': 'Новий запис',
|
||||
'new record inserted': 'новий рядок додано',
|
||||
'New simple application': 'Новий простий додаток',
|
||||
'next': 'наступний',
|
||||
'next 100 rows': 'наступні 100 рядків',
|
||||
'Next Edit Point': 'Наступне місце редагування',
|
||||
'No Interaction yet': 'Ладнач не активовано',
|
||||
'NO': 'НІ',
|
||||
'No databases in this application': 'Даний додаток не використовує бази даних',
|
||||
'No Interaction yet': 'Ладнач не активовано',
|
||||
'no match': 'співпадань нема',
|
||||
'no permission to uninstall "%s"': 'нема прав на вилучення (uninstall) "%s"',
|
||||
'No ticket_storage.txt found under /private folder': 'В каталозі /private відсутній файл ticket_storage.txt',
|
||||
'Not Authorized': 'Не дозволено',
|
||||
'Note: If you receive an error with github status code of 128, ensure the system and account you are deploying from has a cooresponding ssh key configured in the openshift account.': 'Примітка: Якщо ви отримали повідомлення про помилку з кодом стану github рівним 128, переконайтесь, що система та обліковий запис, з якого відбувається розгортання використовують відповідний ключ ssh, налаштований в обліковому записі openshift.',
|
||||
"On production, you'll have to configure your webserver to use one process and multiple threads to use this debugger.": 'У промисловій експлуатації, ви повинні налаштувати ваш веб-сервер на використання одного процесу та багатьох потоків, якщо бажаєте скористатись цим ладначем.',
|
||||
'online designer': 'дизайнер БД',
|
||||
'OpenShift Deployment Interface': 'OpenShift: Інтерфейс розгортання',
|
||||
'OpenShift Output': 'Вивід OpenShift',
|
||||
'or import from csv file': 'або імпортувати через csv-файл',
|
||||
'Original/Translation': 'Оригінал/переклад',
|
||||
'Overwrite installed app': 'Перезаписати встановлений додаток',
|
||||
'PAM authenticated user, cannot change password here': 'Ввімкнена система ідентифікації користувачів PAM. Для зміни паролю скористайтесь командами вашої ОС ',
|
||||
'Pack all': 'Запак.все',
|
||||
'Pack compiled': 'Запак.компл',
|
||||
'pack plugin': 'запакувати втулку',
|
||||
'PAM authenticated user, cannot change password here': 'Ввімкнена система ідентифікації користувачів PAM. Для зміни паролю скористайтесь командами вашої ОС ',
|
||||
'password changed': 'пароль змінено',
|
||||
'Path to appcfg.py': 'Шлях до appcfg.py',
|
||||
'Path to local openshift repo root.': 'Шлях до локального корня репозитарія openshift.',
|
||||
'peek': 'глянути',
|
||||
'Peeking at file': 'Перегляд файлу',
|
||||
'Please': 'Будь-ласка',
|
||||
'plugin': 'втулка',
|
||||
'plugin "%(plugin)s" deleted': 'втулку "%(plugin)s" вилучено',
|
||||
'Plugin "%s" in application': 'Втулка "%s" в додатку',
|
||||
'plugin not specified': 'втулку не визначено',
|
||||
'plugins': 'втулки (plugins)',
|
||||
'Plugins': 'Втулки (Plugins)',
|
||||
'Plural Form #%s': 'Форма множини #%s',
|
||||
'Plural-Forms:': 'Форми множини:',
|
||||
'Powered by': 'Працює на',
|
||||
'previous 100 rows': 'попередні 100 рядків',
|
||||
'Previous Edit Point': 'Попереднє місце редагування',
|
||||
'Project Progress': 'Поступ проекту',
|
||||
'Query:': 'Запит:',
|
||||
'RAM Cache Keys': "Ключ ОЗП-кешу (RAM Cache)",
|
||||
'RAM Cache Keys': 'Ключ ОЗП-кешу (RAM Cache)',
|
||||
'Ram Cleared': "Кеш в пам'яті очищено",
|
||||
'record': 'запис',
|
||||
'record does not exist': 'запису не існує',
|
||||
'record id': 'Ід.запису',
|
||||
'refresh': 'оновіть',
|
||||
'Reload routes': 'Перезавантажити маршрути',
|
||||
'Remove compiled': 'Вилуч.компл',
|
||||
'Removed Breakpoint on %s at line %s': 'Вилучено точку зупинки у %s в рядку %s',
|
||||
'request': 'запит',
|
||||
'requires python-git, but not installed': 'Для розгортання необхідний пакет python-git, але він не встановлений',
|
||||
'resolve': "розв'язати",
|
||||
'Resolve Conflict file': "Файл розв'язування конфлікту",
|
||||
'response': 'відповідь',
|
||||
'restart': 'перезапустити майстра',
|
||||
'restore': 'повернути',
|
||||
'return': 'повернутись',
|
||||
'revert': 'відновитись',
|
||||
'Rows in table': 'Рядків у таблиці',
|
||||
'Rows selected': 'Рядків вибрано',
|
||||
'rules are not defined': 'правила не визначені',
|
||||
'rules parsed with errors': 'в правилах є помилка',
|
||||
'rules:': 'правила:',
|
||||
'Run tests': 'Запустити всі тести',
|
||||
'Run tests in this file': 'Запустити тести у цьому файлі',
|
||||
"Run tests in this file (to run all files, you may also use the button labelled 'test')": "Запустити тести з цього файлу (для тестування всіх файлів, вам необхідно натиснути кнопку з назвою 'тестувати всі')",
|
||||
'Running on %s': 'Запущено на %s',
|
||||
'runonce': 'одноразово',
|
||||
'Save': 'Зберегти',
|
||||
'Save via Ajax': 'зберегти через Ajax',
|
||||
'Saved file hash:': 'Хеш збереженого файлу:',
|
||||
'Searching:': 'Пошук:',
|
||||
'search': 'пошук',
|
||||
'selected': 'відмічено',
|
||||
'session': 'сесія',
|
||||
'session expired': 'час даної сесії вичерпано',
|
||||
'Set Breakpoint on %s at line %s: %s': 'Додано точку зупинки в %s на рядок %s: %s',
|
||||
'shell': 'консоль',
|
||||
'signup': 'підписатись',
|
||||
'signup_requested': 'необхідна_реєстрація',
|
||||
'Singular Form': 'Форма однини',
|
||||
'site': 'сайт',
|
||||
'Site': 'Сайт',
|
||||
'skip to generate': 'перейти до генерування результату',
|
||||
'some files could not be removed': 'деякі файли не можна вилучити',
|
||||
'Sorry, could not find mercurial installed': 'Не вдалось виявити встановлену систему контролю версій Mercurial',
|
||||
'Start a new app': 'Створюється новий додаток',
|
||||
'Start wizard': 'Активувати майстра',
|
||||
'state': 'стан',
|
||||
'static': 'статичні',
|
||||
'Static files': 'Статичні файли',
|
||||
'Step': 'Крок',
|
||||
'step': 'крок',
|
||||
'stop': 'зупинити',
|
||||
'submit': 'застосувати',
|
||||
'Submit': 'Застосувати',
|
||||
'successful': 'успішно',
|
||||
'table': 'таблиця',
|
||||
'tags': 'мітки (tags)',
|
||||
'Temporary': 'Тимчасово',
|
||||
'test': 'тестувати всі',
|
||||
'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.table1.field1==\'значення\'". Вираз "db.table1.field1==db.table2.field2" повертає результат об\'єднання (SQL JOIN) таблиць.',
|
||||
'The app exists, was NOT created by wizard, continue to overwrite!': 'Додаток вже існує, і його НЕ було створено майстром. Продовжуємо перезаписування!',
|
||||
'The app exists, was created by wizard, continue to overwrite!': 'Додаток вже існує і його було створено майстром. Продовжуємо переписування!',
|
||||
'The application logic, each URL path is mapped in one exposed function in the controller': 'Логіка додатку, кожний шлях URL проектується на одну з експонуючих функцій в контролері',
|
||||
'The app exists, was NOT created by wizard, continue to overwrite!': 'Додаток вже існує, і його НЕ було створено майстром. Продовжуємо перезаписування!',
|
||||
'The application logic, each URL path is mapped in one exposed function in the controller': 'Логіка додатку, кожний шлях URL проектується на одну з функцій обслуговування в контролері',
|
||||
'The data representation, define database tables and sets': 'Представлення даних, опис таблиць БД та наборів',
|
||||
'The presentations layer, views are also known as templates': 'Презентаційний рівень, відображення, відомі також як шаблони',
|
||||
'There are no controllers': 'Жодного контролера, наразі, не існує',
|
||||
@@ -210,215 +388,83 @@
|
||||
'This is an experimental feature and it needs more testing. If you decide to downgrade you do it at your own risk': 'Це експериментальна властивість, яка вимагає подальшого тестування. Якщо ви вирішили повернутись на попередню версію, ви це робити на ваш власний розсуд.',
|
||||
'This is an experimental feature and it needs more testing. If you decide to upgrade you do it at your own risk': 'Це експериментальна властивість, яка вимагає подальшого тестування. Якщо ви вирішили розпочати оновлення, ви це робите на ваш власний розсуд',
|
||||
'This is the %(filename)s template': 'Це шаблон %(filename)s',
|
||||
"This page can commit your changes to an openshift app repo and push them to your cloud instance. This assumes that you've already created the application instance using the web2py skeleton and have that repo somewhere on a filesystem that this web2py instance can access. This functionality requires GitPython installed and on the python path of the runtime that web2py is operating in.": 'На цій сторінці можна закомітити ваші зміни в репозитарій додатків openshift та проштовхнути їх у ваш примірник в хмарі. Це передбачає, що ви вже створили примірник додатку, використовуючи базовий додаток web2py, як скелет, і маєте репозитарій десь на вашій файловій системі, причому екземпляр web2py має до нього доступ. Ця властивість вимагає наявності встановленого модулю GitPython так, щоб web2py міг його викликати.',
|
||||
'This page can upload your application to the Google App Engine computing cloud. Mind that you must first create indexes locally and this is done by installing the Google appserver and running the app locally with it once, or there will be errors when selecting records. Attention: deployment may take long time, depending on the network speed. Attention: it will overwrite your app.yaml. DO NOT SUBMIT TWICE.': 'На цій сторінці ви можете завантажити свій додаток в сервіс хмарних обчислень Google App Engine. Майте на увазі, що спочатку необхідно локально створити індекси, і це можна зробити встановивши сервер додатків Google appserver та запустивши в ньому додаток один раз, інакше при виборі записів виникатимуть помилки. Увага: розгортання може зайняти тривалий час, в залежності від швидкості мережі. Увага: це призведе до перезапису app.yaml. НЕ ПУБЛІКУЙТЕ ДВІЧІ.',
|
||||
'Ticket': 'Відмітка (Ticket)',
|
||||
'Ticket ID': 'Ідентифікатор відмітки (Ticket ID)',
|
||||
'this page to see if a breakpoint was hit and debug interaction is required.': 'цю сторінку, щоб побачити, чи була досягнута точка зупинки і процес ладнання розпочато.',
|
||||
'ticket': 'позначка',
|
||||
'Ticket': 'Позначка (Ticket)',
|
||||
'Ticket ID': 'Ід.позначки (Ticket ID)',
|
||||
'tickets': 'позначки (tickets)',
|
||||
'Time in Cache (h:m:s)': 'Час в кеші (г:хв:сек)',
|
||||
'to previous version.': 'до попередньої версії.',
|
||||
'To create a plugin, name a file/folder plugin_[name]': 'Для створення втулки, назвіть файл/каталог plugin_[name]',
|
||||
'To emulate a breakpoint programatically, write:': 'Для встановлення точки зупинки програмним чином напишіть:',
|
||||
'to use the debugger!': 'щоб активувати ладнач!',
|
||||
'toggle breakpoint': '+/- точку зупинки',
|
||||
'Traceback': 'Стек викликів (Traceback)',
|
||||
'Translation strings for the application': 'Пари рядків <оригінал>:<переклад> для вибраної мови',
|
||||
'try something like': 'спробуйте щось схоже на',
|
||||
'try view': 'дивитись результат',
|
||||
'Type PDB debugger command in here and hit Return (Enter) to execute it.': 'наберіть тут будь-які команди ладнача PDB і натисніть клавішу [Return] ([Enter]), щоб запустити їх на виконання.',
|
||||
'Type python statement in here and hit Return (Enter) to execute it.': 'Наберіть тут будь-які вирази Python і натисніть клавішу [Return] ([Enter]), щоб запустити їх на виконання.',
|
||||
'Unable to check for upgrades': 'Неможливо перевірити оновлення',
|
||||
'Unable to determine the line number!': 'Не можу визначити номер рядка!',
|
||||
'Unable to download app because:': 'Не можу завантажити додаток через:',
|
||||
'Unable to download because:': 'Неможливо завантажити через:',
|
||||
'Uninstall': 'Вилучити',
|
||||
'Unsupported webserver working mode: %s': 'Веб-сервер знаходиться в режимі, який не підтримується: %s',
|
||||
'Update:': 'Поновити:',
|
||||
'Upgrade': 'Оновити',
|
||||
'Upload a package:': 'Завантажити пакет:',
|
||||
'Upload and install packed application': 'Завантажити та встановити запакований додаток',
|
||||
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Для створення складних запитів використовуйте (...)&(...) замість AND, (...)|(...) замість OR, та ~(...) замість NOT.',
|
||||
'Using the shell may lock the database to other users of this app.': 'Використання оболонки може заблокувати базу даних від сумісного використання іншими користувачами цього додатку.',
|
||||
'Version': 'Версія',
|
||||
'Version %s.%s.%s (%s) %s': 'Версія %s.%s.%s (%s) %s',
|
||||
'Versioning': 'Контроль версій',
|
||||
'Views': 'Відображення (Views)',
|
||||
'WARNING:': 'ПОПЕРЕДЖЕННЯ:',
|
||||
'Web Framework': 'Web Framework',
|
||||
'Wrap with Abbreviation': 'Загорнути з абревіатурою',
|
||||
'YES': 'ТАК',
|
||||
'You can also set and remove breakpoint in the edit window, using the Toggle Breakpoint button': 'Ви також можете встановлювати/вилучати точки зупинок під час редагування першоджерел (sources), використовуючи кнопку "+/- точку зупинки"',
|
||||
'You have one more login attempt before you are locked out': 'У вас є ще одна спроба перед тим, як вхід буде заблоковано',
|
||||
'You need to set up and reach a': 'Треба встановити та досягнути',
|
||||
'Your application will be blocked until you click an action button (next, step, continue, etc.)': 'Ваш додаток буде заблоковано, поки ви не клацнете по одній з кнопок керування ("наступний", "крок", "продовжити", та ін.)',
|
||||
'Your can inspect variables using the console bellow': 'Ви можете досліджувати змінні, використовуючи інтерактивну консоль',
|
||||
'about': 'про',
|
||||
'admin disabled because no admin password': 'адмін.інтерфейс відключено, бо не вказано пароль адміністратора',
|
||||
'admin disabled because not supported on google app engine': 'адмін.інтерфейс відключено через те, що Google Application Engine його не підтримує',
|
||||
'admin disabled because too many invalid login attempts': 'адмін.інтерфейс заблоковано, бо кількість хибних спроб входу перевищило граничний рівень',
|
||||
'admin disabled because unable to access password file': 'адмін.інтерфейс відключено через відсутність доступу до файлу паролів',
|
||||
'administrative interface': 'інтерфейс адміністратора',
|
||||
'and rename it:': 'i змінити назву на:',
|
||||
'appadmin': 'Aдм.панель',
|
||||
'appadmin is disabled because insecure channel': "адмін.панель відключено через використання ненадійного каналу зв'язку",
|
||||
'application "%s" uninstalled': 'додаток "%s" вилучено',
|
||||
'application %(appname)s installed with md5sum: %(digest)s': 'додаток %(appname)s встановлено з md5sum: %(digest)s',
|
||||
'application compiled': 'додаток скомпільовано',
|
||||
'application is compiled and cannot be designed': 'додаток скомпільований. налаштування змінювати не можна',
|
||||
'arguments': 'аргументи',
|
||||
'back': '<< назад',
|
||||
'breakpoint': 'точку зупинки',
|
||||
'breakpoints': 'точки зупинок',
|
||||
'cache': 'кеш',
|
||||
'cache, errors and sessions cleaned': 'кеш, список зареєстрованих помилок та сесії очищенні',
|
||||
'cannot create file': 'не можу створити файл',
|
||||
'cannot upload file "%(filename)s"': 'не можу завантажити файл "%(filename)s"',
|
||||
'check all': 'відмітити всі',
|
||||
'code': 'код',
|
||||
'collapse/expand all': 'згорнути/розгорнути все',
|
||||
'compiled application removed': 'скомпільований додаток вилучено',
|
||||
'continue': 'продовжити',
|
||||
'controllers': 'контролери',
|
||||
'create file with filename:': 'створити файл з назвою:',
|
||||
'created by': 'Автор:',
|
||||
'crontab': 'таблиця cron',
|
||||
'currently running': 'наразі, активний додаток',
|
||||
'currently saved or': 'останній збережений, або',
|
||||
'data uploaded': 'дані завантажено',
|
||||
'database': 'база даних',
|
||||
'database %s select': 'Вибірка з бази даних %s',
|
||||
'database administration': 'адміністрування бази даних',
|
||||
'db': 'дб',
|
||||
'defines tables': "об'являє таблиці",
|
||||
'delete': 'вилучити',
|
||||
'delete all checked': 'вилучити всі відмічені',
|
||||
'delete plugin': 'вилучити втулку',
|
||||
'deleted after first hit': 'автоматично вилучається після першого спрацювання',
|
||||
'design': 'налаштування',
|
||||
'details': 'детальніше',
|
||||
'direction: ltr': 'напрямок: зліва-направо (ltr)',
|
||||
'disabled in demo mode': 'відключено в демо-режимі',
|
||||
'disabled in multi user mode': 'відключено в багато-користувацькому режимі',
|
||||
'docs': 'док.',
|
||||
'done!': 'зроблено!',
|
||||
'download layouts': 'завантажити макет (layout)',
|
||||
'download plugins': 'завантажити втулки',
|
||||
'edit all': 'редагувати всі',
|
||||
'edit controller': 'редагувати контролер',
|
||||
'edit views:': 'редагувати відображення (views):',
|
||||
'enter a value': 'введіть значення',
|
||||
'export as csv file': 'експортувати як файл csv',
|
||||
'exposes': 'експонує',
|
||||
'exposes:': 'експонує:',
|
||||
'extends': 'розширює',
|
||||
'failed to compile file because:': 'не вдалось скомпілювати файл через:',
|
||||
'failed to reload module because:': 'не вдалось перевантажити модуль через:',
|
||||
'file "%(filename)s" created': 'файл "%(filename)s" створено',
|
||||
'file "%(filename)s" deleted': 'файл "%(filename)s" вилучено',
|
||||
'file "%(filename)s" uploaded': 'файл "%(filename)s" завантажено',
|
||||
'file "%s" of %s restored': 'файл "%s" з %s відновлено',
|
||||
'file changed on disk': 'файл змінено на диску',
|
||||
'file does not exist': 'файлу не існує',
|
||||
'file not found': 'файл не знайдено',
|
||||
'file saved on %(time)s': 'файл збережено в %(time)s',
|
||||
'file saved on %s': 'файл збережено в %s',
|
||||
'files': 'файли',
|
||||
'filter': 'фільтр',
|
||||
'go!': 'почали!',
|
||||
'honored only if the expression evaluates to true': 'точка зупинки активується тільки за істинності умови',
|
||||
'includes': 'включає',
|
||||
'index': 'індекс',
|
||||
'insert new': 'вставити новий',
|
||||
'insert new %s': 'вставити новий %s',
|
||||
'inspect attributes': 'інспектувати атрибути',
|
||||
'internal error': 'внутрішня помилка',
|
||||
'internal error: %s': 'внутрішня помилка: %s',
|
||||
'invalid circual reference': 'помилкове циклічне посилання',
|
||||
'invalid circular reference': 'помилкове циклічне посилання',
|
||||
'invalid password': 'неправильний пароль',
|
||||
'invalid password.': 'неправильний пароль.',
|
||||
'invalid request': 'хибний запит',
|
||||
'invalid table names (auth_* tables already defined)': "хибна назва таблиці (таблиці auth_* вже оголошено)",
|
||||
'invalid ticket': 'недійсна відмітка про помилку (ticket)',
|
||||
'language file "%(filename)s" created/updated': 'Файл перекладу "%(filename)s" створено/оновлено',
|
||||
'languages': 'переклади',
|
||||
'loading...': 'завантаження...',
|
||||
'locals': 'локальні',
|
||||
'merge': "з'єднати",
|
||||
'models': 'моделі',
|
||||
'modules': 'модулі',
|
||||
'new application "%s" created': 'новий додаток "%s" створено',
|
||||
'new plugin installed': 'нова втулка (plugin) встановлена',
|
||||
'new record inserted': 'новий рядок додано',
|
||||
'next': 'наступний',
|
||||
'next 100 rows': 'наступні 100 рядків',
|
||||
'no match': 'співпадань нема',
|
||||
'no permission to uninstall "%s"': 'нема прав на вилучення (uninstall) "%s"',
|
||||
'online designer': 'ДБ-дизайнер',
|
||||
'or import from csv file': 'або імпортувати через csv-файл',
|
||||
'pack plugin': 'запакувати втулку',
|
||||
'password changed': 'пароль змінено',
|
||||
'peek': 'глянути',
|
||||
'plugin': 'втулка',
|
||||
'plugin "%(plugin)s" deleted': 'втулку "%(plugin)s" вилучено',
|
||||
'plugin not specified': 'втулку не визначено',
|
||||
'plugins': 'втулки (plugins)',
|
||||
'previous 100 rows': 'попередні 100 рядків',
|
||||
'record': 'запис',
|
||||
'record does not exist': 'запису не існує',
|
||||
'record id': 'Ід.запису',
|
||||
'refresh': 'оновіть',
|
||||
'request': 'запит',
|
||||
'resolve': "розв'язати",
|
||||
'response': 'відповідь',
|
||||
'restart': 'перезапустити майстра',
|
||||
'restore': 'повернути',
|
||||
'return': 'повернутись',
|
||||
'revert': 'відновитись',
|
||||
'selected': 'відмічено',
|
||||
'session': 'сесія',
|
||||
'session expired': 'час даної сесії вичерпано',
|
||||
'shell': 'консоль',
|
||||
'site': 'сайт',
|
||||
'skip to generate': 'перейти до генерування результату',
|
||||
'some files could not be removed': 'деякі файли не можна вилучити',
|
||||
'state': 'стан',
|
||||
'static': 'статичні',
|
||||
'step': 'крок',
|
||||
'stop': 'зупинити',
|
||||
'submit': 'застосувати',
|
||||
'successful': 'успішно',
|
||||
'table': 'таблиця',
|
||||
'test': 'тестувати всі',
|
||||
'this page to see if a breakpoint was hit and debug interaction is required.': 'цю сторінку, щоб побачити, чи була досягнута точка зупинки і процес ладнання розпочато.',
|
||||
'ticket': 'відмітка',
|
||||
'to previous version.': 'до попередньої версії.',
|
||||
'to use the debugger!': 'щоб активувати ладнач!',
|
||||
'toggle breakpoint': '+/- точку зупинки',
|
||||
'try something like': 'спробуйте щось схоже на',
|
||||
'try view': 'дивитись результат',
|
||||
'unable to create application "%s"': 'не можу створити додаток "%s"',
|
||||
'unable to create application "%s" (it may exist already)': 'не можу створити додаток "%s" (можливо його вже створено)',
|
||||
'unable to delete file "%(filename)s"': 'не можу вилучити файл "%(filename)s"',
|
||||
'unable to delete file plugin "%(plugin)s"': 'не можу вилучити файл втулки "%(plugin)s"',
|
||||
'Unable to determine the line number!': 'Не можу визначити номер рядка!',
|
||||
'Unable to download app because:': 'Не можу завантажити додаток через:',
|
||||
'Unable to download because:': 'Неможливо завантажити через:',
|
||||
'unable to download layout': 'не вдається завантажити макет',
|
||||
'unable to download plugin: %s': 'не вдається завантажити втулку: %s',
|
||||
'unable to install application "%(appname)s"': 'не вдається встановити додаток "%(appname)s"',
|
||||
'unable to parse csv file': 'не вдається розібрати csv-файл',
|
||||
'unable to uninstall "%s"': 'не вдається вилучити "%s"',
|
||||
'unable to upgrade because "%s"': 'не вдається оновити, тому що "%s"',
|
||||
'unauthorized': 'неавторизовано',
|
||||
'uncheck all': 'зняти відмітку з усіх',
|
||||
'uninstall': 'вилучити',
|
||||
'Uninstall': 'Вилучити',
|
||||
'Unsupported webserver working mode: %s': 'Веб-сервер знаходиться в режимі, який не підтримується: %s',
|
||||
'update': 'оновити',
|
||||
'update all languages': 'оновити всі переклади',
|
||||
'Update:': 'Поновити:',
|
||||
'Upgrade': 'Оновити',
|
||||
'upgrade now': 'оновитись зараз',
|
||||
'upgrade_web2py': 'оновити web2py',
|
||||
'upload': 'завантажити',
|
||||
'Upload a package:': 'Завантажити пакет:',
|
||||
'Upload and install packed application': 'Завантажити та встановити запакований додаток',
|
||||
'upload file:': 'завантажити файл:',
|
||||
'upload plugin file:': 'завантажити файл втулки:',
|
||||
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Для створення складних запитів використовуйте (...)&(...) замість AND, (...)|(...) замість OR, та ~(...) замість NOT.',
|
||||
'user': 'користувач',
|
||||
'Using the shell may lock the database to other users of this app.': 'Використання оболонки може заблокувати базу даних від сумісного використання іншими користувачами цього додатку.',
|
||||
'value not allowed': 'недопустиме значення',
|
||||
'variables': 'змінні',
|
||||
'Version': 'Версія',
|
||||
'Version %s.%s.%s (%s) %s': 'Версія %s.%s.%s (%s) %s',
|
||||
'Versioning': 'Контроль версій',
|
||||
'view': 'перегляд',
|
||||
'Views': 'Відображення (Views)',
|
||||
'views': 'відображення',
|
||||
'web2py Debugger': 'Ладнач web2py',
|
||||
'web2py Recent Tweets': 'Останні твіти web2py',
|
||||
'WARNING:': 'ПОПЕРЕДЖЕННЯ:',
|
||||
'Web Framework': 'Web Framework',
|
||||
'web2py apps to deploy': 'Готові до розгортання додатки web2py',
|
||||
'web2py Debugger': 'Ладнач web2py',
|
||||
'web2py downgrade': 'повернення на попередню версію web2py',
|
||||
'web2py is up to date': 'web2py оновлено до актуальної версії',
|
||||
'web2py online debugger': 'оперативний ладнач (online debugger) web2py',
|
||||
'web2py Recent Tweets': 'Останні твіти web2py',
|
||||
'web2py upgrade': 'оновлення web2py',
|
||||
'web2py upgraded; please restart it': 'web2py оновлено; будь-ласка перезапустіть його',
|
||||
'Wrap with Abbreviation': 'Загорнути з абревіатурою',
|
||||
'WSGI reference name': "ім'я посилання WSGI",
|
||||
'YES': 'ТАК',
|
||||
'You can also set and remove breakpoint in the edit window, using the Toggle Breakpoint button': 'Ви також можете встановлювати/вилучати точки зупинок під час редагування першоджерел (sources), використовуючи кнопку "+/- точку зупинки"',
|
||||
'You have one more login attempt before you are locked out': 'У вас є ще одна спроба перед тим, як вхід буде заблоковано',
|
||||
'you must specify a name for the uploaded application': "ви повинні вказати ім'я додатка, перед ти, як завантажити його",
|
||||
'You need to set up and reach a': 'Треба встановити та досягнути',
|
||||
'Your application will be blocked until you click an action button (next, step, continue, etc.)': 'Ваш додаток буде заблоковано, поки ви не клацнете по одній з кнопок керування ("наступний", "крок", "продовжити", та ін.)',
|
||||
'Your can inspect variables using the console bellow': 'Ви можете досліджувати змінні, використовуючи інтерактивну консоль',
|
||||
}
|
||||
|
||||
@@ -1,11 +1,14 @@
|
||||
# coding: utf8
|
||||
{
|
||||
'!langcode!': 'zh-tw',
|
||||
'!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 rows deleted': '已刪除 %s 筆',
|
||||
'%s rows updated': '已更新 %s 筆',
|
||||
'%s %%{row} deleted': '已刪除 %s 筆',
|
||||
'%s %%{row} updated': '已更新 %s 筆',
|
||||
'(something like "it-it")': '(格式類似 "zh-tw")',
|
||||
'@markmin\x01Searching: **%s** %%{file}': 'Searching: **%s** files',
|
||||
'A new version of web2py is available': '新版的 web2py 已發行',
|
||||
'A new version of web2py is available: %s': '新版的 web2py 已發行: %s',
|
||||
'ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.': '注意: 登入管理帳號需要安全連線(HTTPS)或是在本機連線(localhost).',
|
||||
@@ -27,13 +30,17 @@
|
||||
'Cannot compile: there are errors in your app. Debug it, correct errors and try again.': '無法編譯:應用程式中含有錯誤,請除錯後再試一次.',
|
||||
'Cannot compile: there are errors in your app:': '無法編譯: 在你的應用程式存在錯誤:',
|
||||
'Change Password': '變更密碼',
|
||||
'Change admin password': 'change admin password',
|
||||
'Check to delete': '打勾代表刪除',
|
||||
'Check to delete:': '打勾代表刪除:',
|
||||
'Checking for upgrades...': '檢查新版本中...',
|
||||
'Clean': '清除',
|
||||
'Client IP': '客戶端網址(IP)',
|
||||
'Compile': '編譯',
|
||||
'Controller': '控件',
|
||||
'Controllers': '控件',
|
||||
'Copyright': '版權所有',
|
||||
'Create': '創建',
|
||||
'Create new simple application': '創建應用程式',
|
||||
'Current request': '目前網路資料要求(request)',
|
||||
'Current response': '目前網路資料回應(response)',
|
||||
@@ -59,14 +66,17 @@
|
||||
'Editing file "%s"': '編輯檔案"%s"',
|
||||
'Enterprise Web Framework': '企業網站平台',
|
||||
'Error logs for "%(app)s"': '"%(app)s"的錯誤紀錄',
|
||||
'Errors': '錯誤紀錄',
|
||||
'Exception instance attributes': 'Exception instance attributes',
|
||||
'First name': '名',
|
||||
'Functions with no doctests will result in [passed] tests.': '沒有 doctests 的函式會顯示 [passed].',
|
||||
'Group ID': '群組編號',
|
||||
'Hello World': '嗨! 世界',
|
||||
'Help': '說明檔',
|
||||
'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': '匯入/匯出',
|
||||
'Index': '索引',
|
||||
'Install': '安裝',
|
||||
'Installed applications': '已安裝應用程式',
|
||||
'Internal State': '內部狀態',
|
||||
'Invalid Query': '不合法的查詢',
|
||||
@@ -92,7 +102,10 @@
|
||||
'No databases in this application': '這應用程式不含資料庫',
|
||||
'Origin': '原文',
|
||||
'Original/Translation': '原文/翻譯',
|
||||
'Overwrite installed app': '覆蓋已安裝的應用程式',
|
||||
'PAM authenticated user, cannot change password here': 'PAM 授權使用者, 無法在此變更密碼',
|
||||
'Pack all': '全部打包',
|
||||
'Pack compiled': '打包已編譯資料',
|
||||
'Password': '密碼',
|
||||
"Password fields don't match": '密碼欄不匹配',
|
||||
'Peeking at file': '選個文件',
|
||||
@@ -104,12 +117,14 @@
|
||||
'Register': '註冊',
|
||||
'Registration key': '註冊金鑰',
|
||||
'Remember me (for 30 days)': '記住帳號(30 天)',
|
||||
'Remove compiled': '編譯檔案已移除',
|
||||
'Reset Password key': '重設密碼',
|
||||
'Resolve Conflict file': '解決衝突檔案',
|
||||
'Role': '角色',
|
||||
'Rows in table': '在資料表裏的資料',
|
||||
'Rows selected': '筆資料被選擇',
|
||||
'Saved file hash:': '檔案雜湊值已紀錄:',
|
||||
'Site': '網站',
|
||||
'Static files': '靜態檔案',
|
||||
'Stylesheet': '網頁風格檔',
|
||||
'Submit': '傳送',
|
||||
@@ -133,6 +148,7 @@
|
||||
'Unable to download app': '無法下載應用程式',
|
||||
'Unable to download app because:': '無法下載應用程式因為:',
|
||||
'Unable to download because': '因為下列原因無法下載:',
|
||||
'Uninstall': '解除安裝',
|
||||
'Update:': '更新:',
|
||||
'Upload & install packed application': '上傳並安裝已打包的應用程式',
|
||||
'Upload existing application': '更新存在的應用程式',
|
||||
@@ -147,7 +163,6 @@
|
||||
'Welcome %s': '歡迎 %s',
|
||||
'Welcome to web2py': '歡迎使用 web2py',
|
||||
'YES': '是',
|
||||
'About': '關於',
|
||||
'additional code for your application': '應用程式額外的程式碼',
|
||||
'admin disabled because no admin password': '管理介面關閉原因是沒有設定管理員密碼 ',
|
||||
'admin disabled because not supported on google app engine': '管理介面關閉原因是不支援在google apps engine環境下運作',
|
||||
@@ -166,18 +181,14 @@
|
||||
'cache, errors and sessions cleaned': '快取記憶體,錯誤紀錄,連線紀錄已清除',
|
||||
'cannot create file': '無法創建檔案',
|
||||
'cannot upload file "%(filename)s"': '無法上傳檔案 "%(filename)s"',
|
||||
'Change admin password': 'change admin password',
|
||||
'change_password': '變更密碼',
|
||||
'check all': '全選',
|
||||
'Clean': '清除',
|
||||
'click here for online examples': '點此處進入線上範例',
|
||||
'click here for the administrative interface': '點此處進入管理介面',
|
||||
'click to check for upgrades': '點擊打勾以便升級',
|
||||
'code': 'code',
|
||||
'Compile': '編譯',
|
||||
'compiled application removed': '已移除已編譯的應用程式',
|
||||
'controllers': '控件',
|
||||
'Create': '創建',
|
||||
'create file with filename:': '創建檔案:',
|
||||
'create new application:': '創建新應用程式:',
|
||||
'created by': '創建自',
|
||||
@@ -197,11 +208,9 @@
|
||||
'design': '設計',
|
||||
'direction: ltr': 'direction: ltr',
|
||||
'done!': '完成!',
|
||||
'Edit': '編輯',
|
||||
'edit controller': '編輯控件',
|
||||
'edit views:': '編輯視圖',
|
||||
'edit_language': '編輯語言檔',
|
||||
'Errors': '錯誤紀錄',
|
||||
'export as csv file': '以逗號分隔檔(csv)格式匯出',
|
||||
'exposes': '外顯',
|
||||
'extends': '擴展',
|
||||
@@ -214,13 +223,11 @@
|
||||
'file does not exist': '檔案不存在',
|
||||
'file saved on %(time)s': '檔案已於 %(time)s 儲存',
|
||||
'file saved on %s': '檔案在 %s 已儲存',
|
||||
'Help': '說明檔',
|
||||
'htmledit': 'html編輯',
|
||||
'includes': '包含',
|
||||
'index': '索引',
|
||||
'insert new': '插入新資料',
|
||||
'insert new %s': '插入新資料 %s',
|
||||
'Install': '安裝',
|
||||
'internal error': '內部錯誤',
|
||||
'invalid password': '密碼錯誤',
|
||||
'invalid request': '不合法的網路要求(request)',
|
||||
@@ -229,7 +236,6 @@
|
||||
'languages': '語言檔',
|
||||
'loading...': '載入中...',
|
||||
'login': '登入',
|
||||
'Logout': '登出',
|
||||
'merge': '合併',
|
||||
'models': '資料庫模組',
|
||||
'modules': '程式模組',
|
||||
@@ -240,9 +246,6 @@
|
||||
'no match': '無法匹配',
|
||||
'or import from csv file': '或是從逗號分隔檔(CSV)匯入',
|
||||
'or provide app url:': '或是提供應用程式的安裝網址:',
|
||||
'Overwrite installed app': '覆蓋已安裝的應用程式',
|
||||
'Pack all': '全部打包',
|
||||
'Pack compiled': '打包已編譯資料',
|
||||
'pack plugin': '打包插件',
|
||||
'password changed': '密碼已變更',
|
||||
'peek': '選取',
|
||||
@@ -253,7 +256,6 @@
|
||||
'record does not exist': '紀錄不存在',
|
||||
'record id': '紀錄編號',
|
||||
'register': '註冊',
|
||||
'Remove compiled': '編譯檔案已移除',
|
||||
'resolve': '解決',
|
||||
'restore': '回存',
|
||||
'revert': '反向恢復',
|
||||
@@ -261,7 +263,6 @@
|
||||
'selected': '已選擇',
|
||||
'session expired': '連線(session)已過時',
|
||||
'shell': '命令列操作介面',
|
||||
'Site': '網站',
|
||||
'some files could not be removed': '部份檔案無法移除',
|
||||
'state': '狀態',
|
||||
'static': '靜態檔案',
|
||||
@@ -284,7 +285,6 @@
|
||||
'unable to uninstall "%s"': '無法移除安裝 "%s"',
|
||||
'unable to upgrade because "%s"': '無法升級因為 "%s"',
|
||||
'uncheck all': '全不選',
|
||||
'Uninstall': '解除安裝',
|
||||
'update': '更新',
|
||||
'update all languages': '將程式中待翻譯語句更新到所有的語言檔',
|
||||
'upgrade web2py now': 'upgrade web2py now',
|
||||
@@ -300,5 +300,3 @@
|
||||
'web2py is up to date': 'web2py 已經是最新版',
|
||||
'web2py upgraded; please restart it': '已升級 web2py ; 請重新啟動',
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,15 +1,18 @@
|
||||
# coding: utf8
|
||||
{
|
||||
'!langcode!': 'zh-cn',
|
||||
'!langname!': '中文',
|
||||
'"browse"': '游览',
|
||||
'"save"': '"保存"',
|
||||
'"submit"': '"提交"',
|
||||
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"更新"是可配置项 如 "field1=\'newvalue\'",你无法在JOIN 中更新或删除',
|
||||
'%Y-%m-%d': '%Y-%m-%d',
|
||||
'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
|
||||
'%s rows deleted': '%s 行已删',
|
||||
'%s rows updated': '%s 行更新',
|
||||
'%s %%{row} deleted': '%s 行已删',
|
||||
'%s %%{row} updated': '%s 行更新',
|
||||
'(requires internet access)': '(requires internet access)',
|
||||
'(something like "it-it")': '(就酱 "it-it")',
|
||||
'@markmin\x01Searching: **%s** %%{file}': 'Searching: **%s** files',
|
||||
'A new version of web2py is available': '新版本web2py已经可用',
|
||||
'A new version of web2py is available: %s': '新版本web2py已经可用: %s',
|
||||
'ATTENTION: Login requires a secure (HTTPS) connection or running on localhost.': '',
|
||||
@@ -24,6 +27,7 @@
|
||||
'Application name:': 'Application name:',
|
||||
'Are you sure you want to delete file "%s"?': '你真想删除文件"%s"?',
|
||||
'Are you sure you want to delete plugin "%s"?': 'Are you sure you want to delete 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"': '你真确定要卸载应用 "%s"',
|
||||
'Are you sure you want to uninstall application "%s"?': '你真确定要卸载应用 "%s" ?',
|
||||
'Are you sure you want to upgrade web2py now?': 'Are you sure you want to upgrade web2py now?',
|
||||
@@ -32,23 +36,33 @@
|
||||
'Cannot compile: there are errors in your app. Debug it, correct errors and try again.': '无法编译: 应用中有错误,请修订后再试.',
|
||||
'Cannot compile: there are errors in your app:': 'Cannot compile: there are errors in your app:',
|
||||
'Change Password': '修改密码',
|
||||
'Change admin password': 'change admin password',
|
||||
'Check for upgrades': 'check for upgrades',
|
||||
'Check to delete': '检验删除',
|
||||
'Checking for upgrades...': '是否有升级版本检查ing...',
|
||||
'Clean': '清除',
|
||||
'Client IP': '客户端IP',
|
||||
'Compile': '编译',
|
||||
'Controllers': '控制器s',
|
||||
'Create': 'create',
|
||||
'Create new simple application': '创建一个新应用',
|
||||
'Current request': '当前请求',
|
||||
'Current response': '当前返回',
|
||||
'Current session': '当前会话',
|
||||
'DESIGN': '设计',
|
||||
'Date and Time': '时间日期',
|
||||
'Debug': 'Debug',
|
||||
'Delete': '删除',
|
||||
'Delete:': '删除:',
|
||||
'Deploy': 'deploy',
|
||||
'Deploy on Google App Engine': '部署到GAE',
|
||||
'Deploy to OpenShift': 'Deploy to OpenShift',
|
||||
'Description': '描述',
|
||||
'Design for': '设计:',
|
||||
'Disable': 'Disable',
|
||||
'E-mail': '邮箱:',
|
||||
'EDIT': '编辑',
|
||||
'Edit': '修改',
|
||||
'Edit Profile': '修订配置',
|
||||
'Edit application': '修订应用',
|
||||
'Edit current record': '修订当前记录',
|
||||
@@ -57,13 +71,17 @@
|
||||
'Editing file "%s"': '修订文件 %s',
|
||||
'Enterprise Web Framework': '强悍的网络开发框架',
|
||||
'Error logs for "%(app)s"': '"%(app)s" 的错误日志',
|
||||
'Errors': '错误',
|
||||
'Exception instance attributes': 'Exception instance attributes',
|
||||
'First name': '姓',
|
||||
'Functions with no doctests will result in [passed] tests.': '',
|
||||
'Get from URL:': 'Get from URL:',
|
||||
'Group ID': '组ID',
|
||||
'Hello World': '道可道,非常道;名可名,非常名',
|
||||
'Help': '帮助',
|
||||
'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': '导入/导出',
|
||||
'Install': 'install',
|
||||
'Installed applications': '已安装的应用',
|
||||
'Internal State': '内部状态',
|
||||
'Invalid Query': '无效查询',
|
||||
@@ -88,7 +106,10 @@
|
||||
'No databases in this application': '这应用没有数据库',
|
||||
'Origin': '起源',
|
||||
'Original/Translation': '原始文件/翻译文件',
|
||||
'Overwrite installed app': 'overwrite installed app',
|
||||
'PAM authenticated user, cannot change password here': 'PAM authenticated user, cannot change password here',
|
||||
'Pack all': '全部打包',
|
||||
'Pack compiled': '包编译完',
|
||||
'Password': '密码',
|
||||
'Peeking at file': '选个文件',
|
||||
'Plugin "%s" in application': 'Plugin "%s" in application',
|
||||
@@ -98,11 +119,16 @@
|
||||
'Record ID': '记录ID',
|
||||
'Register': '注册',
|
||||
'Registration key': '注册密匙',
|
||||
'Reload routes': 'Reload routes',
|
||||
'Remove compiled': '已移除',
|
||||
'Resolve Conflict file': '解决冲突文件',
|
||||
'Role': '角色',
|
||||
'Rows in table': '表行',
|
||||
'Rows selected': '行选择',
|
||||
'Running on %s': 'Running on %s',
|
||||
'Saved file hash:': '已存文件Hash:',
|
||||
'Site': '总站',
|
||||
'Start wizard': 'start wizard',
|
||||
'Static files': '静态文件',
|
||||
'Sure you want to delete this object?': '真的要删除这个对象?',
|
||||
'TM': '',
|
||||
@@ -124,9 +150,11 @@
|
||||
'Unable to download app': '无法下载应用',
|
||||
'Unable to download app because:': 'Unable to download app because:',
|
||||
'Unable to download because': 'Unable to download because',
|
||||
'Uninstall': '卸载',
|
||||
'Update:': '更新:',
|
||||
'Upload & install packed application': 'Upload & install packed application',
|
||||
'Upload a package:': 'Upload a package:',
|
||||
'Upload and install packed application': 'Upload and install packed application',
|
||||
'Upload existing application': '上传已有应用',
|
||||
'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.',
|
||||
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': '',
|
||||
@@ -136,7 +164,6 @@
|
||||
'Views': '视图',
|
||||
'Welcome to web2py': '欢迎使用web2py',
|
||||
'YES': '是',
|
||||
'About': '关于',
|
||||
'additional code for your application': '给你的应用附加代码',
|
||||
'admin disabled because no admin password': '管理员需要设定密码,否则无法管理',
|
||||
'admin disabled because not supported on google app engine': '未支持GAE,无法管理',
|
||||
@@ -155,18 +182,13 @@
|
||||
'cache, errors and sessions cleaned': '缓存、错误、sesiones已被清空',
|
||||
'cannot create file': '无法创建文件',
|
||||
'cannot upload file "%(filename)s"': '无法上传文件 "%(filename)s"',
|
||||
'Change admin password': 'change admin password',
|
||||
'check all': '检查所有',
|
||||
'Check for upgrades': 'check for upgrades',
|
||||
'Clean': '清除',
|
||||
'click here for online examples': '猛击此处,查看在线实例',
|
||||
'click here for the administrative interface': '猛击此处,进入管理界面',
|
||||
'click to check for upgrades': '猛击查看是否有升级版本',
|
||||
'code': 'code',
|
||||
'Compile': '编译',
|
||||
'compiled application removed': '已编译应用已移走',
|
||||
'controllers': '控制器',
|
||||
'Create': 'create',
|
||||
'create file with filename:': '创建文件用这名:',
|
||||
'create new application:': '创建新应用:',
|
||||
'created by': '创建自',
|
||||
@@ -183,14 +205,11 @@
|
||||
'delete': '删除',
|
||||
'delete all checked': '删除所有选择的',
|
||||
'delete plugin': 'delete plugin',
|
||||
'Deploy': 'deploy',
|
||||
'design': '设计',
|
||||
'direction: ltr': 'direction: ltr',
|
||||
'done!': '搞定!',
|
||||
'Edit': '修改',
|
||||
'edit controller': '修订控制器',
|
||||
'edit views:': 'edit views:',
|
||||
'Errors': '错误',
|
||||
'export as csv file': '导出为CSV文件',
|
||||
'exposes': '暴露',
|
||||
'extends': '扩展',
|
||||
@@ -205,12 +224,10 @@
|
||||
'file does not exist': '文件并不存在',
|
||||
'file saved on %(time)s': '文件保存于 %(time)s',
|
||||
'file saved on %s': '文件保存在 %s',
|
||||
'Help': '帮助',
|
||||
'htmledit': 'html编辑',
|
||||
'includes': '包含',
|
||||
'insert new': '新插入',
|
||||
'insert new %s': '新插入 %s',
|
||||
'Install': 'install',
|
||||
'internal error': '内部错误',
|
||||
'invalid password': '无效密码',
|
||||
'invalid request': '无效请求',
|
||||
@@ -220,7 +237,6 @@
|
||||
'languages updated': '语言已被刷新',
|
||||
'loading...': '载入中...',
|
||||
'login': '登录',
|
||||
'Logout': '注销',
|
||||
'merge': '合并',
|
||||
'models': '模型s',
|
||||
'modules': '模块s',
|
||||
@@ -232,9 +248,6 @@
|
||||
'or import from csv file': '或者,从csv文件导入',
|
||||
'or provide app url:': 'or provide app url:',
|
||||
'or provide application url:': '或者,提供应用所在地址链接:',
|
||||
'Overwrite installed app': 'overwrite installed app',
|
||||
'Pack all': '全部打包',
|
||||
'Pack compiled': '包编译完',
|
||||
'pack plugin': 'pack plugin',
|
||||
'password changed': 'password changed',
|
||||
'plugin "%(plugin)s" deleted': 'plugin "%(plugin)s" deleted',
|
||||
@@ -242,16 +255,13 @@
|
||||
'record': 'record',
|
||||
'record does not exist': '记录并不存在',
|
||||
'record id': '记录ID',
|
||||
'Remove compiled': '已移除',
|
||||
'restore': '重存',
|
||||
'revert': '恢复',
|
||||
'save': '保存',
|
||||
'selected': '已选',
|
||||
'session expired': '会话过期',
|
||||
'shell': '',
|
||||
'Site': '总站',
|
||||
'some files could not be removed': '有些文件无法被移除',
|
||||
'Start wizard': 'start wizard',
|
||||
'state': '状态',
|
||||
'static': '静态文件',
|
||||
'submit': '提交',
|
||||
@@ -273,7 +283,6 @@
|
||||
'unable to uninstall "%s"': '无法卸载 "%s"',
|
||||
'unable to upgrade because "%s"': 'unable to upgrade because "%s"',
|
||||
'uncheck all': '反选全部',
|
||||
'Uninstall': '卸载',
|
||||
'update': '更新',
|
||||
'update all languages': '更新所有语言',
|
||||
'upgrade web2py now': 'upgrade web2py now',
|
||||
@@ -288,5 +297,3 @@
|
||||
'web2py is up to date': 'web2py现在已经是最新的版本了',
|
||||
'web2py upgraded; please restart it': 'web2py upgraded; please restart it',
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -152,5 +152,3 @@ if request.controller=='appadmin' and DEMO_MODE:
|
||||
session.flash = 'Appadmin disabled in demo mode'
|
||||
redirect(URL('default','sites'))
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -9,12 +9,12 @@ response.title = '%s %s' % (_f, '/'.join(request.args))
|
||||
response.subtitle = 'admin'
|
||||
response.menu = [(T('Site'), _f == 'site', URL(_a,'default','site'))]
|
||||
|
||||
if request.args:
|
||||
_t = request.args[0]
|
||||
if request.vars.app or request.args:
|
||||
_t = request.vars.app or request.args[0]
|
||||
response.menu.append((T('Edit'), _c == 'default' and _f == 'design',
|
||||
URL(_a,'default','design',args=_t)))
|
||||
response.menu.append((T('About'), _c == 'default' and _f == 'about',
|
||||
URL(_a,'default','about',args=_t)))
|
||||
URL(_a,'default','about',args=_t,)))
|
||||
response.menu.append((T('Errors'), _c == 'default' and _f == 'errors',
|
||||
URL(_a,'default','errors',args=_t)))
|
||||
response.menu.append((T('Versioning'),
|
||||
|
||||
@@ -1245,3 +1245,6 @@ color: #222;
|
||||
}
|
||||
.ie9 #query_panel {padding-bottom:2px;}
|
||||
|
||||
.error, .error a {color:red}
|
||||
.pluralsform thead td {font-weight:bold; font-size:1.2em; padding-bottom:5px}
|
||||
.pluralsform td {padding-left:5px}
|
||||
|
||||
@@ -0,0 +1,304 @@
|
||||
/** these MUST stay **/
|
||||
body { margin: 0; padding:0; border: 0; }
|
||||
a { text-decoration:none; white-space: nowrap;}
|
||||
a:hover {text-decoration: underline}
|
||||
a.button {text-decoration: none}
|
||||
h1,h2,h3,h4,h5,h6 {margin: 0.5em 0 0.25em 0; display: block; font-family: Helvetica;}
|
||||
h1 { font-size: 4.00em;}
|
||||
h2 { font-size: 3.00em;}
|
||||
h3 { font-size: 2.00em;}
|
||||
h4 { font-size: 1.50em;}
|
||||
h5 { font-size: 1.25em;}
|
||||
h6 { font-size: 1.12em;}
|
||||
right { float:right; text-align: right; }
|
||||
left { float:left; text-align: left; }
|
||||
center { width:100; text-align: center; vertical-align:middle;}
|
||||
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.5em 0 0.5em 0 }
|
||||
p {text-align: justify }
|
||||
ol, ul { padding-left: 30px }
|
||||
li { margin-bottom: 0.5em; }
|
||||
span, input, select, textarea, button, label, a { display: inline }
|
||||
img { border: 0; }
|
||||
blockquote, blockquote p, p blockquote { font-style: italic; margin: 0.5em 30px 0.5em 30px; font-size: 0.9em}
|
||||
i, em { font-style: italic; }
|
||||
strong { font-weight: bold; }
|
||||
small { font-size: 0.8em; }
|
||||
textarea { width: 100%; }
|
||||
code { font-family: Courier;}
|
||||
video { width:400px; }
|
||||
audio { width:200px; }
|
||||
input[type=text], input[type=password], select { width: 300px; margin-right: 5px }
|
||||
ul { list-style-type: none; margin: 0px; padding: 0px; }
|
||||
.hidden {display:none;visibility:visible}
|
||||
/** end **/
|
||||
|
||||
/* Sticky footer begin */
|
||||
html, body {
|
||||
height: 100%;
|
||||
}
|
||||
.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;
|
||||
}
|
||||
|
||||
.footer, .push {
|
||||
height: 6em;
|
||||
padding: 1em 0;
|
||||
clear: both;
|
||||
}
|
||||
|
||||
.footer-content {position: relative; bottom: -4em; width: 100%;}
|
||||
|
||||
.auth_navbar {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
/* Sticky footer end */
|
||||
|
||||
.footer {
|
||||
border-top: 1px #DEDEDE solid;
|
||||
}
|
||||
.header {
|
||||
// background: <fill here for header image>;
|
||||
}
|
||||
|
||||
|
||||
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; }
|
||||
td.w2p_fl { text-align:right; }
|
||||
td.w2p_fl, td.w2p_fw {padding-right: 7px;}
|
||||
td.w2p_fl, td.w2p_fc { padding-top: 4px; }
|
||||
|
||||
/* tr#submit_record__row {border-top: 1px solid #E5E5E5;} */
|
||||
#submit_record__row td {padding-top: .5em;}
|
||||
|
||||
/* Fix */
|
||||
#auth_user_remember__row label {display: inline;}
|
||||
#web2py_user_form td { vertical-align:top; }
|
||||
|
||||
/*********** web2py specific ***********/
|
||||
div.flash {
|
||||
font-weight: bold;
|
||||
display: none;
|
||||
position: fixed;
|
||||
padding: 10px;
|
||||
top: 48px;
|
||||
right: 50px;
|
||||
min-width: 280px;
|
||||
opacity: 0.85;
|
||||
margin: 0px 0px 10px 10px;
|
||||
color: #fff;
|
||||
vertical-align: middle;
|
||||
cursor: pointer;
|
||||
background: #000;
|
||||
border: 2px solid #fff;
|
||||
border-radius: 5px;
|
||||
-moz-border-radius: 5px;
|
||||
-webkit-border-radius: 5px;
|
||||
z-index: 2;
|
||||
}
|
||||
div.flash {z-index:2000;}
|
||||
|
||||
div.error_wrapper { display: block; }
|
||||
div.error {
|
||||
background-color: red;
|
||||
color: white;
|
||||
padding: 3px;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.topbar {
|
||||
padding: 10px 0;
|
||||
width:100%;
|
||||
color: #959595;
|
||||
vertical-align: middle;
|
||||
padding: auto;
|
||||
background-image: -khtml-gradient(linear, left top, left bottom, from(#333333), to(#222222));
|
||||
background-image: -moz-linear-gradient(top, #333333, #222222);
|
||||
background-image: -ms-linear-gradient(top, #333333, #222222);
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #333333), color-stop(100%, #222222));
|
||||
background-image: -webkit-linear-gradient(top, #333333, #222222);
|
||||
background-image: -o-linear-gradient(top, #333333, #222222);
|
||||
background-image: linear-gradient(top, #333333, #222222);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);
|
||||
-webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);
|
||||
-moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.topbar a {
|
||||
color: #e1e1e1;
|
||||
}
|
||||
|
||||
#navbar {float: right; padding: 5px; /* same as superfish */}
|
||||
|
||||
.right {
|
||||
width:100%;
|
||||
text-align: right;
|
||||
float: right;
|
||||
}
|
||||
|
||||
.statusbar {
|
||||
background-color: #F5F5F5;
|
||||
margin-top: 1em;
|
||||
margin-bottom: 1em;
|
||||
padding: .5em 1em;
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 5px;
|
||||
-moz-border-radius: 5px;
|
||||
-webkit-border-radius: 5px;
|
||||
}
|
||||
|
||||
.breadcrumbs { float: left; }
|
||||
|
||||
.copyright {float: left;}
|
||||
#poweredBy {float: right;}
|
||||
|
||||
/* #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
|
||||
*
|
||||
* The default style for SQLFORM.grid even using jquery-iu or another ui framework
|
||||
* will look better with the declarations below
|
||||
* if needed to remove base.css consider keeping these following lines in some css file.
|
||||
*/
|
||||
// .web2py_table { border: 1px solid #ccc; }
|
||||
.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 thead th, .web2py_grid tfoot td {
|
||||
background-color:#EAEAEA;
|
||||
padding: 10px 5px 10px 5px;
|
||||
}
|
||||
|
||||
.web2py_grid tr.odd {background-color: #F9F9F9;}
|
||||
.web2py_grid tr:hover {background-color: #F5F5F5; }
|
||||
|
||||
/*
|
||||
.web2py_breadcrumbs a {
|
||||
line-height: 20px; margin-right: 5px; display: inline-block;
|
||||
padding: 3px 5px 3px 5px;
|
||||
font-family: 'lucida grande', tahoma, verdana, arial, sans-serif;
|
||||
color: #3C3C3D;
|
||||
text-shadow: 1px 1px 0 #FFFFFF;
|
||||
white-space: nowrap; overflow: visible; cursor: pointer;
|
||||
background:#ECECEC;
|
||||
border: 1px solid #CACACA;
|
||||
-webkit-border-radius: 2px; -moz-border-radius: 2px;
|
||||
-webkit-background-clip: padding-box; border-radius: 2px;
|
||||
outline: none; position: relative; zoom: 1; *display: inline;
|
||||
}
|
||||
*/
|
||||
|
||||
.web2py_console form {
|
||||
width:100%;
|
||||
}
|
||||
|
||||
|
||||
.web2py_search_actions{
|
||||
float:left;
|
||||
text-align:left;
|
||||
}
|
||||
|
||||
.web2py_grid .row_buttons {
|
||||
min-height:25px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
.web2py_grid .row_buttons a {
|
||||
margin: 3px;
|
||||
}
|
||||
|
||||
.web2py_search_actions {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.web2py_grid .row_buttons a,
|
||||
.web2py_paginator ul li a,
|
||||
.web2py_search_actions a,
|
||||
.web2py_console input[type=submit],
|
||||
.web2py_console input[type=button],
|
||||
.web2py_console button {
|
||||
line-height: 20px;
|
||||
margin-right: 5px; display: inline-block;
|
||||
padding: 3px 5px 3px 5px;
|
||||
}
|
||||
|
||||
.web2py_counter {
|
||||
margin-top: 5px;
|
||||
margin-right:5px;
|
||||
width:35%;
|
||||
float:right;
|
||||
text-align:right;
|
||||
}
|
||||
|
||||
/*Fix firefox problem*/
|
||||
.web2py_table {clear: both; display: block;}
|
||||
|
||||
.web2py_paginator {
|
||||
padding: 5px;
|
||||
text-align:right;
|
||||
background-color: #f2f2f2;
|
||||
|
||||
}
|
||||
.web2py_paginator ul {
|
||||
list-style-type: none;
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
.web2py_paginator ul li {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
.web2py_paginator .current {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#w2p_query_panel {}
|
||||
|
||||
.web2py_breadcrumbs ul {
|
||||
list-style: none;
|
||||
margin-bottom: 18px;
|
||||
}
|
||||
|
||||
.web2py_breadcrumbs ul li {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.ie9 #query_panel {padding-bottom:2px;}
|
||||
@@ -63,7 +63,7 @@
|
||||
<br/><br/><h3>{{=T("Import/Export")}}</h3><br/>
|
||||
[ <a href="{{=URL('csv',args=request.args[0],vars=dict(query=query))}}">{{=T("export as csv file")}}</a> ]
|
||||
{{if table:}}
|
||||
{{=FORM(str(T('or import from csv file'))+" ",INPUT(_type='file',_name='csvfile'),INPUT(_type='hidden',_value=table,_name='table'),INPUT(_type='submit',_value='import'))}}
|
||||
{{=FORM(str(T('or import from csv file'))+" ",INPUT(_type='file',_name='csvfile'),INPUT(_type='hidden',_value=table,_name='table'),INPUT(_type='submit',_value=T('import')))}}
|
||||
{{pass}}
|
||||
|
||||
|
||||
|
||||
@@ -2,36 +2,43 @@
|
||||
{{
|
||||
def all(items):
|
||||
return reduce(lambda a,b:a and b,items,True)
|
||||
def peekfile(path,file):
|
||||
return A(file.replace('\\\\','/'),_href=URL('peek', args=(app, path, file)))
|
||||
def editfile(path,file):
|
||||
return A(SPAN(T('Edit')),_class='button editbutton',_href=URL('edit', args=(app, path, file)))
|
||||
def peekfile(path,file,vars={},title=None):
|
||||
args=(path,file) if 'app' in vars else (app,path,file)
|
||||
return A(file.replace('\\\\','/'),_title=title,_href=URL('peek', args=args, vars=vars))
|
||||
def editfile(path,file,vars={}):
|
||||
args=(path,file) if 'app' in vars else (app,path,file)
|
||||
return A(SPAN(T('Edit')),_class='button editbutton',_href=URL('edit', args=args, vars=vars))
|
||||
def testfile(path,file):
|
||||
return A(TAG[''](IMG(_src=URL('static', 'images/test_icon.png'), _alt=T('test')), SPAN(T("Run tests in this file (to run all files, you may also use the button labelled 'test')"))), _class='icon test tooltip',_href=URL('test', args=(app, file)))
|
||||
def editlanguagefile(path,file):
|
||||
return A(SPAN(T('Edit')),_class='button editbutton',_href=URL('edit_language', args=(app, path, file)))
|
||||
def file_upload_form(location):
|
||||
def editlanguagefile(path,file,vars={}):
|
||||
return A(SPAN(T('Edit')),_class='button editbutton',_href=URL('edit_language', args=(app, path, file), vars=vars))
|
||||
def editpluralsfile(path,file,vars={}):
|
||||
return A(SPAN(T('Edit')),_class='button editbutton',_href=URL('edit_plurals', args=(app, path, file), vars=vars))
|
||||
def file_upload_form(location, anchor=None):
|
||||
form=FORM(T("upload file:")," ",
|
||||
INPUT(_type="file",_name="file")," ",T("and rename it:")," ",
|
||||
INPUT(_type="text",_name="filename",requires=IS_NOT_EMPTY),
|
||||
INPUT(_type="hidden",_name="location",_value=location),
|
||||
INPUT(_type="hidden",_name="sender",_value=URL('design',args=app)),
|
||||
INPUT(_type="hidden",_name="sender",_value=URL('design',args=app, anchor=anchor)),
|
||||
INPUT(_type="submit",_value=T("upload")),_action=URL('upload_file'))
|
||||
return form
|
||||
def file_create_form(location):
|
||||
def file_create_form(location, anchor=None):
|
||||
form=FORM(T("create file with filename:")," ",
|
||||
INPUT(_type="text",_name="filename",requires=IS_NOT_EMPTY),
|
||||
INPUT(_type="hidden",_name="location",_value=location),
|
||||
INPUT(_type="hidden",_name="sender",_value=URL('design',args=app)),
|
||||
INPUT(_type="hidden",_name="id",_value=anchor),
|
||||
INPUT(_type="submit",_value=T("Create")),_action=URL('create_file'))
|
||||
return form
|
||||
def upload_plugin_form(app):
|
||||
def upload_plugin_form(app, anchor=None):
|
||||
form=FORM(T("upload plugin file:")," ",
|
||||
INPUT(_type="file",_name="pluginfile"),
|
||||
INPUT(_type="hidden",_name="id",_value=anchor),
|
||||
INPUT(_type="submit",_value=T("upload")))
|
||||
return form
|
||||
def deletefile(arglist):
|
||||
return A(TAG[''](IMG(_src=URL('static', 'images/delete_icon.png')), SPAN(T('Delete this file (you will be asked to confirm deletion)'))), _class='icon delete tooltip', _href=URL('delete',args=arglist,vars=dict(sender=request.function+'/'+app)))
|
||||
def deletefile(arglist, vars={}):
|
||||
vars.update({'sender':request.function+'/'+app})
|
||||
return A(TAG[''](IMG(_src=URL('static', 'images/delete_icon.png')), SPAN(T('Delete this file (you will be asked to confirm deletion)'))), _class='icon delete tooltip', _href=URL('delete',args=arglist,vars=vars))
|
||||
}}
|
||||
|
||||
{{block sectionclass}}design{{end}}
|
||||
@@ -73,13 +80,14 @@ def deletefile(arglist):
|
||||
|
||||
<ul>
|
||||
{{for m in models:}}
|
||||
<li id="models__{{=m.replace('.','__')}}">
|
||||
{{id="models__"+m.replace('.','__')}}
|
||||
<li id="{{=id}}">
|
||||
<span class="filetools controls">
|
||||
{{=editfile('models',m)}}
|
||||
{{=deletefile([app, 'models', m])}}
|
||||
{{=editfile('models',m, dict(id=id))}}
|
||||
{{=deletefile([app, 'models', m], dict(id=id, id2='models'))}}
|
||||
</span>
|
||||
<span class="file">
|
||||
{{=peekfile('models',m)}}
|
||||
{{=peekfile('models',m, dict(id=id))}}
|
||||
</span>
|
||||
<span class="extras">
|
||||
{{if len(defines[m]):}}{{=T("defines tables")}} {{pass}}{{=XML(', '.join([B(table).xml() for table in defines[m]]))}}
|
||||
@@ -87,7 +95,7 @@ def deletefile(arglist):
|
||||
</li>
|
||||
{{pass}}
|
||||
</ul>
|
||||
<div class="controls formfield">{{=file_create_form('%s/models/' % app)}}</div>
|
||||
<div class="controls formfield">{{=file_create_form('%s/models/' % app, 'models')}}</div>
|
||||
</div>
|
||||
|
||||
<!-- FIND CONTROLLER FUNCTIONS -->
|
||||
@@ -112,14 +120,15 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
|
||||
{{pass}}
|
||||
<ul>
|
||||
{{for c in controllers:}}
|
||||
<li id="controllers__{{=c.replace('.','__')}}">
|
||||
{{id="controllers__"+c.replace('.','__')}}
|
||||
<li id="{{=id}}">
|
||||
<span class="filetools controls">
|
||||
{{=editfile('controllers',c)}}
|
||||
{{=deletefile([app, 'controllers', c])}}
|
||||
{{=editfile('controllers',c, dict(id=id))}}
|
||||
{{=deletefile([app, 'controllers', c], dict(id=id, id2='controllers'))}}
|
||||
{{=testfile('controllers',c)}}
|
||||
</span>
|
||||
<span class="file">
|
||||
{{=peekfile('controllers',c)}}
|
||||
{{=peekfile('controllers',c, dict(id=id))}}
|
||||
</span>
|
||||
<span class="extras">
|
||||
{{if functions[c]:}}{{=T("exposes")}} {{pass}}{{=XML(', '.join([A(f,_href=URL(a=app,c=c[:-3],f=f)).xml() for f in functions[c]]))}}
|
||||
@@ -127,7 +136,7 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
|
||||
</li>
|
||||
{{pass}}
|
||||
</ul>
|
||||
<div class="controls formfield">{{=file_create_form('%s/controllers/' % app)}}</div>
|
||||
<div class="controls formfield">{{=file_create_form('%s/controllers/' % app, 'controllers')}}</div>
|
||||
</div>
|
||||
|
||||
<!-- VIEWS -->
|
||||
@@ -143,13 +152,14 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
|
||||
{{if not views:}}<p><strong>{{=T("There are no views")}}</strong></p>{{pass}}
|
||||
<ul>
|
||||
{{for c in views:}}
|
||||
<li id="views__{{=c.replace('/','__').replace('.','__')}}">
|
||||
{{id="views__"+c.replace('/','__').replace('.','__')}}
|
||||
<li id="{{=id}}">
|
||||
<span class="filetools controls">
|
||||
{{=editfile('views',c)}}
|
||||
{{=deletefile([app, 'views', c])}}
|
||||
{{=editfile('views',c, dict(id=id))}}
|
||||
{{=deletefile([app, 'views', c], dict(id=id, id2='views'))}}
|
||||
</span>
|
||||
<span class="file">
|
||||
{{=peekfile('views',c)}}
|
||||
{{=peekfile('views',c, dict(id=id))}}
|
||||
</span>
|
||||
<span class="extras">
|
||||
{{if extend.has_key(c):}}{{=T("extends")}} <b>{{=extend[c]}}</b> {{pass}}
|
||||
@@ -158,7 +168,7 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
|
||||
</li>
|
||||
{{pass}}
|
||||
</ul>
|
||||
<div class="controls formfield">{{=file_create_form('%s/views/' % app)}}</div>
|
||||
<div class="controls formfield">{{=file_create_form('%s/views/' % app, 'views')}}</div>
|
||||
</div>
|
||||
|
||||
<!-- LANGUAGES -->
|
||||
@@ -172,20 +182,60 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
|
||||
{{=button(URL('update_languages/'+app), T('update all languages'))}}
|
||||
</div>
|
||||
{{if not languages:}}<p><strong>{{=T("There are no translators, only default language is supported")}}</strong></p>{{pass}}
|
||||
<ul>
|
||||
<table>
|
||||
{{for file in languages:}}
|
||||
<li id="languages__{{=file.replace('.','__')}}">
|
||||
{{id="languages__"+file.replace('.','__')}}
|
||||
<tr id="{{=id}}">
|
||||
<td>
|
||||
<span class="filetools controls">
|
||||
{{=editlanguagefile('languages',file)}}
|
||||
{{=deletefile([app, 'languages', file])}}
|
||||
{{=deletefile([app, 'languages', file], dict(id=id, id2='languages'))}}
|
||||
</span>
|
||||
<span class="file">
|
||||
{{=peekfile('languages',file)}}
|
||||
{{=peekfile('languages',file, dict(id=id))}}
|
||||
</span>
|
||||
</li>
|
||||
</td>
|
||||
<td>
|
||||
|
||||
(
|
||||
{{=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)), T('Create rules'))}}
|
||||
</span>
|
||||
{{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}}
|
||||
{{else:}}
|
||||
{{pfile='plural-%s.py'%p[1]}}
|
||||
{{if pfile in plurals:}}
|
||||
<span class="filetools controls">
|
||||
{{=editpluralsfile('languages',pfile,dict(nplurals=p[0]))}}
|
||||
</span>
|
||||
<span class="file">
|
||||
{{=peekfile('languages',pfile,dict(id=id))}},
|
||||
</span>
|
||||
{{else:}}
|
||||
<b>{{=T("are not used yet")}}</b>,
|
||||
{{pass}}
|
||||
{{pass}}
|
||||
{{=T("rules:")}}
|
||||
<span class="file{{=' error' if p[3]!='ok' else ''}}">
|
||||
{{=peekfile('gluon/contrib/rules', p[2], dict(app=app, id=id), p[3] if p[3]!='ok' else None)}}
|
||||
</span>
|
||||
{{pass}}
|
||||
</ul>
|
||||
<div class="controls formfield">{{=file_create_form('%s/languages/' % app)}}{{=T('(something like "it-it")')}}</div>
|
||||
)
|
||||
</td>
|
||||
</tr>
|
||||
{{pass}}
|
||||
</table>
|
||||
<div class="controls formfield">{{=file_create_form('%s/languages/' % app, 'languages')}}{{=T('(something like "it-it")')}}</div>
|
||||
</div>
|
||||
|
||||
<!-- STATIC -->
|
||||
@@ -223,10 +273,10 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
|
||||
if filename:
|
||||
}}<li>
|
||||
<span class="filetools controls">
|
||||
{{=editfile('static',file)}} {{=deletefile([app,'static',file])}}
|
||||
{{=editfile('static',file, dict(id="static"))}} {{=deletefile([app,'static',file], dict(id="static",id2="static"))}}
|
||||
</span>
|
||||
<span class="file">
|
||||
<a href="{{=URL(a=app,c='static',f=file)}}">{{=filename}}</a>
|
||||
<a href="{{=URL(a=app,c='static',f=file)}}">{{=filename}}</a>
|
||||
</span>
|
||||
</li>{{
|
||||
pass
|
||||
@@ -234,8 +284,8 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
|
||||
}}
|
||||
{{pass}}
|
||||
</ul>
|
||||
<div class="controls formfield">{{=file_create_form('%s/static/' % app)}}
|
||||
{{=file_upload_form('%s/static/' % app)}}</div>
|
||||
<div class="controls formfield">{{=file_create_form('%s/static/' % app, 'static')}}
|
||||
{{=file_upload_form('%s/static/' % app, 'static')}}</div>
|
||||
</div>
|
||||
|
||||
<!-- MODULES -->
|
||||
@@ -250,19 +300,22 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
|
||||
{{if not modules:}}<p><strong>{{=T("There are no modules")}}</strong></p>{{pass}}
|
||||
<ul>
|
||||
{{for m in modules:}}
|
||||
<li id="modules__{{=m.replace('/','__').replace('.','__')}}">
|
||||
{{id="modules__"+m.replace('/','__').replace('.','__')}}
|
||||
<li id="{{=id}}">
|
||||
<span class="filetols controls">
|
||||
{{=editfile('modules',m)}}
|
||||
{{if m!='__init__.py':}}{{=deletefile([app, 'modules', m])}}{{pass}}
|
||||
{{=editfile('modules',m,dict(id=id))}}
|
||||
{{if m!='__init__.py':}}
|
||||
{{=deletefile([app, 'modules', m], dict(id=id, id2='modules'))}}
|
||||
{{pass}}
|
||||
</span>
|
||||
<span class="file">
|
||||
{{=peekfile('modules',m)}}
|
||||
{{=peekfile('modules',m, dict(id=id))}}
|
||||
</span>
|
||||
</li>
|
||||
{{pass}}
|
||||
</ul>
|
||||
<div class="controls formfield">{{=file_create_form('%s/modules/' % app)}}
|
||||
{{=file_upload_form('%s/modules/' % app)}}</div>
|
||||
<div class="controls formfield">{{=file_create_form('%s/modules/' % app, 'modules')}}
|
||||
{{=file_upload_form('%s/modules/' % app, 'modules')}}</div>
|
||||
</div>
|
||||
|
||||
<!-- PLUGINS -->
|
||||
@@ -280,15 +333,16 @@ for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functi
|
||||
{{if plugins:}}
|
||||
<ul>
|
||||
{{for plugin in plugins:}}
|
||||
<li>
|
||||
{{=A('plugin_%s' % plugin, _class='file', _href=URL('plugin', args=[app, plugin]))}}
|
||||
{{id="plugins__"+plugin.replace('/','__').replace('.','__')}}
|
||||
<li id="{{=id}}">
|
||||
{{=A('plugin_%s' % plugin, _class='file', _href=URL('plugin', args=[app, plugin], vars=dict(id=id, id2='plugins')))}}
|
||||
</li>
|
||||
{{pass}}
|
||||
</ul>
|
||||
{{else:}}
|
||||
<p><strong>{{=T('There are no plugins')}}</strong></p>
|
||||
{{pass}}
|
||||
<div class="controls formfield">{{=upload_plugin_form(app)}}</div>
|
||||
<div class="controls formfield">{{=upload_plugin_form(app, 'plugins')}}</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -299,11 +353,12 @@ jQuery(document).ready(function(){
|
||||
if(code==13 && jQuery('#search').val()){
|
||||
jQuery.getJSON('{{=URL('search',args=request.args)}}?keywords='+escape(jQuery('#search').val()),null,function(data, textStatus, xhr){
|
||||
jQuery('.component_contents li, .formfield, .comptools').hide();
|
||||
files=data['files'];
|
||||
files=data['files'];
|
||||
message=data['message'];
|
||||
for(var i=0; i<files.length; i++)
|
||||
jQuery('li#'+files[i].replace(/\//g,'__').replace('.','__')).slideDown();
|
||||
jQuery('.flash').html('{{=T("Searching:")}} '+files.length+' {{=T("files")}}').slideDown();
|
||||
});
|
||||
jQuery('.flash').html(message).slideDown();
|
||||
});
|
||||
} else if(code==13) {
|
||||
jQuery('.component_contents li, .formfield, .comptools').slideDown();
|
||||
jQuery('.flash').html('').hide();
|
||||
|
||||
@@ -90,7 +90,7 @@ jQuery(document).ready(function(){
|
||||
URL(c='debug', f='toggle_breakpoint')),
|
||||
_class="button special")}}
|
||||
{{pass}}
|
||||
{{=button(URL('design',args=request.args[0]), T('back'))}}
|
||||
{{=button(URL('design',args=request.vars.app if request.vars.app else request.args[0], anchor=request.vars.id), T('back'))}}
|
||||
{{if edit_controller:}}
|
||||
{{=button(edit_controller, T('edit controller'))}}
|
||||
{{pass}}
|
||||
@@ -148,7 +148,7 @@ window.onload = function() {
|
||||
</form>
|
||||
</div>
|
||||
|
||||
{{if filetype=='html':}}
|
||||
{{if TEXT_EDITOR == 'edit_area' and filetype=='html':}}
|
||||
<div class="help">
|
||||
<h3>{{=T('Key bindings for ZenCoding Plugin')}}</h3>
|
||||
<ul>
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
{{extend 'layout.html'}}
|
||||
<script>
|
||||
function delkey(id) {
|
||||
jQuery('#'+id).hide();
|
||||
jQuery('#'+id+' INPUT').val(String.fromCharCode(127));
|
||||
return false;
|
||||
}
|
||||
</script>
|
||||
|
||||
{{block sectionclass}}edit_language{{end}}
|
||||
|
||||
<h2>{{=T("Editing Plural Forms File")}} "{{=filename}}"</h2>
|
||||
<div class="pluralsform">
|
||||
{{=form}}
|
||||
</div>
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
<h2>{{=T("Peeking at file")}} "{{=filename}}"</h2>
|
||||
|
||||
<p class="controls">
|
||||
{{=button(URL('design',args=request.args[0]), T('back'))}}
|
||||
{{=button(URL('edit',args=request.args), T('Edit'))}}
|
||||
{{=button(URL('design',args=request.vars.app if request.vars.app else request.args[0], anchor=request.vars.id), T('back'))}}
|
||||
{{=button(URL('edit',args=request.args, vars=request.vars), T('Edit'))}}
|
||||
</p>
|
||||
|
||||
{{
|
||||
|
||||
@@ -50,8 +50,8 @@ def deletefile(arglist):
|
||||
{{=button("#modules", T("modules"))}}
|
||||
</span>
|
||||
<span class="buttongroup">
|
||||
{{=sp_button(URL('plugin',args=app), T("back"))}}
|
||||
{{=sp_button(URL('delete_plugin',args=request.args), T("delete plugin"))}}
|
||||
{{=sp_button(URL('design',args=request.args, anchor=request.vars.id), T("back"))}}
|
||||
{{=sp_button(URL('delete_plugin',args=request.args, vars=request.vars), T("delete plugin"))}}
|
||||
{{=sp_button(URL('pack_plugin',args=request.args), T("pack plugin"))}}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
<!-- VERSION -->
|
||||
{{if is_manager():}}
|
||||
<div class="box">
|
||||
<h3>{{="Version %s.%s.%s (%s) %s" % myversion}}</h3>
|
||||
<h3>{{=T("Version %s.%s.%s (%s) %s", myversion)}}</h3>
|
||||
{{if session.check_version:}}
|
||||
<p id="check_version">
|
||||
{{=T('Checking for upgrades...')}}
|
||||
@@ -69,7 +69,7 @@
|
||||
{{pass}}
|
||||
</p>
|
||||
<div class="formfield">
|
||||
Running on {{=request.env.server_software}}
|
||||
{{=T("Running on %s", request.env.server_software)}}
|
||||
</div>
|
||||
<p>{{=button(URL('default','reload_routes'), T('Reload routes'))}}</p>
|
||||
</div>
|
||||
|
||||
@@ -28,17 +28,17 @@
|
||||
</div>
|
||||
</div>
|
||||
<div id="footer" class="fixed">
|
||||
{{=T('Powered by')}} {{=A('web2py', _href='http://www.web2py.com')}}™ {{=T('created by')}} Massimo Di Pierro ©2007-2011 -
|
||||
{{if hasattr(T,'get_possible_languages'):}}
|
||||
<span>
|
||||
{{=T('Admin language')}}
|
||||
<select name="adminlanguage" onchange="var date = new Date();cookieDate=date.setTime(date.getTime()+(100*24*60*60*1000));document.cookie='adminLanguage='+this.options[this.selectedIndex].value+'; expires='+cookieDate+'; path=/';window.location.reload()">
|
||||
{{for language in T.get_possible_languages():}}
|
||||
<option {{=T.accepted_language==language and 'selected' or ''}} >{{=language}}</option>
|
||||
{{pass}}
|
||||
</select>
|
||||
</span>
|
||||
{{pass}}
|
||||
{{=T('Powered by')}} {{=A('web2py', _href='http://www.web2py.com')}}™ {{=T('created by')}} Massimo Di Pierro ©2007-2012 -
|
||||
{{if hasattr(T,'get_possible_languages_info'):}}
|
||||
<span>
|
||||
{{=T('Admin language')}}
|
||||
<select name="adminlanguage" onchange="var date = new Date();cookieDate=date.setTime(date.getTime()+(100*24*60*60*1000));document.cookie='adminLanguage='+this.options[this.selectedIndex].id+'; expires='+cookieDate+'; path=/';window.location.reload()">
|
||||
{{for langinfo in sorted([(code,info[1]) for code,info in T.get_possible_languages_info().iteritems() if code != 'default']):}}
|
||||
<option {{=T.accepted_language==langinfo[0] and 'selected' or ''}} {{='id='+langinfo[0]}} >{{=langinfo[1]}}</option>
|
||||
{{pass}}
|
||||
</select>
|
||||
</span>
|
||||
{{pass}}
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -12,20 +12,20 @@ $(document).ready(function() {
|
||||
});
|
||||
</script>
|
||||
|
||||
<h2>OpenShift Deployment Interface</h2>
|
||||
<h2>{{=T("OpenShift Deployment Interface")}}</h2>
|
||||
|
||||
<p class="help">{{=T("This page can commit your changes to an openshift app repo and push them to your cloud instance. This assumes that you've already created the application instance using the web2py skeleton and have that repo somewhere on a filesystem that this web2py instance can access. This functionality requires GitPython installed and on the python path of the runtime that web2py is operating in.")}}</p>
|
||||
|
||||
<p class="help">{{=T("Note: If you receive an error with github status code of 128, ensure the system and account you are deploying from has a cooresponding ssh key configured in the openshift account.")}}</p>
|
||||
|
||||
{{if command:}}
|
||||
<h3>Command</h3>
|
||||
<button onclick="$.get('{{=URL(r=request,f='kill')}}');">kill process</button>
|
||||
<h3>{{=T("Command")}}</h3>
|
||||
<button onclick="$.get('{{=URL(r=request,f='kill')}}');">{{=T("kill process")}}</button>
|
||||
{{=CODE(command)}}
|
||||
<h3>OpenShift Output</h3>
|
||||
<h3>{{=T("OpenShift Output")}}</h3>
|
||||
<pre id="target"></pre>
|
||||
{{else:}}
|
||||
<h3>Deployment form</h3>
|
||||
<h3>{{=T("Deployment form")}}</h3>
|
||||
<div class="deploy_form form">
|
||||
{{=form}}
|
||||
</div>
|
||||
|
||||
@@ -197,7 +197,7 @@ def select():
|
||||
_name='update_fields', _value=request.vars.update_fields
|
||||
or '')), TR(T('Delete:'), INPUT(_name='delete_check',
|
||||
_class='delete', _type='checkbox', value=False), ''),
|
||||
TR('', '', INPUT(_type='submit', _value='submit'))),
|
||||
TR('', '', INPUT(_type='submit', _value=T('submit')))),
|
||||
_action=URL(r=request,args=request.args))
|
||||
if request.vars.csvfile != None:
|
||||
try:
|
||||
@@ -218,10 +218,10 @@ def select():
|
||||
if form.vars.update_check and form.vars.update_fields:
|
||||
db(query).update(**eval_in_global_env('dict(%s)'
|
||||
% form.vars.update_fields))
|
||||
response.flash = T('%s rows updated', nrows)
|
||||
response.flash = T('%s %%{row} updated', nrows)
|
||||
elif form.vars.delete_check:
|
||||
db(query).delete()
|
||||
response.flash = T('%s rows deleted', nrows)
|
||||
response.flash = T('%s %%{row} deleted', nrows)
|
||||
nrows = db(query).count()
|
||||
if orderby:
|
||||
rows = db(query,ignore_common_filters=True).select(limitby=(start, stop), orderby=eval_in_global_env(orderby))
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
<br/><br/><h3>{{=T("Import/Export")}}</h3><br/>
|
||||
[ <a href="{{=URL('csv',args=request.args[0],vars=dict(query=query))}}">{{=T("export as csv file")}}</a> ]
|
||||
{{if table:}}
|
||||
{{=FORM(str(T('or import from csv file'))+" ",INPUT(_type='file',_name='csvfile'),INPUT(_type='hidden',_value=table,_name='table'),INPUT(_type='submit',_value='import'))}}
|
||||
{{=FORM(str(T('or import from csv file'))+" ",INPUT(_type='file',_name='csvfile'),INPUT(_type='hidden',_value=table,_name='table'),INPUT(_type='submit',_value=T('import')))}}
|
||||
{{pass}}
|
||||
|
||||
|
||||
|
||||
@@ -96,6 +96,7 @@
|
||||
</li><li>Mateusz Banach (stickers, IS_EMAIL, IS_IMAGE, contenttype)
|
||||
</li><li>Michael Willis (shell)
|
||||
</li><li>Michele Comitini (faceboook)
|
||||
</li><li>Michael Toomim (scheduler)
|
||||
</li><li>Nathan Freeze (admin design, IS_STRONG, DAL features, <a href="http://web2pyslices.com">web2pyslices.com</a>)
|
||||
</li><li>Niall Sweeny (MSSQL support)
|
||||
</li><li>Niccolo Polo (epydoc)
|
||||
@@ -129,7 +130,7 @@
|
||||
</li><li>Yannis Aribaud (CAS compliance)
|
||||
</li><li>Yarko Tymciurak (design)
|
||||
</li><li>Younghyun Jo (internationalization)
|
||||
</li><li>Vladyslav Kozlovskyy (internationalization and mercurial support)
|
||||
</li><li>Vladyslav Kozlovskyy (internationalization, markmin, admin, and mercurial support)
|
||||
</li><li>Vidul Nikolaev Petrov (captcha)
|
||||
</li><li>Vinicius Assef
|
||||
</li><li>Zahariash (memory management)
|
||||
|
||||
@@ -197,7 +197,7 @@ def select():
|
||||
_name='update_fields', _value=request.vars.update_fields
|
||||
or '')), TR(T('Delete:'), INPUT(_name='delete_check',
|
||||
_class='delete', _type='checkbox', value=False), ''),
|
||||
TR('', '', INPUT(_type='submit', _value='submit'))),
|
||||
TR('', '', INPUT(_type='submit', _value=T('submit')))),
|
||||
_action=URL(r=request,args=request.args))
|
||||
if request.vars.csvfile != None:
|
||||
try:
|
||||
@@ -218,10 +218,10 @@ def select():
|
||||
if form.vars.update_check and form.vars.update_fields:
|
||||
db(query).update(**eval_in_global_env('dict(%s)'
|
||||
% form.vars.update_fields))
|
||||
response.flash = T('%s rows updated', nrows)
|
||||
response.flash = T('%s %%{row} updated', nrows)
|
||||
elif form.vars.delete_check:
|
||||
db(query).delete()
|
||||
response.flash = T('%s rows deleted', nrows)
|
||||
response.flash = T('%s %%{row} deleted', nrows)
|
||||
nrows = db(query).count()
|
||||
if orderby:
|
||||
rows = db(query,ignore_common_filters=True).select(limitby=(start, stop), orderby=eval_in_global_env(orderby))
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
# cs-cz.py pro web2py
|
||||
# coding: utf8
|
||||
{
|
||||
'!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 rows deleted': '%s zmazaných záznamů',
|
||||
'%s rows updated': '%s upravených záznamů',
|
||||
'%s %%{row} deleted': '%s zmazaných záznamů',
|
||||
'%s %%{row} updated': '%s upravených záznamů',
|
||||
'%s selected': '%s označených',
|
||||
'Administrative interface': 'pro administrátorské rozhranie kliknite sem',
|
||||
'Are you sure you want to delete this object?': 'Opravdu chceš odstranit tento objekt?',
|
||||
'Available databases and tables': 'Dostupné databáze a tabuľky',
|
||||
@@ -73,7 +75,7 @@
|
||||
'Sure you want to delete this object?': 'Opravdu chceš smazat tento objekt?',
|
||||
'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 output of the file is a dictionary that was rendered by the view': 'Výstup zo souboru je slovník, ktorý byl zobrazený ve view',
|
||||
'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',
|
||||
'This is a copy of the scaffolding application': 'Toto je kopie skeletu aplikace',
|
||||
'Timestamp': 'Časové razítko',
|
||||
'Update:': 'Upravit:',
|
||||
@@ -90,10 +92,10 @@
|
||||
'View': 'Zobrazit',
|
||||
'Welcome': 'Vítej',
|
||||
'Welcome to web2py': 'Vitejte ve web2py',
|
||||
'Which called the function': 'Ktorý zavolal funkci',
|
||||
'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': 'Navštívili jste URL',
|
||||
'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ě!',
|
||||
@@ -110,7 +112,6 @@
|
||||
'insert new': 'vložit nový záznam ',
|
||||
'insert new %s': 'vložit nový záznam %s',
|
||||
'invalid request': 'Neplatný požadavek',
|
||||
'located in the file': 'v souboru ',
|
||||
'login': 'prihlásit',
|
||||
'logout': 'odhlásit',
|
||||
'lost password?': 'neznáš heslo?',
|
||||
@@ -124,7 +125,6 @@
|
||||
'record does not exist': 'záznam neexistuje',
|
||||
'record id': 'id záznamu',
|
||||
'register': 'registrovat',
|
||||
'selected': 'označených',
|
||||
'state': 'stav',
|
||||
'table': 'tabulka',
|
||||
'unable to parse csv file': 'nedá sa zpracovat csv soubor',
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
# coding: utf8
|
||||
{
|
||||
'!langcode!': 'en-us',
|
||||
'!langname!': 'English (US)',
|
||||
}
|
||||
@@ -1,10 +1,13 @@
|
||||
# coding: utf8
|
||||
{
|
||||
'!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 rows deleted': '%s filas eliminadas',
|
||||
'%s rows updated': '%s filas actualizadas',
|
||||
'%s %%{row} deleted': '%s filas eliminadas',
|
||||
'%s %%{row} updated': '%s filas actualizadas',
|
||||
'%s selected': '%s seleccionado(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',
|
||||
@@ -15,6 +18,7 @@
|
||||
'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"',
|
||||
@@ -42,6 +46,7 @@
|
||||
'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',
|
||||
@@ -81,6 +86,7 @@
|
||||
'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',
|
||||
@@ -102,7 +108,7 @@
|
||||
'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': 'La salida del archivo es un diccionario escenificado por la vista',
|
||||
'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',
|
||||
@@ -125,11 +131,11 @@
|
||||
'Welcome': 'Welcome',
|
||||
'Welcome %s': 'Bienvenido %s',
|
||||
'Welcome to web2py': 'Bienvenido a web2py',
|
||||
'Which called the function': 'La cual llamó la función',
|
||||
'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': 'Usted visitó la url',
|
||||
'You visited the url %s': 'Usted visitó la url %s',
|
||||
'about': 'acerca de',
|
||||
'additional code for your application': 'código adicional para su aplicación',
|
||||
'admin disabled because no admin password': ' por falta de contraseña',
|
||||
@@ -149,8 +155,6 @@
|
||||
'change password': 'cambie contraseña',
|
||||
'check all': 'marcar todos',
|
||||
'clean': 'limpiar',
|
||||
'Online examples': 'Ejemplos en línea',
|
||||
'Administrative interface': 'Interfaz administrativa',
|
||||
'click to check for upgrades': 'haga clic para buscar actualizaciones',
|
||||
'compile': 'compilar',
|
||||
'compiled application removed': 'aplicación compilada removida',
|
||||
@@ -169,7 +173,6 @@
|
||||
'delete': 'eliminar',
|
||||
'delete all checked': 'eliminar marcados',
|
||||
'design': 'modificar',
|
||||
'Documentation': 'Documentación',
|
||||
'done!': 'listo!',
|
||||
'edit': 'editar',
|
||||
'edit controller': 'editar controlador',
|
||||
@@ -201,7 +204,6 @@
|
||||
'languages': 'lenguajes',
|
||||
'languages updated': 'lenguajes actualizados',
|
||||
'loading...': 'cargando...',
|
||||
'located in the file': 'localizada en el archivo',
|
||||
'login': 'inicio de sesión',
|
||||
'logout': 'fin de sesión',
|
||||
'lost password?': '¿olvido la contraseña?',
|
||||
@@ -224,7 +226,6 @@
|
||||
'restore': 'restaurar',
|
||||
'revert': 'revertir',
|
||||
'save': 'guardar',
|
||||
'selected': 'seleccionado(s)',
|
||||
'session expired': 'sesión expirada',
|
||||
'shell': 'shell',
|
||||
'site': 'sitio',
|
||||
@@ -257,4 +258,3 @@
|
||||
'web2py Recent Tweets': 'Tweets Recientes de web2py',
|
||||
'web2py is up to date': 'web2py está actualizado',
|
||||
}
|
||||
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
# coding: utf8
|
||||
{
|
||||
'!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 rows deleted': '%s rangées supprimées',
|
||||
'%s rows updated': '%s rangées mises à jour',
|
||||
'%s %%{row} deleted': '%s rangées supprimées',
|
||||
'%s %%{row} updated': '%s rangées mises à jour',
|
||||
'%s selected': '%s sélectionné',
|
||||
'About': 'À propos',
|
||||
'Access Control': "Contrôle d'accès",
|
||||
'Administrative interface': "Interface d'administration",
|
||||
@@ -104,7 +107,7 @@
|
||||
'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': 'La sortie de ce fichier est un dictionnaire qui été restitué par la vue',
|
||||
'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',
|
||||
'This App': 'Cette Appli',
|
||||
'This is a copy of the scaffolding application': "Ceci est une copie de l'application échafaudage",
|
||||
'Timestamp': 'Horodatage',
|
||||
@@ -122,10 +125,10 @@
|
||||
'Welcome': 'Bienvenu',
|
||||
'Welcome %s': 'Bienvenue %s',
|
||||
'Welcome to web2py': 'Bienvenue à web2py',
|
||||
'Which called the function': 'Qui a appelé la fonction',
|
||||
'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': "Vous avez visité l'URL",
|
||||
'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',
|
||||
@@ -143,7 +146,6 @@
|
||||
'insert new': 'insérer un nouveau',
|
||||
'insert new %s': 'insérer un nouveau %s',
|
||||
'invalid request': 'requête invalide',
|
||||
'located in the file': 'se trouvant dans le fichier',
|
||||
'login': 'connectez-vous',
|
||||
'logout': 'déconnectez-vous',
|
||||
'lost password': 'mot de passe perdu',
|
||||
@@ -159,10 +161,8 @@
|
||||
'record does not exist': "l'archive n'existe pas",
|
||||
'record id': "id d'enregistrement",
|
||||
'register': "s'inscrire",
|
||||
'selected': 'sélectionné',
|
||||
'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',
|
||||
}
|
||||
|
||||
|
||||
@@ -1,40 +1,61 @@
|
||||
# coding: utf8
|
||||
{
|
||||
'!langcode!': 'fr',
|
||||
'!langname!': 'Français',
|
||||
'"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',
|
||||
'%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',
|
||||
'%s rows deleted': '%s rangées supprimées',
|
||||
'%s rows updated': '%s rangées mises à jour',
|
||||
'About': 'À propos',
|
||||
'Access Control': 'Contrôle d\'accès',
|
||||
'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',
|
||||
'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:',
|
||||
'Client IP': 'IP client',
|
||||
'Community': 'Communauté',
|
||||
'Components and Plugins': 'Components and Plugins',
|
||||
'Controller': 'Contrôleur',
|
||||
'Copyright': 'Copyright',
|
||||
'Current request': 'Demande actuelle',
|
||||
'Current response': 'Réponse actuelle',
|
||||
'Current session': 'Session en cours',
|
||||
'DB Model': 'Modèle DB',
|
||||
'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',
|
||||
'DB Model': 'Modèle DB',
|
||||
'Delete:': 'Supprimer:',
|
||||
'Demo': 'Démo',
|
||||
'Deployment Recipes': 'Recettes de déploiement',
|
||||
'Description': 'Description',
|
||||
'design': 'design',
|
||||
'Documentation': 'Documentation',
|
||||
"Don't know what to do?": "Don't know what to do?",
|
||||
'done!': 'fait!',
|
||||
'Download': 'Téléchargement',
|
||||
'E-mail': 'E-mail',
|
||||
'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': 'enter an integer between %(min)g and %(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',
|
||||
@@ -44,24 +65,42 @@
|
||||
'Groups': 'Groups',
|
||||
'Hello World': 'Bonjour le monde',
|
||||
'Home': 'Accueil',
|
||||
'How did you get here?': 'How did you get here?',
|
||||
'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': 'Introduction',
|
||||
'Invalid Query': 'Requête Invalide',
|
||||
'Invalid email': 'E-mail invalide',
|
||||
'Invalid Query': 'Requête Invalide',
|
||||
'invalid request': 'requête invalide',
|
||||
'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',
|
||||
'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?',
|
||||
'Main Menu': 'Menu principal',
|
||||
'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",
|
||||
'Object or table name': 'Object or table name',
|
||||
'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',
|
||||
@@ -69,12 +108,19 @@
|
||||
'Plugins': 'Plugiciels',
|
||||
'Powered by': 'Alimenté par',
|
||||
'Preface': 'Préface',
|
||||
'previous 100 rows': '100 lignes précédentes',
|
||||
'Python': 'Python',
|
||||
'Query:': 'Requête:',
|
||||
'Quick Examples': 'Examples Rapides',
|
||||
'Readme': 'Lisez-moi',
|
||||
'Recipes': 'Recettes',
|
||||
'Record ID': 'ID d\'enregistrement',
|
||||
'record': 'enregistrement',
|
||||
'record does not exist': "l'archive n'existe pas",
|
||||
'record id': "id d'enregistrement",
|
||||
'Record ID': "ID d'enregistrement",
|
||||
'Register': "S'inscrire",
|
||||
'register': "s'inscrire",
|
||||
'Registration identifier': 'Registration identifier',
|
||||
'Registration key': "Clé d'enregistrement",
|
||||
'Remember me (for 30 days)': 'Se souvenir de moi (pendant 30 jours)',
|
||||
'Request reset password': 'Demande de réinitialiser le mot clé',
|
||||
@@ -85,19 +131,22 @@
|
||||
'Rows selected': 'Lignes sélectionnées',
|
||||
'Semantic': 'Sémantique',
|
||||
'Services': 'Services',
|
||||
'state': 'état',
|
||||
'Stylesheet': 'Feuille de style',
|
||||
'Submit': 'Soumettre',
|
||||
'Support': 'Support',
|
||||
'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 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',
|
||||
'The output of the file is a dictionary that was rendered by the view': 'La sortie de ce fichier est un dictionnaire qui été restitué par la vue',
|
||||
'This App': 'Cette Appli',
|
||||
'This is a copy of the scaffolding application': 'Ceci est une copie de l\'application échafaudage',
|
||||
'This is a copy of the scaffolding application': "Ceci est une copie de l'application échafaudage",
|
||||
'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é',
|
||||
@@ -111,46 +160,9 @@
|
||||
'Welcome': 'Bienvenu',
|
||||
'Welcome %s': 'Bienvenue %s',
|
||||
'Welcome to web2py': 'Bienvenue à web2py',
|
||||
'Which called the function': 'Qui a appelé la fonction',
|
||||
'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': 'Vous avez visité l\'URL',
|
||||
'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',
|
||||
'Online examples': 'Exemples en ligne',
|
||||
'Administrative interface': "Interface d'administration",
|
||||
'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',
|
||||
'Documentation': 'Documentation',
|
||||
'done!': 'fait!',
|
||||
'edit profile': 'modifier le profil',
|
||||
'enter an integer between %(min)g and %(max)g': 'enter an integer between %(min)g and %(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',
|
||||
'located in the file': 'se trouvant dans le fichier',
|
||||
'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",
|
||||
'previous 100 rows': '100 lignes précédentes',
|
||||
'record': 'enregistrement',
|
||||
'record does not exist': "l'archive n'existe pas",
|
||||
'record id': "id d'enregistrement",
|
||||
'register': "s'inscrire",
|
||||
'selected': 'sélectionné',
|
||||
'state': 'état',
|
||||
'table': 'tableau',
|
||||
'unable to parse csv file': "incapable d'analyser le fichier cvs",
|
||||
'Readme': "Lisez-moi",
|
||||
'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",
|
||||
}
|
||||
|
||||
|
||||
@@ -1,83 +1,87 @@
|
||||
# coding: utf8
|
||||
{
|
||||
'!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 rows deleted': '%s \xe0\xa4\xaa\xe0\xa4\x82\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xa4\xe0\xa4\xbf\xe0\xa4\xaf\xe0\xa4\xbe\xe0\xa4\x81 \xe0\xa4\xae\xe0\xa4\xbf\xe0\xa4\x9f\xe0\xa4\xbe\xe0\xa4\x8f\xe0\xa4\x81',
|
||||
'%s rows updated': '%s \xe0\xa4\xaa\xe0\xa4\x82\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xa4\xe0\xa4\xbf\xe0\xa4\xaf\xe0\xa4\xbe\xe0\xa4\x81 \xe0\xa4\x85\xe0\xa4\xa6\xe0\xa5\x8d\xe0\xa4\xaf\xe0\xa4\xa4\xe0\xa4\xa8',
|
||||
'Available databases and tables': '\xe0\xa4\x89\xe0\xa4\xaa\xe0\xa4\xb2\xe0\xa4\xac\xe0\xa5\x8d\xe0\xa4\xa7 \xe0\xa4\xa1\xe0\xa5\x87\xe0\xa4\x9f\xe0\xa4\xbe\xe0\xa4\xac\xe0\xa5\x87\xe0\xa4\xb8 \xe0\xa4\x94\xe0\xa4\xb0 \xe0\xa4\xa4\xe0\xa4\xbe\xe0\xa4\xb2\xe0\xa4\xbf\xe0\xa4\x95\xe0\xa4\xbe',
|
||||
'Cannot be empty': '\xe0\xa4\x96\xe0\xa4\xbe\xe0\xa4\xb2\xe0\xa5\x80 \xe0\xa4\xa8\xe0\xa4\xb9\xe0\xa5\x80\xe0\xa4\x82 \xe0\xa4\xb9\xe0\xa5\x8b \xe0\xa4\xb8\xe0\xa4\x95\xe0\xa4\xa4\xe0\xa4\xbe',
|
||||
'Change Password': '\xe0\xa4\xaa\xe0\xa4\xbe\xe0\xa4\xb8\xe0\xa4\xb5\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xa1 \xe0\xa4\xac\xe0\xa4\xa6\xe0\xa4\xb2\xe0\xa5\x87\xe0\xa4\x82',
|
||||
'Check to delete': '\xe0\xa4\xb9\xe0\xa4\x9f\xe0\xa4\xbe\xe0\xa4\xa8\xe0\xa5\x87 \xe0\xa4\x95\xe0\xa5\x87 \xe0\xa4\xb2\xe0\xa4\xbf\xe0\xa4\x8f \xe0\xa4\x9a\xe0\xa5\x81\xe0\xa4\xa8\xe0\xa5\x87\xe0\xa4\x82',
|
||||
'%s %%{row} deleted': '%s पंक्तियाँ मिटाएँ',
|
||||
'%s %%{row} updated': '%s पंक्तियाँ अद्यतन',
|
||||
'%s selected': '%s चुना हुआ',
|
||||
'Administrative interface': 'प्रशासनिक इंटरफेस के लिए यहाँ क्लिक करें',
|
||||
'Available databases and tables': 'उपलब्ध डेटाबेस और तालिका',
|
||||
'Cannot be empty': 'खाली नहीं हो सकता',
|
||||
'Change Password': 'पासवर्ड बदलें',
|
||||
'Check to delete': 'हटाने के लिए चुनें',
|
||||
'Controller': 'Controller',
|
||||
'Copyright': 'Copyright',
|
||||
'Current request': '\xe0\xa4\xb5\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xa4\xe0\xa4\xae\xe0\xa4\xbe\xe0\xa4\xa8 \xe0\xa4\x85\xe0\xa4\xa8\xe0\xa5\x81\xe0\xa4\xb0\xe0\xa5\x8b\xe0\xa4\xa7',
|
||||
'Current response': '\xe0\xa4\xb5\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xa4\xe0\xa4\xae\xe0\xa4\xbe\xe0\xa4\xa8 \xe0\xa4\xaa\xe0\xa5\x8d\xe0\xa4\xb0\xe0\xa4\xa4\xe0\xa4\xbf\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xb0\xe0\xa4\xbf\xe0\xa4\xaf\xe0\xa4\xbe',
|
||||
'Current session': '\xe0\xa4\xb5\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xa4\xe0\xa4\xae\xe0\xa4\xbe\xe0\xa4\xa8 \xe0\xa4\xb8\xe0\xa5\x87\xe0\xa4\xb6\xe0\xa4\xa8',
|
||||
'Current request': 'वर्तमान अनुरोध',
|
||||
'Current response': 'वर्तमान प्रतिक्रिया',
|
||||
'Current session': 'वर्तमान सेशन',
|
||||
'DB Model': 'DB Model',
|
||||
'Database': 'Database',
|
||||
'Delete:': '\xe0\xa4\xae\xe0\xa4\xbf\xe0\xa4\x9f\xe0\xa4\xbe\xe0\xa4\xa8\xe0\xa4\xbe:',
|
||||
'Delete:': 'मिटाना:',
|
||||
'Edit': 'Edit',
|
||||
'Edit Profile': '\xe0\xa4\xaa\xe0\xa5\x8d\xe0\xa4\xb0\xe0\xa5\x8b\xe0\xa4\xab\xe0\xa4\xbc\xe0\xa4\xbe\xe0\xa4\x87\xe0\xa4\xb2 \xe0\xa4\xb8\xe0\xa4\x82\xe0\xa4\xaa\xe0\xa4\xbe\xe0\xa4\xa6\xe0\xa4\xbf\xe0\xa4\xa4 \xe0\xa4\x95\xe0\xa4\xb0\xe0\xa5\x87\xe0\xa4\x82',
|
||||
'Edit Profile': 'प्रोफ़ाइल संपादित करें',
|
||||
'Edit This App': 'Edit This App',
|
||||
'Edit current record': '\xe0\xa4\xb5\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xa4\xe0\xa4\xae\xe0\xa4\xbe\xe0\xa4\xa8 \xe0\xa4\xb0\xe0\xa5\x87\xe0\xa4\x95\xe0\xa5\x89\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xa1 \xe0\xa4\xb8\xe0\xa4\x82\xe0\xa4\xaa\xe0\xa4\xbe\xe0\xa4\xa6\xe0\xa4\xbf\xe0\xa4\xa4 \xe0\xa4\x95\xe0\xa4\xb0\xe0\xa5\x87\xe0\xa4\x82 ',
|
||||
'Edit current record': 'वर्तमान रेकॉर्ड संपादित करें ',
|
||||
'Hello World': 'Hello World',
|
||||
'Hello from MyApp': 'Hello from MyApp',
|
||||
'Import/Export': '\xe0\xa4\x86\xe0\xa4\xaf\xe0\xa4\xbe\xe0\xa4\xa4 / \xe0\xa4\xa8\xe0\xa4\xbf\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xaf\xe0\xa4\xbe\xe0\xa4\xa4',
|
||||
'Import/Export': 'आयात / निर्यात',
|
||||
'Index': 'Index',
|
||||
'Internal State': '\xe0\xa4\x86\xe0\xa4\x82\xe0\xa4\xa4\xe0\xa4\xb0\xe0\xa4\xbf\xe0\xa4\x95 \xe0\xa4\xb8\xe0\xa5\x8d\xe0\xa4\xa5\xe0\xa4\xbf\xe0\xa4\xa4\xe0\xa4\xbf',
|
||||
'Invalid Query': '\xe0\xa4\x85\xe0\xa4\xae\xe0\xa4\xbe\xe0\xa4\xa8\xe0\xa5\x8d\xe0\xa4\xaf \xe0\xa4\xaa\xe0\xa5\x8d\xe0\xa4\xb0\xe0\xa4\xb6\xe0\xa5\x8d\xe0\xa4\xa8',
|
||||
'Internal State': 'आंतरिक स्थिति',
|
||||
'Invalid Query': 'अमान्य प्रश्न',
|
||||
'Layout': 'Layout',
|
||||
'Login': '\xe0\xa4\xb2\xe0\xa5\x89\xe0\xa4\x97 \xe0\xa4\x87\xe0\xa4\xa8',
|
||||
'Logout': '\xe0\xa4\xb2\xe0\xa5\x89\xe0\xa4\x97 \xe0\xa4\x86\xe0\xa4\x89\xe0\xa4\x9f',
|
||||
'Lost Password': '\xe0\xa4\xaa\xe0\xa4\xbe\xe0\xa4\xb8\xe0\xa4\xb5\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xa1 \xe0\xa4\x96\xe0\xa5\x8b \xe0\xa4\x97\xe0\xa4\xaf\xe0\xa4\xbe',
|
||||
'Login': 'लॉग इन',
|
||||
'Logout': 'लॉग आउट',
|
||||
'Lost Password': 'पासवर्ड खो गया',
|
||||
'Main Menu': 'Main Menu',
|
||||
'Menu Model': 'Menu Model',
|
||||
'New Record': '\xe0\xa4\xa8\xe0\xa4\xaf\xe0\xa4\xbe \xe0\xa4\xb0\xe0\xa5\x87\xe0\xa4\x95\xe0\xa5\x89\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xa1',
|
||||
'No databases in this application': '\xe0\xa4\x87\xe0\xa4\xb8 \xe0\xa4\x85\xe0\xa4\xa8\xe0\xa5\x81\xe0\xa4\xaa\xe0\xa5\x8d\xe0\xa4\xb0\xe0\xa4\xaf\xe0\xa5\x8b\xe0\xa4\x97 \xe0\xa4\xae\xe0\xa5\x87\xe0\xa4\x82 \xe0\xa4\x95\xe0\xa5\x8b\xe0\xa4\x88 \xe0\xa4\xa1\xe0\xa5\x87\xe0\xa4\x9f\xe0\xa4\xbe\xe0\xa4\xac\xe0\xa5\x87\xe0\xa4\xb8 \xe0\xa4\xa8\xe0\xa4\xb9\xe0\xa5\x80\xe0\xa4\x82 \xe0\xa4\xb9\xe0\xa5\x88\xe0\xa4\x82',
|
||||
'New Record': 'नया रेकॉर्ड',
|
||||
'No databases in this application': 'इस अनुप्रयोग में कोई डेटाबेस नहीं हैं',
|
||||
'Online examples': 'ऑनलाइन उदाहरण के लिए यहाँ क्लिक करें',
|
||||
'Powered by': 'Powered by',
|
||||
'Query:': '\xe0\xa4\xaa\xe0\xa5\x8d\xe0\xa4\xb0\xe0\xa4\xb6\xe0\xa5\x8d\xe0\xa4\xa8:',
|
||||
'Register': '\xe0\xa4\xaa\xe0\xa4\x82\xe0\xa4\x9c\xe0\xa5\x80\xe0\xa4\x95\xe0\xa5\x83\xe0\xa4\xa4 (\xe0\xa4\xb0\xe0\xa4\x9c\xe0\xa4\xbf\xe0\xa4\xb8\xe0\xa5\x8d\xe0\xa4\x9f\xe0\xa4\xb0) \xe0\xa4\x95\xe0\xa4\xb0\xe0\xa4\xa8\xe0\xa4\xbe ',
|
||||
'Rows in table': '\xe0\xa4\xa4\xe0\xa4\xbe\xe0\xa4\xb2\xe0\xa4\xbf\xe0\xa4\x95\xe0\xa4\xbe \xe0\xa4\xae\xe0\xa5\x87\xe0\xa4\x82 \xe0\xa4\xaa\xe0\xa4\x82\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xa4\xe0\xa4\xbf\xe0\xa4\xaf\xe0\xa4\xbe\xe0\xa4\x81 ',
|
||||
'Rows selected': '\xe0\xa4\x9a\xe0\xa4\xaf\xe0\xa4\xa8\xe0\xa4\xbf\xe0\xa4\xa4 (\xe0\xa4\x9a\xe0\xa5\x81\xe0\xa4\xa8\xe0\xa5\x87 \xe0\xa4\x97\xe0\xa4\xaf\xe0\xa5\x87) \xe0\xa4\xaa\xe0\xa4\x82\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xa4\xe0\xa4\xbf\xe0\xa4\xaf\xe0\xa4\xbe\xe0\xa4\x81 ',
|
||||
'Query:': 'प्रश्न:',
|
||||
'Register': 'पंजीकृत (रजिस्टर) करना ',
|
||||
'Rows in table': 'तालिका में पंक्तियाँ ',
|
||||
'Rows selected': 'चयनित (चुने गये) पंक्तियाँ ',
|
||||
'Stylesheet': 'Stylesheet',
|
||||
'Sure you want to delete this object?': '\xe0\xa4\xb8\xe0\xa5\x81\xe0\xa4\xa8\xe0\xa4\xbf\xe0\xa4\xb6\xe0\xa5\x8d\xe0\xa4\x9a\xe0\xa4\xbf\xe0\xa4\xa4 \xe0\xa4\xb9\xe0\xa5\x88\xe0\xa4\x82 \xe0\xa4\x95\xe0\xa4\xbf \xe0\xa4\x86\xe0\xa4\xaa \xe0\xa4\x87\xe0\xa4\xb8 \xe0\xa4\xb5\xe0\xa4\xb8\xe0\xa5\x8d\xe0\xa4\xa4\xe0\xa5\x81 \xe0\xa4\x95\xe0\xa5\x8b \xe0\xa4\xb9\xe0\xa4\x9f\xe0\xa4\xbe\xe0\xa4\xa8\xe0\xa4\xbe \xe0\xa4\x9a\xe0\xa4\xbe\xe0\xa4\xb9\xe0\xa4\xa4\xe0\xa5\x87 \xe0\xa4\xb9\xe0\xa5\x88\xe0\xa4\x82?',
|
||||
'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.',
|
||||
'Update:': '\xe0\xa4\x85\xe0\xa4\xa6\xe0\xa5\x8d\xe0\xa4\xaf\xe0\xa4\xa4\xe0\xa4\xa8 \xe0\xa4\x95\xe0\xa4\xb0\xe0\xa4\xa8\xe0\xa4\xbe:',
|
||||
'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': '\xe0\xa4\xb5\xe0\xa5\x87\xe0\xa4\xac\xe0\xa5\xa8\xe0\xa4\xaa\xe0\xa4\xbe\xe0\xa4\x87 (web2py) \xe0\xa4\xae\xe0\xa5\x87\xe0\xa4\x82 \xe0\xa4\x86\xe0\xa4\xaa\xe0\xa4\x95\xe0\xa4\xbe \xe0\xa4\xb8\xe0\xa5\x8d\xe0\xa4\xb5\xe0\xa4\xbe\xe0\xa4\x97\xe0\xa4\xa4 \xe0\xa4\xb9\xe0\xa5\x88',
|
||||
'appadmin is disabled because insecure channel': '\xe0\xa4\x85\xe0\xa4\xaa \xe0\xa4\x86\xe0\xa4\xa1\xe0\xa4\xae\xe0\xa4\xbf\xe0\xa4\xa8 (appadmin) \xe0\xa4\x85\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xb7\xe0\xa4\xae \xe0\xa4\xb9\xe0\xa5\x88 \xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xaf\xe0\xa5\x8b\xe0\xa4\x82\xe0\xa4\x95\xe0\xa4\xbf \xe0\xa4\x85\xe0\xa4\xb8\xe0\xa5\x81\xe0\xa4\xb0\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xb7\xe0\xa4\xbf\xe0\xa4\xa4 \xe0\xa4\x9a\xe0\xa5\x88\xe0\xa4\xa8\xe0\xa4\xb2',
|
||||
'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',
|
||||
'Online examples': '\xe0\xa4\x91\xe0\xa4\xa8\xe0\xa4\xb2\xe0\xa4\xbe\xe0\xa4\x87\xe0\xa4\xa8 \xe0\xa4\x89\xe0\xa4\xa6\xe0\xa4\xbe\xe0\xa4\xb9\xe0\xa4\xb0\xe0\xa4\xa3 \xe0\xa4\x95\xe0\xa5\x87 \xe0\xa4\xb2\xe0\xa4\xbf\xe0\xa4\x8f \xe0\xa4\xaf\xe0\xa4\xb9\xe0\xa4\xbe\xe0\xa4\x81 \xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xb2\xe0\xa4\xbf\xe0\xa4\x95 \xe0\xa4\x95\xe0\xa4\xb0\xe0\xa5\x87\xe0\xa4\x82',
|
||||
'Administrative interface': '\xe0\xa4\xaa\xe0\xa5\x8d\xe0\xa4\xb0\xe0\xa4\xb6\xe0\xa4\xbe\xe0\xa4\xb8\xe0\xa4\xa8\xe0\xa4\xbf\xe0\xa4\x95 \xe0\xa4\x87\xe0\xa4\x82\xe0\xa4\x9f\xe0\xa4\xb0\xe0\xa4\xab\xe0\xa5\x87\xe0\xa4\xb8 \xe0\xa4\x95\xe0\xa5\x87 \xe0\xa4\xb2\xe0\xa4\xbf\xe0\xa4\x8f \xe0\xa4\xaf\xe0\xa4\xb9\xe0\xa4\xbe\xe0\xa4\x81 \xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xb2\xe0\xa4\xbf\xe0\xa4\x95 \xe0\xa4\x95\xe0\xa4\xb0\xe0\xa5\x87\xe0\xa4\x82',
|
||||
'customize me!': '\xe0\xa4\xae\xe0\xa5\x81\xe0\xa4\x9d\xe0\xa5\x87 \xe0\xa4\x85\xe0\xa4\xa8\xe0\xa5\x81\xe0\xa4\x95\xe0\xa5\x82\xe0\xa4\xb2\xe0\xa4\xbf\xe0\xa4\xa4 (\xe0\xa4\x95\xe0\xa4\xb8\xe0\xa5\x8d\xe0\xa4\x9f\xe0\xa4\xae\xe0\xa4\xbe\xe0\xa4\x87\xe0\xa4\x9c\xe0\xa4\xbc) \xe0\xa4\x95\xe0\xa4\xb0\xe0\xa5\x87\xe0\xa4\x82!',
|
||||
'data uploaded': '\xe0\xa4\xa1\xe0\xa4\xbe\xe0\xa4\x9f\xe0\xa4\xbe \xe0\xa4\x85\xe0\xa4\xaa\xe0\xa4\xb2\xe0\xa5\x8b\xe0\xa4\xa1 \xe0\xa4\xb8\xe0\xa4\xae\xe0\xa5\x8d\xe0\xa4\xaa\xe0\xa4\xa8\xe0\xa5\x8d\xe0\xa4\xa8 ',
|
||||
'database': '\xe0\xa4\xa1\xe0\xa5\x87\xe0\xa4\x9f\xe0\xa4\xbe\xe0\xa4\xac\xe0\xa5\x87\xe0\xa4\xb8',
|
||||
'database %s select': '\xe0\xa4\xa1\xe0\xa5\x87\xe0\xa4\x9f\xe0\xa4\xbe\xe0\xa4\xac\xe0\xa5\x87\xe0\xa4\xb8 %s \xe0\xa4\x9a\xe0\xa5\x81\xe0\xa4\xa8\xe0\xa5\x80 \xe0\xa4\xb9\xe0\xa5\x81\xe0\xa4\x88',
|
||||
'customize me!': 'मुझे अनुकूलित (कस्टमाइज़) करें!',
|
||||
'data uploaded': 'डाटा अपलोड सम्पन्न ',
|
||||
'database': 'डेटाबेस',
|
||||
'database %s select': 'डेटाबेस %s चुनी हुई',
|
||||
'db': 'db',
|
||||
'design': '\xe0\xa4\xb0\xe0\xa4\x9a\xe0\xa4\xa8\xe0\xa4\xbe \xe0\xa4\x95\xe0\xa4\xb0\xe0\xa5\x87\xe0\xa4\x82',
|
||||
'done!': '\xe0\xa4\xb9\xe0\xa5\x8b \xe0\xa4\x97\xe0\xa4\xaf\xe0\xa4\xbe!',
|
||||
'design': 'रचना करें',
|
||||
'done!': 'हो गया!',
|
||||
'edit profile': 'edit profile',
|
||||
'export as csv file': 'csv \xe0\xa4\xab\xe0\xa4\xbc\xe0\xa4\xbe\xe0\xa4\x87\xe0\xa4\xb2 \xe0\xa4\x95\xe0\xa5\x87 \xe0\xa4\xb0\xe0\xa5\x82\xe0\xa4\xaa \xe0\xa4\xae\xe0\xa5\x87\xe0\xa4\x82 \xe0\xa4\xa8\xe0\xa4\xbf\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xaf\xe0\xa4\xbe\xe0\xa4\xa4',
|
||||
'insert new': '\xe0\xa4\xa8\xe0\xa4\xaf\xe0\xa4\xbe \xe0\xa4\xa1\xe0\xa4\xbe\xe0\xa4\xb2\xe0\xa5\x87\xe0\xa4\x82',
|
||||
'insert new %s': '\xe0\xa4\xa8\xe0\xa4\xaf\xe0\xa4\xbe %s \xe0\xa4\xa1\xe0\xa4\xbe\xe0\xa4\xb2\xe0\xa5\x87\xe0\xa4\x82',
|
||||
'invalid request': '\xe0\xa4\x85\xe0\xa4\xb5\xe0\xa5\x88\xe0\xa4\xa7 \xe0\xa4\x85\xe0\xa4\xa8\xe0\xa5\x81\xe0\xa4\xb0\xe0\xa5\x8b\xe0\xa4\xa7',
|
||||
'export as csv file': 'csv फ़ाइल के रूप में निर्यात',
|
||||
'insert new': 'नया डालें',
|
||||
'insert new %s': 'नया %s डालें',
|
||||
'invalid request': 'अवैध अनुरोध',
|
||||
'login': 'login',
|
||||
'logout': 'logout',
|
||||
'new record inserted': '\xe0\xa4\xa8\xe0\xa4\xaf\xe0\xa4\xbe \xe0\xa4\xb0\xe0\xa5\x87\xe0\xa4\x95\xe0\xa5\x89\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xa1 \xe0\xa4\xa1\xe0\xa4\xbe\xe0\xa4\xb2\xe0\xa4\xbe',
|
||||
'next 100 rows': '\xe0\xa4\x85\xe0\xa4\x97\xe0\xa4\xb2\xe0\xa5\x87 100 \xe0\xa4\xaa\xe0\xa4\x82\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xa4\xe0\xa4\xbf\xe0\xa4\xaf\xe0\xa4\xbe\xe0\xa4\x81',
|
||||
'or import from csv file': '\xe0\xa4\xaf\xe0\xa4\xbe csv \xe0\xa4\xab\xe0\xa4\xbc\xe0\xa4\xbe\xe0\xa4\x87\xe0\xa4\xb2 \xe0\xa4\xb8\xe0\xa5\x87 \xe0\xa4\x86\xe0\xa4\xaf\xe0\xa4\xbe\xe0\xa4\xa4',
|
||||
'previous 100 rows': '\xe0\xa4\xaa\xe0\xa4\xbf\xe0\xa4\x9b\xe0\xa4\xb2\xe0\xa5\x87 100 \xe0\xa4\xaa\xe0\xa4\x82\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xa4\xe0\xa4\xbf\xe0\xa4\xaf\xe0\xa4\xbe\xe0\xa4\x81',
|
||||
'new record inserted': 'नया रेकॉर्ड डाला',
|
||||
'next 100 rows': 'अगले 100 पंक्तियाँ',
|
||||
'or import from csv file': 'या csv फ़ाइल से आयात',
|
||||
'previous 100 rows': 'पिछले 100 पंक्तियाँ',
|
||||
'record': 'record',
|
||||
'record does not exist': '\xe0\xa4\xb0\xe0\xa4\xbf\xe0\xa4\x95\xe0\xa5\x89\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xa1 \xe0\xa4\xae\xe0\xa5\x8c\xe0\xa4\x9c\xe0\xa5\x82\xe0\xa4\xa6 \xe0\xa4\xa8\xe0\xa4\xb9\xe0\xa5\x80\xe0\xa4\x82 \xe0\xa4\xb9\xe0\xa5\x88',
|
||||
'record id': '\xe0\xa4\xb0\xe0\xa4\xbf\xe0\xa4\x95\xe0\xa5\x89\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xa1 \xe0\xa4\xaa\xe0\xa4\xb9\xe0\xa4\x9a\xe0\xa4\xbe\xe0\xa4\xa8\xe0\xa4\x95\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xa4\xe0\xa4\xbe (\xe0\xa4\x86\xe0\xa4\x88\xe0\xa4\xa1\xe0\xa5\x80)',
|
||||
'record does not exist': 'रिकॉर्ड मौजूद नहीं है',
|
||||
'record id': 'रिकॉर्ड पहचानकर्ता (आईडी)',
|
||||
'register': 'register',
|
||||
'selected': '\xe0\xa4\x9a\xe0\xa5\x81\xe0\xa4\xa8\xe0\xa4\xbe \xe0\xa4\xb9\xe0\xa5\x81\xe0\xa4\x86',
|
||||
'state': '\xe0\xa4\xb8\xe0\xa5\x8d\xe0\xa4\xa5\xe0\xa4\xbf\xe0\xa4\xa4\xe0\xa4\xbf',
|
||||
'table': '\xe0\xa4\xa4\xe0\xa4\xbe\xe0\xa4\xb2\xe0\xa4\xbf\xe0\xa4\x95\xe0\xa4\xbe',
|
||||
'unable to parse csv file': 'csv \xe0\xa4\xab\xe0\xa4\xbc\xe0\xa4\xbe\xe0\xa4\x87\xe0\xa4\xb2 \xe0\xa4\xaa\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xb8 \xe0\xa4\x95\xe0\xa4\xb0\xe0\xa4\xa8\xe0\xa5\x87 \xe0\xa4\xae\xe0\xa5\x87\xe0\xa4\x82 \xe0\xa4\x85\xe0\xa4\xb8\xe0\xa4\xae\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xa5',
|
||||
'state': 'स्थिति',
|
||||
'table': 'तालिका',
|
||||
'unable to parse csv file': 'csv फ़ाइल पार्स करने में असमर्थ',
|
||||
}
|
||||
|
||||
|
||||
@@ -1,94 +1,98 @@
|
||||
# coding: utf8
|
||||
{
|
||||
'!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 rows deleted': '%s sorok t\xc3\xb6rl\xc5\x91dtek',
|
||||
'%s rows updated': '%s sorok friss\xc3\xadt\xc5\x91dtek',
|
||||
'Available databases and tables': 'El\xc3\xa9rhet\xc5\x91 adatb\xc3\xa1zisok \xc3\xa9s t\xc3\xa1bl\xc3\xa1k',
|
||||
'Cannot be empty': 'Nem lehet \xc3\xbcres',
|
||||
'Check to delete': 'T\xc3\xb6rl\xc3\xa9shez v\xc3\xa1laszd ki',
|
||||
'%s %%{row} deleted': '%s sorok törlődtek',
|
||||
'%s %%{row} updated': '%s sorok frissítődtek',
|
||||
'%s selected': '%s kiválasztott',
|
||||
'Administrative interface': 'az adminisztrációs felületért kattints ide',
|
||||
'Available databases and tables': 'Elérhető adatbázisok és táblák',
|
||||
'Cannot be empty': 'Nem lehet üres',
|
||||
'Check to delete': 'Törléshez válaszd ki',
|
||||
'Client IP': 'Client IP',
|
||||
'Controller': 'Controller',
|
||||
'Copyright': 'Copyright',
|
||||
'Current request': 'Jelenlegi lek\xc3\xa9rdez\xc3\xa9s',
|
||||
'Current response': 'Jelenlegi v\xc3\xa1lasz',
|
||||
'Current request': 'Jelenlegi lekérdezés',
|
||||
'Current response': 'Jelenlegi válasz',
|
||||
'Current session': 'Jelenlegi folyamat',
|
||||
'DB Model': 'DB Model',
|
||||
'Database': 'Adatb\xc3\xa1zis',
|
||||
'Delete:': 'T\xc3\xb6r\xc3\xb6l:',
|
||||
'Database': 'Adatbázis',
|
||||
'Delete:': 'Töröl:',
|
||||
'Description': 'Description',
|
||||
'E-mail': 'E-mail',
|
||||
'Edit': 'Szerkeszt',
|
||||
'Edit This App': 'Alkalmaz\xc3\xa1st szerkeszt',
|
||||
'Edit current record': 'Aktu\xc3\xa1lis bejegyz\xc3\xa9s szerkeszt\xc3\xa9se',
|
||||
'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\xc3\xa1g',
|
||||
'Hello World': 'Hello Világ',
|
||||
'Import/Export': 'Import/Export',
|
||||
'Index': 'Index',
|
||||
'Internal State': 'Internal State',
|
||||
'Invalid Query': 'Hib\xc3\xa1s lek\xc3\xa9rdez\xc3\xa9s',
|
||||
'Invalid Query': 'Hibás lekérdezés',
|
||||
'Invalid email': 'Invalid email',
|
||||
'Last name': 'Last name',
|
||||
'Layout': 'Szerkezet',
|
||||
'Main Menu': 'F\xc5\x91men\xc3\xbc',
|
||||
'Menu Model': 'Men\xc3\xbc model',
|
||||
'Main Menu': 'Főmenü',
|
||||
'Menu Model': 'Menü model',
|
||||
'Name': 'Name',
|
||||
'New Record': '\xc3\x9aj bejegyz\xc3\xa9s',
|
||||
'No databases in this application': 'Nincs adatb\xc3\xa1zis ebben az alkalmaz\xc3\xa1sban',
|
||||
'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\xc3\xa9rdez\xc3\xa9s:',
|
||||
'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\xc3\xa1bl\xc3\xa1ban',
|
||||
'Rows selected': 'Kiv\xc3\xa1lasztott sorok',
|
||||
'Rows in table': 'Sorok a táblában',
|
||||
'Rows selected': 'Kiválasztott sorok',
|
||||
'Stylesheet': 'Stylesheet',
|
||||
'Sure you want to delete this object?': 'Biztos t\xc3\xb6rli ezt az objektumot?',
|
||||
'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\xc3\xadt:',
|
||||
'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\xc3\xa9zet',
|
||||
'View': 'Nézet',
|
||||
'Welcome %s': 'Welcome %s',
|
||||
'Welcome to web2py': 'Isten hozott a web2py-ban',
|
||||
'appadmin is disabled because insecure channel': 'az appadmin a biztons\xc3\xa1gtalan csatorna miatt letiltva',
|
||||
'cache': 'gyors\xc3\xadt\xc3\xb3t\xc3\xa1r',
|
||||
'change password': 'jelsz\xc3\xb3 megv\xc3\xa1ltoztat\xc3\xa1sa',
|
||||
'Online examples': 'online p\xc3\xa9ld\xc3\xa1k\xc3\xa9rt kattints ide',
|
||||
'Administrative interface': 'az adminisztr\xc3\xa1ci\xc3\xb3s fel\xc3\xbclet\xc3\xa9rt kattints ide',
|
||||
'customize me!': 'v\xc3\xa1ltoztass meg!',
|
||||
'data uploaded': 'adat felt\xc3\xb6ltve',
|
||||
'database': 'adatb\xc3\xa1zis',
|
||||
'database %s select': 'adatb\xc3\xa1zis %s kiv\xc3\xa1laszt\xc3\xa1s',
|
||||
'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',
|
||||
'design': 'design',
|
||||
'done!': 'k\xc3\xa9sz!',
|
||||
'edit profile': 'profil szerkeszt\xc3\xa9se',
|
||||
'export as csv file': 'export\xc3\xa1l csv f\xc3\xa1jlba',
|
||||
'insert new': '\xc3\xbaj beilleszt\xc3\xa9se',
|
||||
'insert new %s': '\xc3\xbaj beilleszt\xc3\xa9se %s',
|
||||
'invalid request': 'hib\xc3\xa1s k\xc3\xa9r\xc3\xa9s',
|
||||
'login': 'bel\xc3\xa9p',
|
||||
'logout': 'kil\xc3\xa9p',
|
||||
'lost password': 'elveszett jelsz\xc3\xb3',
|
||||
'new record inserted': '\xc3\xbaj bejegyz\xc3\xa9s felv\xc3\xa9ve',
|
||||
'next 100 rows': 'k\xc3\xb6vetkez\xc5\x91 100 sor',
|
||||
'or import from csv file': 'vagy bet\xc3\xb6lt\xc3\xa9s csv f\xc3\xa1jlb\xc3\xb3l',
|
||||
'previous 100 rows': 'el\xc5\x91z\xc5\x91 100 sor',
|
||||
'record': 'bejegyz\xc3\xa9s',
|
||||
'record does not exist': 'bejegyz\xc3\xa9s nem l\xc3\xa9tezik',
|
||||
'record id': 'bejegyz\xc3\xa9s id',
|
||||
'register': 'regisztr\xc3\xa1ci\xc3\xb3',
|
||||
'selected': 'kiv\xc3\xa1lasztott',
|
||||
'state': '\xc3\xa1llapot',
|
||||
'table': 't\xc3\xa1bla',
|
||||
'unable to parse csv file': 'nem lehet a csv f\xc3\xa1jlt beolvasni',
|
||||
'done!': 'kész!',
|
||||
'edit profile': 'profil szerkesztése',
|
||||
'export as csv file': 'exportál csv fájlba',
|
||||
'insert new': 'új beillesztése',
|
||||
'insert new %s': 'új beillesztése %s',
|
||||
'invalid request': 'hibás kérés',
|
||||
'login': 'belép',
|
||||
'logout': 'kilép',
|
||||
'lost password': 'elveszett jelszó',
|
||||
'new record inserted': 'új bejegyzés felvéve',
|
||||
'next 100 rows': 'következő 100 sor',
|
||||
'or import from csv file': 'vagy betöltés csv fájlból',
|
||||
'previous 100 rows': 'előző 100 sor',
|
||||
'record': 'bejegyzés',
|
||||
'record does not exist': 'bejegyzés nem létezik',
|
||||
'record id': 'bejegyzés id',
|
||||
'register': 'regisztráció',
|
||||
'state': 'állapot',
|
||||
'table': 'tábla',
|
||||
'unable to parse csv file': 'nem lehet a csv fájlt beolvasni',
|
||||
}
|
||||
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
# 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 ',
|
||||
'%Y-%m-%d': '%d/%m/%Y',
|
||||
'%Y-%m-%d %H:%M:%S': '%d/%m/%Y %H:%M:%S',
|
||||
'%s rows deleted': '%s righe ("record") cancellate',
|
||||
'%s rows updated': '%s righe ("record") modificate',
|
||||
'%s %%{row} deleted': '%s righe ("record") cancellate',
|
||||
'%s %%{row} updated': '%s righe ("record") modificate',
|
||||
'%s selected': '%s selezionato',
|
||||
'Administrative interface': 'Interfaccia amministrativa',
|
||||
'Available databases and tables': 'Database e tabelle disponibili',
|
||||
'Cannot be empty': 'Non può essere vuoto',
|
||||
@@ -56,7 +59,7 @@
|
||||
'Sure you want to delete this object?': 'Vuoi veramente cancellare questo oggetto?',
|
||||
'Table name': 'Nome tabella',
|
||||
'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 output of the file is a dictionary that was rendered by the view': 'L\'output del file è un "dictionary" che è stato visualizzato dalla vista',
|
||||
'The output of the file is a dictionary that was rendered by the view %s': 'L\'output del file è un "dictionary" che è stato visualizzato dalla vista %s',
|
||||
'This is a copy of the scaffolding application': "Questa è una copia dell'applicazione di base (scaffold)",
|
||||
'Timestamp': 'Ora (timestamp)',
|
||||
'Update': 'Update',
|
||||
@@ -66,10 +69,10 @@
|
||||
'View': 'Vista',
|
||||
'Welcome %s': 'Benvenuto %s',
|
||||
'Welcome to web2py': 'Benvenuto su web2py',
|
||||
'Which called the function': 'che ha chiamato la funzione',
|
||||
'Which called the function %s located in the file %s': 'che ha chiamato la funzione %s presente nel file %s',
|
||||
'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': "Hai visitato l'URL",
|
||||
'You visited the url %s': "Hai visitato l'URL %s",
|
||||
'appadmin is disabled because insecure channel': 'Amministrazione (appadmin) disabilitata: comunicazione non sicura',
|
||||
'cache': 'cache',
|
||||
'change password': 'Cambia password',
|
||||
@@ -87,7 +90,6 @@
|
||||
'insert new': 'inserisci nuovo',
|
||||
'insert new %s': 'inserisci nuovo %s',
|
||||
'invalid request': 'richiesta non valida',
|
||||
'located in the file': 'presente nel file',
|
||||
'login': 'accesso',
|
||||
'logout': 'uscita',
|
||||
'lost password?': 'dimenticato la password?',
|
||||
@@ -100,9 +102,7 @@
|
||||
'record does not exist': 'il record non esiste',
|
||||
'record id': 'record id',
|
||||
'register': 'registrazione',
|
||||
'selected': 'selezionato',
|
||||
'state': 'stato',
|
||||
'table': 'tabella',
|
||||
'unable to parse csv file': 'non riesco a decodificare questo file CSV',
|
||||
}
|
||||
|
||||
|
||||
@@ -1,53 +1,58 @@
|
||||
# coding: utf8
|
||||
{
|
||||
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"Uaktualnij" jest dodatkowym wyra\xc5\xbceniem postaci "pole1=\'nowawarto\xc5\x9b\xc4\x87\'". Nie mo\xc5\xbcesz uaktualni\xc4\x87 lub usun\xc4\x85\xc4\x87 wynik\xc3\xb3w z JOIN:',
|
||||
'!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 rows deleted': 'Wierszy usuni\xc4\x99tych: %s',
|
||||
'%s rows updated': 'Wierszy uaktualnionych: %s',
|
||||
'%s %%{row} deleted': 'Wierszy usuniętych: %s',
|
||||
'%s %%{row} updated': 'Wierszy uaktualnionych: %s',
|
||||
'%s selected': '%s wybranych',
|
||||
'Administrative interface': 'Kliknij aby przejść do panelu administracyjnego',
|
||||
'Authentication': 'Uwierzytelnienie',
|
||||
'Available databases and tables': 'Dost\xc4\x99pne bazy danych i tabele',
|
||||
'Cannot be empty': 'Nie mo\xc5\xbce by\xc4\x87 puste',
|
||||
'Change Password': 'Zmie\xc5\x84 has\xc5\x82o',
|
||||
'Check to delete': 'Zaznacz aby usun\xc4\x85\xc4\x87',
|
||||
'Check to delete:': 'Zaznacz aby usun\xc4\x85\xc4\x87:',
|
||||
'Available databases and tables': 'Dostępne bazy danych i tabele',
|
||||
'Cannot be empty': 'Nie może być puste',
|
||||
'Change Password': 'Zmień hasło',
|
||||
'Check to delete': 'Zaznacz aby usunąć',
|
||||
'Check to delete:': 'Zaznacz aby usunąć:',
|
||||
'Client IP': 'IP klienta',
|
||||
'Controller': 'Kontroler',
|
||||
'Copyright': 'Copyright',
|
||||
'Current request': 'Aktualne \xc5\xbc\xc4\x85danie',
|
||||
'Current response': 'Aktualna odpowied\xc5\xba',
|
||||
'Current request': 'Aktualne żądanie',
|
||||
'Current response': 'Aktualna odpowiedź',
|
||||
'Current session': 'Aktualna sesja',
|
||||
'DB Model': 'Model bazy danych',
|
||||
'Database': 'Baza danych',
|
||||
'Delete:': 'Usu\xc5\x84:',
|
||||
'Delete:': 'Usuń:',
|
||||
'Description': 'Opis',
|
||||
'E-mail': 'Adres e-mail',
|
||||
'Edit': 'Edycja',
|
||||
'Edit Profile': 'Edytuj profil',
|
||||
'Edit This App': 'Edytuj t\xc4\x99 aplikacj\xc4\x99',
|
||||
'Edit This App': 'Edytuj tę aplikację',
|
||||
'Edit current record': 'Edytuj obecny rekord',
|
||||
'First name': 'Imi\xc4\x99',
|
||||
'Function disabled': 'Funkcja wy\xc5\x82\xc4\x85czona',
|
||||
'First name': 'Imię',
|
||||
'Function disabled': 'Funkcja wyłączona',
|
||||
'Group ID': 'ID grupy',
|
||||
'Hello World': 'Witaj \xc5\x9awiecie',
|
||||
'Hello World': 'Witaj Świecie',
|
||||
'Import/Export': 'Importuj/eksportuj',
|
||||
'Index': 'Indeks',
|
||||
'Internal State': 'Stan wewn\xc4\x99trzny',
|
||||
'Invalid Query': 'B\xc5\x82\xc4\x99dne zapytanie',
|
||||
'Invalid email': 'B\xc5\x82\xc4\x99dny adres email',
|
||||
'Internal State': 'Stan wewnętrzny',
|
||||
'Invalid Query': 'Błędne zapytanie',
|
||||
'Invalid email': 'Błędny adres email',
|
||||
'Last name': 'Nazwisko',
|
||||
'Layout': 'Uk\xc5\x82ad',
|
||||
'Layout': 'Układ',
|
||||
'Login': 'Zaloguj',
|
||||
'Logout': 'Wyloguj',
|
||||
'Lost Password': 'Przypomnij has\xc5\x82o',
|
||||
'Main Menu': 'Menu g\xc5\x82\xc3\xb3wne',
|
||||
'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',
|
||||
'Origin': '\xc5\xb9r\xc3\xb3d\xc5\x82o',
|
||||
'Password': 'Has\xc5\x82o',
|
||||
"Password fields don't match": 'Pola has\xc5\x82a nie s\xc4\x85 zgodne ze sob\xc4\x85',
|
||||
'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',
|
||||
@@ -56,29 +61,30 @@
|
||||
'Role': 'Rola',
|
||||
'Rows in table': 'Wiersze w tabeli',
|
||||
'Rows selected': 'Wybrane wiersze',
|
||||
'Stylesheet': 'Arkusz styl\xc3\xb3w',
|
||||
'Submit': 'Wy\xc5\x9blij',
|
||||
'Sure you want to delete this object?': 'Czy na pewno chcesz usun\xc4\x85\xc4\x87 ten obiekt?',
|
||||
'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\xc5\x9b\xc4\x87\'". Takie co\xc5\x9b jak "db.tabela1.pole1==db.tabela2.pole2" oznacza 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.': '"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\xc5\xbcyj (...)&(...) jako AND, (...)|(...) jako OR oraz ~(...) jako NOT do tworzenia bardziej skomplikowanych zapyta\xc5\x84.',
|
||||
'User %(id)s Registered': 'U\xc5\xbcytkownik %(id)s zosta\xc5\x82 zarejestrowany',
|
||||
'User ID': 'ID u\xc5\xbcytkownika',
|
||||
'Verify Password': 'Potwierd\xc5\xba has\xc5\x82o',
|
||||
'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',
|
||||
'appadmin is disabled because insecure channel': 'administracja aplikacji wy\xc5\x82\xc4\x85czona z powodu braku bezpiecznego po\xc5\x82\xc4\x85czenia',
|
||||
'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',
|
||||
'Online examples': 'Kliknij aby przej\xc5\x9b\xc4\x87 do interaktywnych przyk\xc5\x82ad\xc3\xb3w',
|
||||
'Administrative interface': 'Kliknij aby przej\xc5\x9b\xc4\x87 do panelu administracyjnego',
|
||||
'customize me!': 'dostosuj mnie!',
|
||||
'data uploaded': 'dane wys\xc5\x82ane',
|
||||
'data uploaded': 'dane wysłane',
|
||||
'database': 'baza danych',
|
||||
'database %s select': 'wyb\xc3\xb3r z bazy danych %s',
|
||||
'database %s select': 'wybór z bazy danych %s',
|
||||
'db': 'baza danych',
|
||||
'design': 'projektuj',
|
||||
'done!': 'zrobione!',
|
||||
@@ -86,20 +92,18 @@
|
||||
'export as csv file': 'eksportuj jako plik csv',
|
||||
'insert new': 'wstaw nowy rekord tabeli',
|
||||
'insert new %s': 'wstaw nowy rekord do tabeli %s',
|
||||
'invalid request': 'B\xc5\x82\xc4\x99dne \xc5\xbc\xc4\x85danie',
|
||||
'invalid request': 'Błędne żądanie',
|
||||
'login': 'login',
|
||||
'logout': 'logout',
|
||||
'new record inserted': 'nowy rekord zosta\xc5\x82 wstawiony',
|
||||
'next 100 rows': 'nast\xc4\x99pne 100 wierszy',
|
||||
'new record inserted': 'nowy rekord został wstawiony',
|
||||
'next 100 rows': 'następne 100 wierszy',
|
||||
'or import from csv file': 'lub zaimportuj z pliku csv',
|
||||
'previous 100 rows': 'poprzednie 100 wierszy',
|
||||
'record': 'rekord',
|
||||
'record does not exist': 'rekord nie istnieje',
|
||||
'record id': 'id rekordu',
|
||||
'register': 'register',
|
||||
'selected': 'wybranych',
|
||||
'state': 'stan',
|
||||
'table': 'tabela',
|
||||
'unable to parse csv file': 'nie mo\xc5\xbcna sparsowa\xc4\x87 pliku csv',
|
||||
'unable to parse csv file': 'nie można sparsować pliku csv',
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
#!/usr/bin/env python
|
||||
{
|
||||
# "singular form (0)": ["first plural form (1)", "second plural form (2)", ...],
|
||||
'account': ['accounts'],
|
||||
'book': ['books'],
|
||||
'is': ['are'],
|
||||
'man': ['men'],
|
||||
'person': ['people'],
|
||||
'shop': ['shops'],
|
||||
'this': ['these'],
|
||||
'was': ['were'],
|
||||
'woman': ['women'],
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
#!/usr/bin/env python
|
||||
{
|
||||
# "singular form (0)": ["first plural form (1)", "second plural form (2)", ...],
|
||||
'выбрана': ['выбраны','выбрано'],
|
||||
'запись': ['записи','записей'],
|
||||
'изменена': ['изменены','изменено'],
|
||||
'строка': ['строки','строк'],
|
||||
'удалена': ['удалены','удалено'],
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
#!/usr/bin/env python
|
||||
{
|
||||
# "singular form (0)": ["first plural form (1)", "second plural form (2)", ...],
|
||||
'байт': ['байти','байтів'],
|
||||
'годину': ['години','годин'],
|
||||
'елемент': ['елементи','елементів'],
|
||||
'запис': ['записи','записів'],
|
||||
'поцілювання': ['поцілювання','поцілювань'],
|
||||
'рядок': ['рядки','рядків'],
|
||||
'секунду': ['секунди','секунд'],
|
||||
'схибнення': ['схибнення','схибнень'],
|
||||
'хвилину': ['хвилини','хвилин'],
|
||||
}
|
||||
@@ -1,12 +1,16 @@
|
||||
# coding: utf8
|
||||
{
|
||||
'!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 rows deleted': '%s linhas apagadas',
|
||||
'%s rows updated': '%s linhas atualizadas',
|
||||
'%s %%{row} deleted': '%s linhas apagadas',
|
||||
'%s %%{row} updated': '%s linhas atualizadas',
|
||||
'%s selected': '%s selecionado',
|
||||
'About': 'About',
|
||||
'Access Control': 'Access Control',
|
||||
'Administrative interface': 'Interface administrativa',
|
||||
'Ajax Recipes': 'Ajax Recipes',
|
||||
'Available databases and tables': 'Bancos de dados e tabelas disponíveis',
|
||||
'Buy this book': 'Buy this book',
|
||||
@@ -57,6 +61,7 @@
|
||||
'Name': 'Name',
|
||||
'New Record': 'Novo Registro',
|
||||
'No databases in this application': 'Sem bancos de dados nesta aplicação',
|
||||
'Online examples': 'Alguns exemplos',
|
||||
'Origin': 'Origin',
|
||||
'Other Recipes': 'Other Recipes',
|
||||
'Overview': 'Overview',
|
||||
@@ -85,7 +90,7 @@
|
||||
'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': 'The output of the file is a dictionary that was rendered by the view',
|
||||
'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',
|
||||
'This App': 'This App',
|
||||
'This is a copy of the scaffolding application': 'This is a copy of the scaffolding application',
|
||||
'Timestamp': 'Timestamp',
|
||||
@@ -100,30 +105,26 @@
|
||||
'Welcome': 'Welcome',
|
||||
'Welcome %s': 'Vem vindo %s',
|
||||
'Welcome to web2py': 'Bem vindo ao web2py',
|
||||
'Which called the function': 'Which called the function',
|
||||
'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': 'You visited the url',
|
||||
'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',
|
||||
'Online examples': 'Alguns exemplos',
|
||||
'Administrative interface': 'Interface administrativa',
|
||||
'customize me!': 'Personalize-me!',
|
||||
'data uploaded': 'dados enviados',
|
||||
'database': 'banco de dados',
|
||||
'database %s select': 'Selecionar banco de dados %s',
|
||||
'db': 'bd',
|
||||
'design': 'design',
|
||||
'Documentation': 'Documentation',
|
||||
'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',
|
||||
'located in the file': 'located in the file',
|
||||
'login': 'Entrar',
|
||||
'logout': 'Sair',
|
||||
'lost password?': 'lost password?',
|
||||
@@ -135,9 +136,7 @@
|
||||
'record does not exist': 'registro não existe',
|
||||
'record id': 'id do registro',
|
||||
'register': 'Registre-se',
|
||||
'selected': 'selecionado',
|
||||
'state': 'estado',
|
||||
'table': 'tabela',
|
||||
'unable to parse csv file': 'não foi possível analisar arquivo csv',
|
||||
}
|
||||
|
||||
|
||||
@@ -1,11 +1,15 @@
|
||||
# coding: utf8
|
||||
{
|
||||
'!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 rows deleted': '%s linhas eliminadas',
|
||||
'%s rows updated': '%s linhas actualizadas',
|
||||
'%s %%{row} deleted': '%s linhas eliminadas',
|
||||
'%s %%{row} updated': '%s linhas actualizadas',
|
||||
'%s selected': '%s seleccionado(s)',
|
||||
'About': 'About',
|
||||
'Administrative interface': 'Painel administrativo',
|
||||
'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',
|
||||
@@ -47,6 +51,7 @@
|
||||
'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',
|
||||
@@ -58,6 +63,7 @@
|
||||
'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.',
|
||||
@@ -67,11 +73,11 @@
|
||||
'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',
|
||||
'Online examples': 'Exemplos online',
|
||||
'Administrative interface': 'Painel administrativo',
|
||||
'create new category': 'create new category',
|
||||
'create new comment': 'create new comment',
|
||||
'create new post': 'create new post',
|
||||
@@ -106,7 +112,6 @@
|
||||
'select category': 'select category',
|
||||
'select comment': 'select comment',
|
||||
'select post': 'select post',
|
||||
'selected': 'seleccionado(s)',
|
||||
'show category': 'show category',
|
||||
'show comment': 'show comment',
|
||||
'show post': 'show post',
|
||||
@@ -114,4 +119,3 @@
|
||||
'table': 'tabela',
|
||||
'unable to parse csv file': 'não foi possível carregar ficheiro csv',
|
||||
}
|
||||
|
||||
|
||||
@@ -1,12 +1,15 @@
|
||||
# coding: utf8
|
||||
{
|
||||
'!=': '!=',
|
||||
'!langcode!': 'ro',
|
||||
'!langname!': 'Română',
|
||||
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"update" (actualizează) este o expresie opțională precum "câmp1=\'valoare_nouă\'". Nu puteți actualiza sau șterge rezultatele unui JOIN',
|
||||
'%(nrows)s records found': '%(nrows)s înregistrări găsite',
|
||||
'%Y-%m-%d': '%Y-%m-%d',
|
||||
'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
|
||||
'%s rows deleted': '%s linii șterse',
|
||||
'%s rows updated': '%s linii actualizate',
|
||||
'%s %%{row} deleted': '%s linii șterse',
|
||||
'%s %%{row} updated': '%s linii actualizate',
|
||||
'%s selected': '%s selectat(e)',
|
||||
'(something like "it-it")': '(ceva ce seamănă cu "it-it")',
|
||||
'<': '<',
|
||||
'<=': '<=',
|
||||
@@ -182,7 +185,7 @@
|
||||
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': '"Interogarea (query)" este o condiție de tipul "db.tabel1.câmp1==\'valoare\'". Ceva de genul "db.tabel1.câmp1==db.tabel2.câmp2" generează un JOIN SQL.',
|
||||
'The Core': 'Nucleul',
|
||||
'The Views': 'Vederile',
|
||||
'The output of the file is a dictionary that was rendered by the view': 'Fișierul produce un dicționar care a fost prelucrat de vederea',
|
||||
'The output of the file is a dictionary that was rendered by the view %s': 'Fișierul produce un dicționar care a fost prelucrat de vederea %s',
|
||||
'There are no controllers': 'Nu există controlori',
|
||||
'There are no models': 'Nu există modele',
|
||||
'There are no modules': 'Nu există module',
|
||||
@@ -217,11 +220,11 @@
|
||||
'Welcome %s': 'Bine ați venit %s',
|
||||
'Welcome to web2py': 'Bun venit la web2py',
|
||||
'Welcome to web2py!': 'Bun venit la web2py!',
|
||||
'Which called the function': 'Care a apelat funcția',
|
||||
'Which called the function %s located in the file %s': 'Care a apelat funcția %s prezentă în fișierul %s',
|
||||
'YES': 'DA',
|
||||
'You are successfully running web2py': 'Rulați cu succes web2py',
|
||||
'You can modify this application and adapt it to your needs': 'Puteți modifica și adapta aplicația nevoilor dvs.',
|
||||
'You visited the url': 'Ați vizitat adresa',
|
||||
'You visited the url %s': 'Ați vizitat adresa %s',
|
||||
'about': 'despre',
|
||||
'additional code for your application': 'cod suplimentar pentru aplicația dvs.',
|
||||
'admin disabled because no admin password': 'administrare dezactivată deoarece parola de administrator nu a fost furnizată',
|
||||
@@ -293,7 +296,6 @@
|
||||
'languages': 'limbi',
|
||||
'languages updated': 'limbi actualizate',
|
||||
'loading...': 'încarc...',
|
||||
'located in the file': 'prezentă în fișierul',
|
||||
'login': 'autentificare',
|
||||
'logout': 'ieșire',
|
||||
'merge': 'unește',
|
||||
@@ -316,7 +318,6 @@
|
||||
'restore': 'restaurare',
|
||||
'revert': 'revenire',
|
||||
'save': 'salvare',
|
||||
'selected': 'selectat(e)',
|
||||
'session expired': 'sesiune expirată',
|
||||
'shell': 'line de commandă',
|
||||
'site': 'site',
|
||||
|
||||
@@ -1,61 +1,146 @@
|
||||
# coding: utf8
|
||||
{
|
||||
'!langcode!': 'ru',
|
||||
'!langname!': 'Русский',
|
||||
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"Изменить" - необязательное выражение вида "field1=\'новое значение\'". Результаты операции JOIN нельзя изменить или удалить.',
|
||||
'%s %%{row} deleted': '%%{!удалена[0]} %s %%{строка[0]}',
|
||||
'%s %%{row} updated': '%%{!изменена[0]} %s %%{строка[0]}',
|
||||
'%s selected': '%%{!выбрана[0]} %s %%{запись[0]}',
|
||||
'%Y-%m-%d': '%Y-%m-%d',
|
||||
'%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S',
|
||||
'%s rows deleted': '%s строк удалено',
|
||||
'%s rows updated': '%s строк изменено',
|
||||
'About': 'About',
|
||||
'Access Control': 'Access Control',
|
||||
'Administrative Interface': 'Administrative Interface',
|
||||
'Administrative interface': 'административный интерфейс',
|
||||
'Ajax Recipes': 'Ajax Recipes',
|
||||
'Are you sure you want to delete this object?': 'Вы уверены, что хотите удалить этот объект?',
|
||||
'Available databases and tables': 'Базы данных и таблицы',
|
||||
'Buy this book': 'Buy this book',
|
||||
'cache': 'cache',
|
||||
'Cannot be empty': 'Пустое значение недопустимо',
|
||||
'Change Password': 'Смените пароль',
|
||||
'Check to delete': 'Удалить',
|
||||
'Check to delete:': 'Удалить:',
|
||||
'Client IP': 'Client IP',
|
||||
'Community': 'Community',
|
||||
'Components and Plugins': 'Components and Plugins',
|
||||
'Controller': 'Controller',
|
||||
'Copyright': 'Copyright',
|
||||
'Current request': 'Текущий запрос',
|
||||
'Current response': 'Текущий ответ',
|
||||
'Current session': 'Текущая сессия',
|
||||
'customize me!': 'настройте внешний вид!',
|
||||
'data uploaded': 'данные загружены',
|
||||
'Database': 'Database',
|
||||
'database': 'база данных',
|
||||
'database %s select': 'выбор базы данных %s',
|
||||
'db': 'БД',
|
||||
'DB Model': 'DB Model',
|
||||
'Delete:': 'Удалить:',
|
||||
'Demo': 'Demo',
|
||||
'Deployment Recipes': 'Deployment Recipes',
|
||||
'Description': 'Описание',
|
||||
'design': 'дизайн',
|
||||
'Documentation': 'Documentation',
|
||||
"Don't know what to do?": "Don't know what to do?",
|
||||
'done!': 'готово!',
|
||||
'Download': 'Download',
|
||||
'E-mail': 'E-mail',
|
||||
'Edit Profile': 'Редактировать профиль',
|
||||
'Edit current record': 'Редактировать текущую запись',
|
||||
'Edit Profile': 'Редактировать профиль',
|
||||
'Email and SMS': 'Email and SMS',
|
||||
'enter an integer between %(min)g and %(max)g': 'enter an integer between %(min)g and %(max)g',
|
||||
'Errors': 'Errors',
|
||||
'export as csv file': 'экспорт в csv-файл',
|
||||
'FAQ': 'FAQ',
|
||||
'First name': 'Имя',
|
||||
'Forms and Validators': 'Forms and Validators',
|
||||
'Free Applications': 'Free Applications',
|
||||
'Group ID': 'Group ID',
|
||||
'Groups': 'Groups',
|
||||
'Hello World': 'Заработало!',
|
||||
'Home': 'Home',
|
||||
'How did you get here?': 'How did you get here?',
|
||||
'import': 'import',
|
||||
'Import/Export': 'Импорт/экспорт',
|
||||
'insert new': 'добавить',
|
||||
'insert new %s': 'добавить %s',
|
||||
'Internal State': 'Внутренне состояние',
|
||||
'Invalid Query': 'Неверный запрос',
|
||||
'Introduction': 'Introduction',
|
||||
'Invalid email': 'Неверный email',
|
||||
'Invalid login': 'Неверный логин',
|
||||
'Invalid password': 'Неверный пароль',
|
||||
'Invalid Query': 'Неверный запрос',
|
||||
'invalid request': 'неверный запрос',
|
||||
'Last name': 'Фамилия',
|
||||
'Layout': 'Layout',
|
||||
'Layout Plugins': 'Layout Plugins',
|
||||
'Layouts': 'Layouts',
|
||||
'Live Chat': 'Live Chat',
|
||||
'Logged in': 'Вход выполнен',
|
||||
'Logged out': 'Выход выполнен',
|
||||
'login': 'вход',
|
||||
'Login': 'Вход',
|
||||
'logout': 'выход',
|
||||
'Logout': 'Выход',
|
||||
'Lost Password': 'Забыли пароль?',
|
||||
'Lost password?': 'Lost password?',
|
||||
'Menu Model': 'Menu Model',
|
||||
'My Sites': 'My Sites',
|
||||
'Name': 'Name',
|
||||
'New Record': 'Новая запись',
|
||||
'New password': 'Новый пароль',
|
||||
'New Record': 'Новая запись',
|
||||
'new record inserted': 'новая запись добавлена',
|
||||
'next 100 rows': 'следующие 100 строк',
|
||||
'No databases in this application': 'В приложении нет баз данных',
|
||||
'Object or table name': 'Object or table name',
|
||||
'Old password': 'Старый пароль',
|
||||
'Online examples': 'примеры он-лайн',
|
||||
'or import from csv file': 'или импорт из csv-файла',
|
||||
'Origin': 'Происхождение',
|
||||
'Other Plugins': 'Other Plugins',
|
||||
'Other Recipes': 'Other Recipes',
|
||||
'Overview': 'Overview',
|
||||
'password': 'пароль',
|
||||
'Password': 'Пароль',
|
||||
"Password fields don't match": 'Пароли не совпадают',
|
||||
'Plugins': 'Plugins',
|
||||
'Powered by': 'Powered by',
|
||||
'Preface': 'Preface',
|
||||
'previous 100 rows': 'предыдущие 100 строк',
|
||||
'profile': 'профиль',
|
||||
'Python': 'Python',
|
||||
'Query:': 'Запрос:',
|
||||
'Quick Examples': 'Quick Examples',
|
||||
'Recipes': 'Recipes',
|
||||
'record does not exist': 'запись не найдена',
|
||||
'record id': 'id записи',
|
||||
'Record ID': 'ID записи',
|
||||
'Register': 'Зарегистрироваться',
|
||||
'Registration identifier': 'Registration identifier',
|
||||
'Registration key': 'Ключ регистрации',
|
||||
'Remember me (for 30 days)': 'Запомнить меня (на 30 дней)',
|
||||
'Reset Password key': 'Сбросить ключ пароля',
|
||||
'Role': 'Роль',
|
||||
'Rows in table': 'Строк в таблице',
|
||||
'Rows selected': 'Выделено строк',
|
||||
'Semantic': 'Semantic',
|
||||
'Services': 'Services',
|
||||
'state': 'состояние',
|
||||
'Stylesheet': 'Stylesheet',
|
||||
'Submit': 'Отправить',
|
||||
'Support': 'Support',
|
||||
'Sure you want to delete this object?': 'Подтвердите удаление объекта',
|
||||
'table': 'таблица',
|
||||
'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.': '"Запрос" - это условие вида "db.table1.field1==\'значение\'". Выражение вида "db.table1.field1==db.table2.field2" формирует 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',
|
||||
'Timestamp': 'Отметка времени',
|
||||
'Twitter': 'Twitter',
|
||||
'unable to parse csv file': 'нечитаемый csv-файл',
|
||||
'Update:': 'Изменить:',
|
||||
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Для построение сложных запросов используйте операторы "И": (...)&(...), "ИЛИ": (...)|(...), "НЕ": ~(...).',
|
||||
'User %(id)s Logged-in': 'Пользователь %(id)s вошёл',
|
||||
@@ -65,33 +150,13 @@
|
||||
'User %(id)s Registered': 'Пользователь %(id)s зарегистрировался',
|
||||
'User ID': 'ID пользователя',
|
||||
'Verify Password': 'Повторите пароль',
|
||||
'Videos': 'Videos',
|
||||
'View': 'View',
|
||||
'Welcome': 'Welcome',
|
||||
'Welcome to web2py': 'Добро пожаловать в web2py',
|
||||
'Online examples': 'примеры он-лайн',
|
||||
'Administrative interface': 'административный интерфейс',
|
||||
'customize me!': 'настройте внешний вид!',
|
||||
'data uploaded': 'данные загружены',
|
||||
'database': 'база данных',
|
||||
'database %s select': 'выбор базы данных %s',
|
||||
'db': 'БД',
|
||||
'design': 'дизайн',
|
||||
'done!': 'готово!',
|
||||
'export as csv file': 'экспорт в csv-файл',
|
||||
'insert new': 'добавить',
|
||||
'insert new %s': 'добавить %s',
|
||||
'invalid request': 'неверный запрос',
|
||||
'login': 'вход',
|
||||
'logout': 'выход',
|
||||
'new record inserted': 'новая запись добавлена',
|
||||
'next 100 rows': 'следующие 100 строк',
|
||||
'or import from csv file': 'или импорт из csv-файла',
|
||||
'password': 'пароль',
|
||||
'previous 100 rows': 'предыдущие 100 строк',
|
||||
'profile': 'профиль',
|
||||
'record does not exist': 'запись не найдена',
|
||||
'record id': 'id записи',
|
||||
'selected': 'выбрано',
|
||||
'state': 'состояние',
|
||||
'table': 'таблица',
|
||||
'unable to parse csv file': 'нечитаемый csv-файл',
|
||||
'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,10 +1,14 @@
|
||||
# coding: utf8
|
||||
{
|
||||
'!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 rows deleted': '%s zmazaných záznamov',
|
||||
'%s rows updated': '%s upravených záznamov',
|
||||
'%s %%{row} deleted': '%s zmazaných záznamov',
|
||||
'%s %%{row} updated': '%s upravených záznamov',
|
||||
'%s selected': '%s označených',
|
||||
'Administrative interface': 'pre administrátorské rozhranie kliknite sem',
|
||||
'Available databases and tables': 'Dostupné databázy a tabuľky',
|
||||
'Cannot be empty': 'Nemôže byť prázdne',
|
||||
'Check to delete': 'Označiť na zmazanie',
|
||||
@@ -17,6 +21,7 @@
|
||||
'Database': 'Databáza',
|
||||
'Delete:': 'Zmazať:',
|
||||
'Description': 'Popis',
|
||||
'Documentation': 'Dokumentácia',
|
||||
'Edit': 'Upraviť',
|
||||
'Edit Profile': 'Upraviť profil',
|
||||
'Edit current record': 'Upraviť aktuálny záznam',
|
||||
@@ -26,8 +31,8 @@
|
||||
'Import/Export': 'Import/Export',
|
||||
'Index': 'Index',
|
||||
'Internal State': 'Vnútorný stav',
|
||||
'Invalid email': 'Neplatný email',
|
||||
'Invalid Query': 'Neplatná otázka',
|
||||
'Invalid email': 'Neplatný email',
|
||||
'Invalid password': 'Nesprávne heslo',
|
||||
'Last name': 'Priezvisko',
|
||||
'Layout': 'Layout',
|
||||
@@ -40,6 +45,7 @@
|
||||
'New password': 'Nové heslo',
|
||||
'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',
|
||||
'Origin': 'Pôvod',
|
||||
'Password': 'Heslo',
|
||||
'Powered by': 'Powered by',
|
||||
@@ -52,12 +58,12 @@
|
||||
'Role': 'Rola',
|
||||
'Rows in table': 'riadkov v tabuľke',
|
||||
'Rows selected': 'označených riadkov',
|
||||
'Submit': 'Odoslať',
|
||||
'Stylesheet': 'Stylesheet',
|
||||
'Submit': 'Odoslať',
|
||||
'Sure you want to delete this object?': 'Ste si istí, že chcete zmazať tento objekt?',
|
||||
'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 output of the file is a dictionary that was rendered by the view': 'Výstup zo súboru je slovník, ktorý bol zobrazený vo view',
|
||||
'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',
|
||||
'This is a copy of the scaffolding application': 'Toto je kópia skeletu aplikácie',
|
||||
'Timestamp': 'Časová pečiatka',
|
||||
'Update:': 'Upraviť:',
|
||||
@@ -71,27 +77,23 @@
|
||||
'Verify Password': 'Zopakujte heslo',
|
||||
'View': 'Zobraziť',
|
||||
'Welcome to web2py': 'Vitajte vo web2py',
|
||||
'Which called the function': 'Ktorý zavolal funkciu',
|
||||
'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': 'Navštívili ste URL',
|
||||
'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',
|
||||
'Online examples': 'pre online príklady kliknite sem',
|
||||
'Administrative interface': 'pre administrátorské rozhranie kliknite sem',
|
||||
'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',
|
||||
'Documentation': 'Dokumentácia',
|
||||
'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',
|
||||
'located in the file': 'nachádzajúci sa v súbore ',
|
||||
'login': 'prihlásiť',
|
||||
'logout': 'odhlásiť',
|
||||
'lost password?': 'stratené heslo?',
|
||||
@@ -104,9 +106,7 @@
|
||||
'record does not exist': 'záznam neexistuje',
|
||||
'record id': 'id záznamu',
|
||||
'register': 'registrovať',
|
||||
'selected': 'označených',
|
||||
'state': 'stav',
|
||||
'table': 'tabuľka',
|
||||
'unable to parse csv file': 'nedá sa načítať csv súbor',
|
||||
}
|
||||
|
||||
|
||||
@@ -1,22 +1,39 @@
|
||||
# coding: utf8
|
||||
{
|
||||
'!langcode!': 'uk',
|
||||
'!langname!': 'Українська',
|
||||
'"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"Оновити" це додатковий вираз, такий, як "field1=\'нове_значення\'". Ви не можете змінювати або вилучати дані об\'єднаних таблиць.',
|
||||
'%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',
|
||||
'%s rows deleted': '%s рядків вилучено',
|
||||
'%s rows updated': '%s рядків оновлено',
|
||||
'@markmin\x01(**%.0d MB**)': '(**``%.0d``:red МБ**)',
|
||||
'@markmin\x01**%(items)s** %%{item(items)}, **%(bytes)s** %%{byte(bytes)}': '**%(items)s** %%{елемент(items)}, **%(bytes)s** %%{байт(bytes)}',
|
||||
'@markmin\x01``**not available**``:red (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)': '**нема в наявності** (потребує Пітонівської бібліотеки [[guppy {посилання відкриється у новому вікні} http://pypi.python.org/pypi/guppy/ popup]])',
|
||||
'@markmin\x01Cache contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.': "Час життя об'єктів в КЕШІ сягає **%(hours)02d** %%{годину(hours)} **%(min)02d** %%{хвилину(min)} та **%(sec)02d** %%{секунду(sec)}.",
|
||||
'@markmin\x01DISK contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.': "Час життя об'єктів в ДИСКОВОМУ КЕШІ сягає **%(hours)02d** %%{годину(hours)} **%(min)02d** %%{хвилину(min)} та **%(sec)02d** %%{секунду(sec)}.",
|
||||
'@markmin\x01Hit Ratio: **%(ratio)s%%** (**%(hits)s** %%{hit(hits)} and **%(misses)s** %%{miss(misses)})': 'Оцінка поцілювання: **%(ratio)s%%** (**%(hits)s** %%{поцілювання(hits)} та **%(misses)s** %%{схибнення(misses)})',
|
||||
'@markmin\x01Number of entries: **%s**': 'Кількість входжень: ``**%s**``:red',
|
||||
'@markmin\x01RAM contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.': "Час життя об'єктів в ОЗП-КЕШІ сягає **%(hours)02d** %%{годину(hours)} **%(min)02d** %%{хвилину(min)} та **%(sec)02d** %%{секунду(sec)}.",
|
||||
'About': 'Про додаток',
|
||||
'Access Control': 'Контроль доступу',
|
||||
'Administrative Interface': 'Адміністративний інтерфейс',
|
||||
'Ajax Recipes': 'Рецепти для Ajax',
|
||||
'appadmin is disabled because insecure channel': 'використовується незахищенний канал (HTTP). Appadmin вимкнено',
|
||||
'Are you sure you want to delete this object?': "Ви впевнені, що хочете вилучити цей об'єкт?",
|
||||
'Available databases and tables': 'Доступні бази даних та таблиці',
|
||||
'Buy this book': 'Купити книжку',
|
||||
'cache': 'кеш',
|
||||
'Cache': 'Кеш',
|
||||
'Cache Keys': 'Ключі кешу',
|
||||
'Cannot be empty': 'Порожнє значення неприпустиме',
|
||||
'Change password': 'Змінити пароль',
|
||||
'Check to delete': 'Позначити для вилучення',
|
||||
'Check to delete:': 'Позначте для вилучення:',
|
||||
'Clear CACHE?': 'Очистити ВЕСЬ кеш?',
|
||||
'Clear DISK': 'Очистити ДИСКОВИЙ кеш',
|
||||
'Clear RAM': "Очистити кеш В ПАМ'ЯТІ",
|
||||
'Client IP': 'IP клієнта',
|
||||
'Community': 'Спільнота',
|
||||
'Components and Plugins': 'Компоненти та втулки',
|
||||
@@ -25,23 +42,36 @@
|
||||
'Current request': 'Поточний запит (current request)',
|
||||
'Current response': 'Поточна відповідь (current response)',
|
||||
'Current session': 'Поточна сесія (current session)',
|
||||
'DB Model': 'Модель БД',
|
||||
'customize me!': 'причепуріть мене!',
|
||||
'data uploaded': 'дані завантажено',
|
||||
'database': 'база даних',
|
||||
'Database': 'База даних',
|
||||
'database %s select': 'Вибірка з бази даних %s',
|
||||
'db': 'база даних',
|
||||
'DB Model': 'Модель БД',
|
||||
'Delete:': 'Вилучити:',
|
||||
'Demo': 'Демо',
|
||||
'Deployment Recipes': 'Способи розгортання',
|
||||
'Description': 'Опис',
|
||||
'design': 'налаштування',
|
||||
'DISK': 'ДИСК',
|
||||
'Disk Cache Keys': 'Ключі дискового кешу',
|
||||
'Disk Cleared': 'Дисковий кеш очищено',
|
||||
'Documentation': 'Документація',
|
||||
"Don't know what to do?": 'Не знаєте що робити далі?',
|
||||
'done!': 'зроблено!',
|
||||
'Download': 'Завантажити',
|
||||
'E-mail': 'Ел.пошта',
|
||||
'Edit Page': 'Редагувати сторінку',
|
||||
'edit': 'редагувати',
|
||||
'Edit current record': 'Редагувати поточний запис',
|
||||
'Edit Page': 'Редагувати сторінку',
|
||||
'Email and SMS': 'Ел.пошта та SMS',
|
||||
'enter a value': 'введіть значення',
|
||||
'enter an integer between %(min)g and %(max)g': 'введіть ціле число між %(min)g та %(max)g',
|
||||
'Error!': 'Помилка!',
|
||||
'Errors': 'Помилки',
|
||||
'Errors in form, please check it out.': 'У формі є помилка. Виправте її, будь-ласка.',
|
||||
'export as csv file': 'експортувати як файл csv',
|
||||
'FAQ': 'ЧаПи (FAQ)',
|
||||
'First name': "Ім'я",
|
||||
'Forms and Validators': 'Форми та коректність даних',
|
||||
@@ -53,13 +83,18 @@
|
||||
'Hello World': 'Привіт, світ!',
|
||||
'Home': 'Початок',
|
||||
'How did you get here?': 'Як цього було досягнуто?',
|
||||
'import': 'Імпортувати',
|
||||
'Import/Export': 'Імпорт/Експорт',
|
||||
'insert new': 'Створити новий запис',
|
||||
'insert new %s': 'створити новий запис %s',
|
||||
'Internal State': 'Внутрішній стан',
|
||||
'Introduction': 'Введення',
|
||||
'Invalid Query': 'Помилковий запит',
|
||||
'Invalid email': 'Невірна адреса ел.пошти',
|
||||
'Invalid login': "Невірне ім'я користувача",
|
||||
'Invalid password': 'Невірний пароль',
|
||||
'Invalid Query': 'Помилковий запит',
|
||||
'invalid request': 'хибний запит',
|
||||
'Key': 'Ключ',
|
||||
'Last name': 'Прізвище',
|
||||
'Layout': 'Макет (Layout)',
|
||||
'Layout Plugins': 'Втулки макетів',
|
||||
@@ -71,15 +106,19 @@
|
||||
'Logout': 'Вихід',
|
||||
'Lost Password': 'Забули пароль',
|
||||
'Lost password?': 'Забули пароль?',
|
||||
'Manage Cache': 'Управління кешем',
|
||||
'Menu Model': 'Модель меню',
|
||||
'My Sites': 'Сайт (усі додатки)',
|
||||
'Name': "Ім'я",
|
||||
'New Record': 'Новий запис',
|
||||
'New password': 'Новий пароль',
|
||||
'New Record': 'Новий запис',
|
||||
'new record inserted': 'новий рядок додано',
|
||||
'next 100 rows': 'наступні 100 рядків',
|
||||
'No databases in this application': 'Даний додаток не використовує базу даних',
|
||||
'Object or table name': "Об'єкт або назва таблиці",
|
||||
'Old password': 'Старий пароль',
|
||||
'Online examples': 'Зразковий демо-сайт',
|
||||
'or import from csv file': 'або імпортувати з csv-файлу',
|
||||
'Origin': 'Походження',
|
||||
'Other Plugins': 'Інші втулки',
|
||||
'Other Recipes': 'Інші рецепти',
|
||||
@@ -89,17 +128,24 @@
|
||||
'Password': 'Пароль',
|
||||
'Password changed': 'Пароль змінено',
|
||||
"Password fields don't match": 'Пароль не співпав',
|
||||
'please input your password again': 'Будь-ласка введіть пароль ще раз',
|
||||
'Plugins': 'Втулки (Plugins)',
|
||||
'Powered by': 'Працює на',
|
||||
'Preface': 'Передмова',
|
||||
'previous 100 rows': 'попередні 100 рядків',
|
||||
'Profile': 'Параметри',
|
||||
'Profile updated': 'Параметри змінено',
|
||||
'Python': 'Мова Python',
|
||||
'Query:': 'Запит:',
|
||||
'Quick Examples': 'Швидкі приклади',
|
||||
'RAM Cache Keys': "Ключі кешу в пам'яті",
|
||||
'RAM': "ОПЕРАТИВНА ПАМ'ЯТЬ (ОЗП)",
|
||||
'RAM Cache Keys': 'Ключі ОЗП-кешу',
|
||||
'Ram Cleared': 'ОЗП-кеш очищено',
|
||||
'Recipes': 'Рецепти',
|
||||
'record': 'запис',
|
||||
'Record %(id)s updated': 'Запис %(id)s змінено',
|
||||
'record does not exist': 'запису не існує',
|
||||
'record id': 'ід. запису',
|
||||
'Record ID': 'Ід.запису',
|
||||
'Record Updated': 'Запис змінено',
|
||||
'Register': 'Реєстрація',
|
||||
@@ -115,16 +161,24 @@
|
||||
'Save profile': 'Зберегти параметри',
|
||||
'Semantic': 'Семантика',
|
||||
'Services': 'Сервіс',
|
||||
'Size of cache:': 'Розмір кешу:',
|
||||
'state': 'стан',
|
||||
'Statistics': 'Статистика',
|
||||
'Stylesheet': 'CSS-стилі',
|
||||
'submit': 'submit',
|
||||
'Submit': 'Застосувати',
|
||||
'Support': 'Підтримка',
|
||||
'table': 'Таблиця',
|
||||
'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': '"Запит" це умова, на зразок "db.table1.field1==\'значення\'". Вираз "db.table1.field1==db.table2.field2" повертає результат об\'єднання (SQL JOIN) таблиць.',
|
||||
'The Core': 'Ядро',
|
||||
'The output of the file is a dictionary that was rendered by the view %s': 'Результат функції - словник пар (назва=значення) було відображено з допомогою відображення (view) %s',
|
||||
'The Views': 'Відображення (Views)',
|
||||
'The output of the file is a dictionary that was rendered by the view': 'Результат функції - словник пар (назва=значення) було відображено з допомогою відображення (view)',
|
||||
'This App': 'Цей додаток',
|
||||
'Time in Cache (h:m:s)': 'Час знаходження в кеші (h:m:s)',
|
||||
'Timestamp': 'Відмітка часу',
|
||||
'too short': 'Занадто короткий',
|
||||
'Twitter': 'Твіттер',
|
||||
'unable to parse csv file': 'не вдається розібрати csv-файл',
|
||||
'Update:': 'Оновити:',
|
||||
'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Для створення складних запитів використовуйте (...)&(...) замість AND, (...)|(...) замість OR, та ~(...) замість NOT.',
|
||||
'User %(id)s Logged-in': 'Користувач %(id)s увійшов',
|
||||
@@ -134,44 +188,14 @@
|
||||
'User %(id)s Profile updated': 'Параметри користувача %(id)s змінено',
|
||||
'User %(id)s Registered': 'Користувач %(id)s зареєструвався',
|
||||
'User ID': 'Ід.користувача',
|
||||
'value already in database or empty': 'значення вже в базі даних або порожнє',
|
||||
'Verify Password': 'Повторити пароль',
|
||||
'Videos': 'Відео',
|
||||
'View': 'Відображення (View)',
|
||||
'Welcome': 'Ласкаво просимо',
|
||||
'Welcome to web2py!': 'Ласкаво просимо до web2py!',
|
||||
'Which called the function': 'Управління передалось функції',
|
||||
'Which called the function %s located in the file %s': 'Управління передалось функції %s, яка розташована у файлі %s',
|
||||
'You are successfully running web2py': 'Ви успішно запустили web2py',
|
||||
'You can modify this application and adapt it to your needs': 'Ви можете модифікувати цей додаток і адаптувати його до своїх потреб',
|
||||
'You visited the url': 'Ви відвідали наступну адресу:',
|
||||
'appadmin is disabled because insecure channel': 'appadmin вимкнено через те, що використовується незахищений канал',
|
||||
'cache': 'кеш',
|
||||
'customize me!': 'причепуріть мене!',
|
||||
'data uploaded': 'дані завантажено',
|
||||
'database': 'база даних',
|
||||
'database %s select': 'Вибірка з бази даних %s',
|
||||
'db': 'бд',
|
||||
'design': 'налаштування',
|
||||
'done!': 'зроблено!',
|
||||
'edit': 'редагувати',
|
||||
'enter a value': 'введіть значення',
|
||||
'enter an integer between %(min)g and %(max)g': 'введіть ціле число між %(min)g та %(max)g',
|
||||
'export as csv file': 'експортувати як файл csv',
|
||||
'insert new': 'Створити новий запис',
|
||||
'insert new %s': 'створити новий запис %s',
|
||||
'invalid request': 'хибний запит',
|
||||
'located in the file': 'яка розташована у файлі',
|
||||
'new record inserted': 'новий рядок додано',
|
||||
'next 100 rows': 'наступні 100 рядків',
|
||||
'or import from csv file': 'або імпортувати з csv-файлу',
|
||||
'please input your password again': 'Будь-ласка введіть пароль ще раз',
|
||||
'previous 100 rows': 'попередні 100 рядків',
|
||||
'record': 'запис',
|
||||
'record does not exist': 'запису не існує',
|
||||
'record id': 'ід. запису',
|
||||
'selected': 'запис(ів) вибрано',
|
||||
'state': 'стан',
|
||||
'table': 'Таблиця',
|
||||
'too short': 'Занадто короткий',
|
||||
'unable to parse csv file': 'не вдається розібрати csv-файл',
|
||||
'value already in database or empty': 'значення вже в базі даних або порожнє',
|
||||
'You visited the url %s': 'Ви відвідали наступну адресу: %s',
|
||||
}
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
# coding: utf8
|
||||
{
|
||||
'!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 rows deleted': '已刪除 %s 筆',
|
||||
'%s rows updated': '已更新 %s 筆',
|
||||
'%s %%{row} deleted': '已刪除 %s 筆',
|
||||
'%s %%{row} updated': '已更新 %s 筆',
|
||||
'%s selected': '%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',
|
||||
@@ -15,6 +18,7 @@
|
||||
'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"',
|
||||
@@ -82,6 +86,7 @@
|
||||
'Name': '名字',
|
||||
'New Record': '新紀錄',
|
||||
'No databases in this application': '這應用程式不含資料庫',
|
||||
'Online examples': '點此處進入線上範例',
|
||||
'Origin': '原文',
|
||||
'Original/Translation': '原文/翻譯',
|
||||
'Password': '密碼',
|
||||
@@ -106,6 +111,7 @@
|
||||
'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 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',
|
||||
'There are no controllers': '沒有控件(controllers)',
|
||||
'There are no models': '沒有資料庫模組(models)',
|
||||
'There are no modules': '沒有程式模組(modules)',
|
||||
@@ -129,13 +135,13 @@
|
||||
'Views': '視圖',
|
||||
'Welcome %s': '歡迎 %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',
|
||||
'YES': '是',
|
||||
'You visited the url %s': 'You visited the url %s',
|
||||
'about': '關於',
|
||||
'appadmin is disabled because insecure channel': '因為來自非安全通道,管理介面關閉',
|
||||
'cache': '快取記憶體',
|
||||
'change password': '變更密碼',
|
||||
'Online examples': '點此處進入線上範例',
|
||||
'Administrative interface': '點此處進入管理介面',
|
||||
'customize me!': '請調整我!',
|
||||
'data uploaded': '資料已上傳',
|
||||
'database': '資料庫',
|
||||
@@ -158,9 +164,7 @@
|
||||
'record does not exist': '紀錄不存在',
|
||||
'record id': '紀錄編號',
|
||||
'register': '註冊',
|
||||
'selected': '已選擇',
|
||||
'state': '狀態',
|
||||
'table': '資料表',
|
||||
'unable to parse csv file': '無法解析逗號分隔檔(csv)',
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# This is an app-specific example router
|
||||
#
|
||||
# This simple router is used for setting languages from app/languages directory
|
||||
# as a part of the application path: app/<lang>/controller/function
|
||||
# Language from default.py or 'en' (if the file is not found) is used as
|
||||
# a default_language
|
||||
#
|
||||
# See <web2py-root-dir>/router.example.py for parameter's detail
|
||||
#-------------------------------------------------------------------------------------
|
||||
# To enable this route file you must do the steps:
|
||||
#
|
||||
# 1. rename <web2py-root-dir>/router.example.py to routes.py
|
||||
# 2. rename this APP/routes.example.py to APP/routes.py
|
||||
# (where APP - is your application directory)
|
||||
# 3. restart web2py (or reload routes in web2py admin interfase)
|
||||
#
|
||||
# YOU CAN COPY THIS FILE TO ANY APLLICATION'S ROOT DIRECTORY WITHOUT CHANGES!
|
||||
|
||||
from fileutils import abspath
|
||||
from languages import read_possible_languages
|
||||
|
||||
possible_languages = read_possible_languages(abspath('applications', app))
|
||||
#NOTE! app - is an application based router's parameter with name of an
|
||||
# application. E.g.'welcome'
|
||||
|
||||
routers = {
|
||||
app: dict(
|
||||
default_language = possible_languages['default'][0],
|
||||
languages = [lang for lang in possible_languages
|
||||
if lang != 'default']
|
||||
)
|
||||
}
|
||||
|
||||
#NOTE! To change language in your application using these rules add this line
|
||||
#in one of your models files:
|
||||
# if request.uri_language: T.force(request.uri_language)
|
||||
|
||||
@@ -1,98 +1,112 @@
|
||||
body {
|
||||
padding-top: 90px; /* container go all the way to the bottom of the topbar */
|
||||
height:auto; /*to avoid vertical scroll bar*/
|
||||
}
|
||||
|
||||
h1,h2,h3,h4,h5,h6 {font-family: inherit;}
|
||||
|
||||
li {margin-bottom: 0;} /*bootswatch*/
|
||||
|
||||
.auth_navbar, .navbar .btn-group{padding:0;}
|
||||
|
||||
@media only screen and (max-width: 320px) {
|
||||
.navbar-inner{position:relative;}
|
||||
#navbar{float:none;position:absolute;bottom:-10px;left:4px;}
|
||||
}
|
||||
|
||||
.mastheader h1 {
|
||||
margin-bottom: 9px;
|
||||
font-size: 81px;
|
||||
font-weight: bold;
|
||||
letter-spacing: -1px;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.mastheader h1 {
|
||||
font-size: 54px;
|
||||
}
|
||||
|
||||
.mastheader small {
|
||||
font-size: 20px;
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
/* bootstrap dropdown */
|
||||
|
||||
.dropdown-menu ul {
|
||||
left: 100%;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
visibility: hidden;
|
||||
margin-top: -1px;
|
||||
}
|
||||
|
||||
.dropdown-menu li:hover ul {
|
||||
visibility: visible;
|
||||
}
|
||||
|
||||
.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{
|
||||
display:inline-block;
|
||||
}
|
||||
|
||||
.chevron-right {
|
||||
border-left: 4px solid #000;
|
||||
border-right: 4px solid transparent;
|
||||
border-bottom: 4px solid transparent;
|
||||
border-top: 4px solid transparent;
|
||||
content: "";
|
||||
display: inline-block;
|
||||
height: 0;
|
||||
opacity: 0.7;
|
||||
vertical-align: top;
|
||||
width: 0;
|
||||
margin-right:-13px;
|
||||
margin-top: 7px;
|
||||
float:right;
|
||||
}
|
||||
|
||||
.open > .dropdown-menu ul { /* fix menu issue when BS2.0.4 is applied */
|
||||
display: block;
|
||||
}
|
||||
|
||||
#navbar{padding-top:9px;}
|
||||
#navbar .auth_navbar, #navbar .auth_navbar a {color:inherit;}
|
||||
.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 */
|
||||
@media only screen and (max-width: 479px) {
|
||||
div.flash {
|
||||
right: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
[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: 767px) {
|
||||
.navbar-inner{position:relative;}
|
||||
#navbar{bottom:-10px;left:4px;}
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 768px) {
|
||||
body {
|
||||
height:auto; /*to avoid vertical scroll bar*/
|
||||
}
|
||||
|
||||
h1,h2,h3,h4,h5,h6 {font-family: inherit;}
|
||||
|
||||
li {margin-bottom: 0;} /*bootswatch*/
|
||||
|
||||
.auth_navbar, .navbar .btn-group{padding:0;}
|
||||
|
||||
.mastheader h1 {
|
||||
margin-bottom: 9px;
|
||||
font-size: 81px;
|
||||
font-weight: bold;
|
||||
letter-spacing: -1px;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.mastheader h1 {
|
||||
font-size: 54px;
|
||||
}
|
||||
|
||||
.mastheader small {
|
||||
font-size: 20px;
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
/* bootstrap dropdown */
|
||||
|
||||
.dropdown-menu ul {
|
||||
left: 100%;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
visibility: hidden;
|
||||
margin-top: -1px;
|
||||
}
|
||||
|
||||
.dropdown-menu li:hover ul {
|
||||
visibility: visible;
|
||||
}
|
||||
|
||||
.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{
|
||||
display:inline-block;
|
||||
}
|
||||
|
||||
.chevron-right {
|
||||
border-left: 4px solid #000;
|
||||
border-right: 4px solid transparent;
|
||||
border-bottom: 4px solid transparent;
|
||||
border-top: 4px solid transparent;
|
||||
content: "";
|
||||
display: inline-block;
|
||||
height: 0;
|
||||
opacity: 0.7;
|
||||
vertical-align: top;
|
||||
width: 0;
|
||||
margin-right:-13px;
|
||||
margin-top: 7px;
|
||||
float:right;
|
||||
}
|
||||
|
||||
.open > .dropdown-menu ul { /* fix menu issue when BS2.0.4 is applied */
|
||||
display: block;
|
||||
}
|
||||
|
||||
.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 */
|
||||
|
||||
[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 (min-width: 980px) {
|
||||
body {
|
||||
padding-top: 60px;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
/** these MUST stay **/
|
||||
body { margin: 0; padding:0; border: 0; }
|
||||
a { text-decoration:none; white-space: nowrap;}
|
||||
a:hover {text-decoration: underline}
|
||||
a.button {text-decoration: none}
|
||||
@@ -38,9 +37,7 @@ ul { list-style-type: none; margin: 0px; padding: 0px; }
|
||||
/** end **/
|
||||
|
||||
/* Sticky footer begin */
|
||||
html, body {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.wrapper {
|
||||
min-height: 100%;
|
||||
height: auto !important;
|
||||
@@ -228,8 +225,12 @@ div.error {
|
||||
|
||||
.web2py_console form {
|
||||
width:100%;
|
||||
display: inline;
|
||||
}
|
||||
|
||||
.web2py_console form select {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.web2py_search_actions{
|
||||
float:left;
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
<br/><br/><h3>{{=T("Import/Export")}}</h3><br/>
|
||||
[ <a href="{{=URL('csv',args=request.args[0],vars=dict(query=query))}}">{{=T("export as csv file")}}</a> ]
|
||||
{{if table:}}
|
||||
{{=FORM(str(T('or import from csv file'))+" ",INPUT(_type='file',_name='csvfile'),INPUT(_type='hidden',_value=table,_name='table'),INPUT(_type='submit',_value='import'))}}
|
||||
{{=FORM(str(T('or import from csv file'))+" ",INPUT(_type='file',_name='csvfile'),INPUT(_type='hidden',_value=table,_name='table'),INPUT(_type='submit',_value=T('import')))}}
|
||||
{{pass}}
|
||||
|
||||
|
||||
|
||||
@@ -7,11 +7,14 @@
|
||||
<h4/>{{=T('How did you get here?')}}</h4>
|
||||
<ol>
|
||||
<li>{{=T('You are successfully running web2py')}}</li>
|
||||
<li>{{=T('You visited the url')}} {{=A(request.env.path_info,_href=request.env.path_info)}}</li>
|
||||
<li>{{=T('Which called the function')}} {{=A(request.function+'()',_href='#')}} {{=T('located in the file')}}
|
||||
{{=A('web2py/applications/%(application)s/controllers/%(controller)s.py'%request,_href=URL('admin','default','peek',args=(request.application,'controllers',request.controller+'.py')))}}</li>
|
||||
<li>{{=T('The output of the file is a dictionary that was rendered by the view')}}
|
||||
{{=A('web2py/applications/%(application)s/views/%(controller)s/index.html'%request,_href=URL('admin','default','peek',args=(request.application,'views',request.controller,'index.html')))}}</li>
|
||||
<li>{{=XML(T('You visited the url %s', A(request.env.path_info,_href=request.env.path_info)))}}</li>
|
||||
<li>{{=XML(T('Which called the function %s located in the file %s',
|
||||
(A(request.function+'()',_href='#'),
|
||||
A('web2py/applications/%(application)s/controllers/%(controller)s.py'%request,
|
||||
_href=URL('admin','default','peek', args=(request.application,'controllers',request.controller+'.py'))))))}}</li>
|
||||
<li>{{=XML(T('The output of the file is a dictionary that was rendered by the view %s',
|
||||
A('web2py/applications/%(application)s/views/%(controller)s/index.html'%request,
|
||||
_href=URL('admin','default','peek',args=(request.application,'views',request.controller,'index.html')))))}}</li>
|
||||
<li>{{=T('You can modify this application and adapt it to your needs')}}</li>
|
||||
</ul>
|
||||
</ol>
|
||||
|
||||
@@ -1,13 +1,17 @@
|
||||
{{extend 'layout.html'}}
|
||||
<h2>{{=T( request.args(0).replace('_',' ').capitalize() )}}</h2>
|
||||
<div id="web2py_user_form">
|
||||
{{if request.args(0)=='login':}}
|
||||
{{if not 'register' in auth.settings.actions_disabled:}}
|
||||
{{form.add_button(T('Register'),URL(args='register'))}}
|
||||
{{pass}}
|
||||
{{form.add_button(T('Lost Password'),URL(args='request_reset_password'))}}
|
||||
{{pass}}
|
||||
{{=form}}
|
||||
{{
|
||||
if request.args(0)=='login':
|
||||
if not 'register' in auth.settings.actions_disabled:
|
||||
form.add_button(T('Register'),URL(args='register'))
|
||||
pass
|
||||
if not 'request_reset_password' in auth.settings.actions_disabled:
|
||||
form.add_button(T('Lost Password'),URL(args='request_reset_password'))
|
||||
pass
|
||||
pass
|
||||
=form
|
||||
}}
|
||||
</div>
|
||||
<script language="javascript"><!--
|
||||
jQuery("#web2py_user_form input:visible:enabled:first").focus();
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
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, user-scalable=yes">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
|
||||
<!-- Place favicon.ico and apple-touch-icon.png in the root of your domain and delete these references -->
|
||||
<link rel="shortcut icon" href="{{=URL('static','favicon.ico')}}" type="image/x-icon">
|
||||
|
||||
+36
-16
@@ -35,7 +35,7 @@ except ImportError:
|
||||
|
||||
logger = logging.getLogger("web2py.cache")
|
||||
|
||||
__all__ = ['Cache']
|
||||
__all__ = ['Cache', 'lazy_lazy_cache']
|
||||
|
||||
|
||||
DEFAULT_TIME_EXPIRE = 300
|
||||
@@ -379,6 +379,28 @@ class CacheOnDisk(CacheAbstract):
|
||||
storage.close()
|
||||
return value
|
||||
|
||||
class CacheAction(object):
|
||||
def __init__(self,func,key,time_expire,cache,cache_model):
|
||||
self.__name__ = func.__name__
|
||||
self.__doc__ = func.__doc__
|
||||
self.func = func
|
||||
self.key = key
|
||||
self.time_expire = time_expire
|
||||
self.cache = cache
|
||||
self.cache_model = cache_model
|
||||
def __call__(self,*a,**b):
|
||||
if not self.key:
|
||||
key2 = self.__name__+':'+repr(a)+':'+repr(b)
|
||||
else:
|
||||
key2 = self.key.replace('%(name)s',self.__name__)\
|
||||
.replace('%(args)s',str(a)).replace('%(vars)s',str(b))
|
||||
cache_model = self.cache_model
|
||||
if not cache_model or isinstance(cache_model,str):
|
||||
cache_model = getattr(self.cache,cache_model or 'ram')
|
||||
return cache_model(key2,
|
||||
lambda a=a,b=b:self.func(*a,**b),
|
||||
self.time_expire)
|
||||
|
||||
|
||||
class Cache(object):
|
||||
"""
|
||||
@@ -437,8 +459,8 @@ class Cache(object):
|
||||
|
||||
:param key: the key of the object to be store or retrieved
|
||||
:param time_expire: expiration of the cache in microseconds
|
||||
:param cache_model: `cache.ram`, `cache.disk`, or other
|
||||
(like `cache.memcache` if defined). It defaults to `cache.ram`.
|
||||
:param cache_model: "ram", "disk", or other
|
||||
(like "memcache" if defined). It defaults to "ram".
|
||||
|
||||
Notes
|
||||
-----
|
||||
@@ -451,20 +473,18 @@ class Cache(object):
|
||||
If the function `f` is an action, we suggest using
|
||||
`request.env.path_info` as key.
|
||||
"""
|
||||
if not cache_model:
|
||||
cache_model = self.ram
|
||||
|
||||
def tmp(func):
|
||||
def action(*a,**b):
|
||||
key2 = key.replace('%(name)s',func.__name__).replace('%(args)s',str(a)).replace('%(vars)s',str(b))
|
||||
return cache_model(key2, lambda a=a,b=b:func(*a,**b), time_expire)
|
||||
action.__name___ = func.__name__
|
||||
action.__doc__ = func.__doc__
|
||||
return action
|
||||
|
||||
def tmp(func,cache=self,cache_model=cache_model):
|
||||
return CacheAction(func,key,time_expire,self,cache_model)
|
||||
return tmp
|
||||
|
||||
|
||||
|
||||
|
||||
def lazy_lazy_cache(key=None,time_expire=None,cache_model='ram'):
|
||||
def decorator(f,key=key,time_expire=time_expire,cache_model=cache_model):
|
||||
key = key or repr(f)
|
||||
def g(*c,**d):
|
||||
from gluon import current
|
||||
return current.cache(key,time_expire,cache_model)(f)(*c,**d)
|
||||
g.__name__ = f.__name__
|
||||
return g
|
||||
return decorator
|
||||
|
||||
|
||||
+1
-2
@@ -13,7 +13,6 @@ FOR INTERNAL USE ONLY
|
||||
"""
|
||||
|
||||
import os
|
||||
import stat
|
||||
import thread
|
||||
from fileutils import read_file
|
||||
|
||||
@@ -34,7 +33,7 @@ def getcfs(key, filename, filter=None):
|
||||
|
||||
This is used on Google App Engine since pyc files cannot be saved.
|
||||
"""
|
||||
t = os.stat(filename)[stat.ST_MTIME]
|
||||
t = os.stat(filename).st_mtime
|
||||
cfs_lock.acquire()
|
||||
item = cfs.get(key, None)
|
||||
cfs_lock.release()
|
||||
|
||||
+3
-6
@@ -40,18 +40,15 @@ import imp
|
||||
import logging
|
||||
logger = logging.getLogger("web2py")
|
||||
import rewrite
|
||||
import platform
|
||||
|
||||
try:
|
||||
import py_compile
|
||||
except:
|
||||
logger.warning('unable to import py_compile')
|
||||
|
||||
is_pypy = hasattr(platform,'python_implementation') and \
|
||||
platform.python_implementation() == 'PyPy'
|
||||
settings.global_settings.is_pypy = is_pypy
|
||||
is_gae = settings.global_settings.web2py_runtime_gae
|
||||
is_jython = settings.global_settings.is_jython = 'java' in sys.platform.lower() or hasattr(sys, 'JYTHON_JAR') or str(sys.copyright).find('Jython') > 0
|
||||
is_pypy = settings.global_settings.is_pypy
|
||||
is_gae = settings.global_settings.web2py_runtime_gae
|
||||
is_jython = settings.global_settings.is_jython
|
||||
|
||||
TEST_CODE = \
|
||||
r"""
|
||||
|
||||
@@ -1,36 +1,37 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# last tinkered with by korylprince at gmail.com on 2012-04-5
|
||||
#
|
||||
# last tinkered with by korylprince at gmail.com on 2012-07-12
|
||||
#
|
||||
|
||||
import sys
|
||||
import logging
|
||||
try:
|
||||
import ldap
|
||||
import ldap.filter
|
||||
ldap.set_option( ldap.OPT_REFERRALS, 0 )
|
||||
ldap.set_option(ldap.OPT_REFERRALS, 0)
|
||||
except Exception, e:
|
||||
logging.error( 'missing ldap, try "easy_install python-ldap"' )
|
||||
logging.error('missing ldap, try "easy_install python-ldap"')
|
||||
raise e
|
||||
|
||||
def ldap_auth( server = 'ldap', port = None,
|
||||
base_dn = 'ou=users,dc=domain,dc=com',
|
||||
mode = 'uid', secure = False, cert_path = None, cert_file = None,
|
||||
bind_dn = None, bind_pw = None, filterstr = 'objectClass=*',
|
||||
username_attrib = 'uid',
|
||||
custom_scope = 'subtree',
|
||||
allowed_groups = None,
|
||||
manage_user = False,
|
||||
user_firstname_attrib = 'cn:1',
|
||||
user_lastname_attrib = 'cn:2',
|
||||
user_mail_attrib = 'mail',
|
||||
manage_groups = False,
|
||||
db = None,
|
||||
group_dn = None,
|
||||
group_name_attrib = 'cn',
|
||||
group_member_attrib = 'memberUid',
|
||||
group_filterstr = 'objectClass=*',
|
||||
logging_level = 'error' ):
|
||||
|
||||
def ldap_auth(server='ldap', port=None,
|
||||
base_dn='ou=users,dc=domain,dc=com',
|
||||
mode='uid', secure=False, cert_path=None, cert_file=None,
|
||||
bind_dn=None, bind_pw=None, filterstr='objectClass=*',
|
||||
username_attrib='uid',
|
||||
custom_scope='subtree',
|
||||
allowed_groups=None,
|
||||
manage_user=False,
|
||||
user_firstname_attrib='cn:1',
|
||||
user_lastname_attrib='cn:2',
|
||||
user_mail_attrib='mail',
|
||||
manage_groups=False,
|
||||
db=None,
|
||||
group_dn=None,
|
||||
group_name_attrib='cn',
|
||||
group_member_attrib='memberUid',
|
||||
group_filterstr='objectClass=*',
|
||||
logging_level='error'):
|
||||
|
||||
"""
|
||||
to use ldap login with MS Active Directory:
|
||||
@@ -50,7 +51,8 @@ def ldap_auth( server = 'ldap', port = None,
|
||||
auth.settings.login_methods.append(ldap_auth(
|
||||
server='my.ldap.server', base_dn='ou=Users,dc=domain,dc=com'))
|
||||
|
||||
to use ldap login with OpenLDAP and subtree search and (optionally) multiple DNs:
|
||||
to use ldap login with OpenLDAP and subtree search and (optionally)
|
||||
multiple DNs:
|
||||
|
||||
auth.settings.login_methods.append(ldap_auth(
|
||||
mode='uid_r', server='my.ldap.server',
|
||||
@@ -63,305 +65,317 @@ def ldap_auth( server = 'ldap', port = None,
|
||||
base_dn='ou=Users,dc=domain,dc=com'))
|
||||
|
||||
or you can full customize the search for user:
|
||||
|
||||
|
||||
auth.settings.login_methods.append(ldap_auth(
|
||||
mode='custom', server='my.ldap.server',
|
||||
base_dn='ou=Users,dc=domain,dc=com',
|
||||
username_attrib='uid',
|
||||
custom_scope='subtree'))
|
||||
|
||||
the custom_scope can be: base, onelevel, subtree.
|
||||
|
||||
If using secure ldaps:// pass secure=True and cert_path="..."
|
||||
If ldap is using GnuTLS then you need cert_file="..." instead cert_path because
|
||||
cert_path isn't implemented in GnuTLS :(
|
||||
|
||||
If you need to bind to the directory with an admin account in order to search it then specify bind_dn & bind_pw to use for this.
|
||||
the custom_scope can be: base, onelevel, subtree.
|
||||
|
||||
If using secure ldaps:// pass secure=True and cert_path="..."
|
||||
If ldap is using GnuTLS then you need cert_file="..." instead cert_path
|
||||
because cert_path isn't implemented in GnuTLS :(
|
||||
|
||||
If you need to bind to the directory with an admin account in order to
|
||||
search it then specify bind_dn & bind_pw to use for this.
|
||||
- currently only implemented for Active Directory
|
||||
|
||||
If you need to restrict the set of allowed users (e.g. to members of a department) then specify
|
||||
a rfc4515 search filter string.
|
||||
If you need to restrict the set of allowed users (e.g. to members of a
|
||||
department) then specify an rfc4515 search filter string.
|
||||
- currently only implemented for mode in ['ad', 'company', 'uid_r']
|
||||
You can manage user attribute first name, last name, email from ldap:
|
||||
|
||||
You can manage user attributes first name, last name, email from ldap:
|
||||
auth.settings.login_methods.append(ldap_auth(...as usual...,
|
||||
manage_user = True,
|
||||
user_firstname_attrib = 'cn:1',
|
||||
user_lastname_attrib = 'cn:2',
|
||||
user_mail_attrib = 'mail'
|
||||
))
|
||||
|
||||
Where:
|
||||
manage_user - let web2py handle user data from ldap
|
||||
user_firstname_attrib - the attribute containing the user's first name
|
||||
optionally you can specify parts.
|
||||
Example: cn: "John Smith" - 'cn:1' = 'John'
|
||||
user_lastname_attrib - the attribute containing the user's last name
|
||||
optionally you can specify parts.
|
||||
Example: cn: "John Smith" - 'cn:2' = 'Smith'
|
||||
user_mail_attrib - the attribure containing the user's email address
|
||||
manage_user=True,
|
||||
user_firstname_attrib='cn:1',
|
||||
user_lastname_attrib='cn:2',
|
||||
user_mail_attrib='mail'
|
||||
))
|
||||
|
||||
Where:
|
||||
manage_user - let web2py handle user data from ldap
|
||||
user_firstname_attrib - the attribute containing the user's first name
|
||||
optionally you can specify parts.
|
||||
Example: cn: "John Smith" - 'cn:1'='John'
|
||||
user_lastname_attrib - the attribute containing the user's last name
|
||||
optionally you can specify parts.
|
||||
Example: cn: "John Smith" - 'cn:2'='Smith'
|
||||
user_mail_attrib - the attribute containing the user's email address
|
||||
|
||||
|
||||
If you need group control from ldap to web2py app's database feel free to set:
|
||||
If you need group control from ldap to web2py app's database feel free
|
||||
to set:
|
||||
|
||||
auth.settings.login_methods.append(ldap_auth(...as usual...,
|
||||
manage_groups = True,
|
||||
db = db,
|
||||
group_dn = 'ou=Groups,dc=domain,dc=com',
|
||||
group_name_attrib = 'cn',
|
||||
group_member_attrib = 'memberUid',
|
||||
group_filterstr = 'objectClass=*'
|
||||
))
|
||||
|
||||
manage_groups=True,
|
||||
db=db,
|
||||
group_dn='ou=Groups,dc=domain,dc=com',
|
||||
group_name_attrib='cn',
|
||||
group_member_attrib='memberUid',
|
||||
group_filterstr='objectClass=*'
|
||||
))
|
||||
|
||||
Where:
|
||||
manage_group - let web2py handle the groups from ldap
|
||||
db - is the database object (need to have auth_user, auth_group, auth_membership)
|
||||
db - is the database object (need to have auth_user, auth_group,
|
||||
auth_membership)
|
||||
group_dn - the ldap branch of the groups
|
||||
group_name_attrib - the attribute where the group name is stored
|
||||
group_member_attrib - the attribute containing the group members name
|
||||
group_filterstr - as the filterstr but for group select
|
||||
|
||||
|
||||
You can restrict login access to specific groups if you specify:
|
||||
|
||||
|
||||
auth.settings.login_methods.append(ldap_auth(...as usual...,
|
||||
allowed_groups = [...],
|
||||
group_dn = 'ou=Groups,dc=domain,dc=com',
|
||||
group_name_attrib = 'cn',
|
||||
group_member_attrib = 'memberUid', # use 'member' for Active Directory
|
||||
group_filterstr = 'objectClass=*'
|
||||
))
|
||||
allowed_groups=[...],
|
||||
group_dn='ou=Groups,dc=domain,dc=com',
|
||||
group_name_attrib='cn',
|
||||
group_member_attrib='memberUid',#use 'member' for Active Directory
|
||||
group_filterstr='objectClass=*'
|
||||
))
|
||||
|
||||
Where:
|
||||
allowed_groups - a list with allowed ldap group names
|
||||
group_dn - the ldap branch of the groups
|
||||
group_name_attrib - the attribute where the group name is stored
|
||||
group_member_attrib - the attibute containing the group members name
|
||||
group_member_attrib - the attribute containing the group members name
|
||||
group_filterstr - as the filterstr but for group select
|
||||
|
||||
If using Active Directory you must specify bind_dn and bind_pw for allowed_groups unless anonymous bind works.
|
||||
If using Active Directory you must specify bind_dn and bind_pw for
|
||||
allowed_groups unless anonymous bind works.
|
||||
|
||||
You can set the logging level with the "logging_level" parameter, default
|
||||
is "error" and can be set to error, warning, info, debug.
|
||||
"""
|
||||
logger = logging.getLogger( 'web2py.auth.ldap_auth' )
|
||||
logger = logging.getLogger('web2py.auth.ldap_auth')
|
||||
if logging_level == 'error':
|
||||
logger.setLevel( logging.ERROR )
|
||||
logger.setLevel(logging.ERROR)
|
||||
elif logging_level == 'warning':
|
||||
logger.setLevel( logging.WARNING )
|
||||
logger.setLevel(logging.WARNING)
|
||||
elif logging_level == 'info':
|
||||
logger.setLevel( logging.INFO )
|
||||
logger.setLevel(logging.INFO)
|
||||
elif logging_level == 'debug':
|
||||
logger.setLevel( logging.DEBUG )
|
||||
def ldap_auth_aux( username,
|
||||
logger.setLevel(logging.DEBUG)
|
||||
|
||||
def ldap_auth_aux(username,
|
||||
password,
|
||||
ldap_server = server,
|
||||
ldap_port = port,
|
||||
ldap_basedn = base_dn,
|
||||
ldap_mode = mode,
|
||||
ldap_binddn = bind_dn,
|
||||
ldap_bindpw = bind_pw,
|
||||
secure = secure,
|
||||
cert_path = cert_path,
|
||||
cert_file = cert_file,
|
||||
filterstr = filterstr,
|
||||
username_attrib = username_attrib,
|
||||
custom_scope = custom_scope,
|
||||
manage_user = manage_user,
|
||||
user_firstname_attrib = user_firstname_attrib,
|
||||
user_lastname_attrib = user_lastname_attrib,
|
||||
user_mail_attrib = user_mail_attrib,
|
||||
manage_groups = manage_groups,
|
||||
allowed_groups = allowed_groups,
|
||||
db = db ):
|
||||
logger.debug( 'mode: [%s] manage_user: [%s] custom_scope: [%s] manage_groups: [%s]' % (
|
||||
str( mode ), str( manage_user ), str( custom_scope ), str( manage_groups ) ) )
|
||||
ldap_server=server,
|
||||
ldap_port=port,
|
||||
ldap_basedn=base_dn,
|
||||
ldap_mode=mode,
|
||||
ldap_binddn=bind_dn,
|
||||
ldap_bindpw=bind_pw,
|
||||
secure=secure,
|
||||
cert_path=cert_path,
|
||||
cert_file=cert_file,
|
||||
filterstr=filterstr,
|
||||
username_attrib=username_attrib,
|
||||
custom_scope=custom_scope,
|
||||
manage_user=manage_user,
|
||||
user_firstname_attrib=user_firstname_attrib,
|
||||
user_lastname_attrib=user_lastname_attrib,
|
||||
user_mail_attrib=user_mail_attrib,
|
||||
manage_groups=manage_groups,
|
||||
allowed_groups=allowed_groups,
|
||||
db=db):
|
||||
if password == '': # http://tools.ietf.org/html/rfc4513#section-5.1.2
|
||||
logger.warning('blank password not allowed')
|
||||
return False
|
||||
logger.debug('mode: [%s] manage_user: [%s] custom_scope: [%s]'
|
||||
' manage_groups: [%s]' % (str(mode), str(manage_user),
|
||||
str(custom_scope), str(manage_groups)))
|
||||
if manage_user:
|
||||
if user_firstname_attrib.count( ':' ) > 0:
|
||||
( user_firstname_attrib, user_firstname_part ) = user_firstname_attrib.split( ':', 1 )
|
||||
user_firstname_part = ( int( user_firstname_part ) - 1 )
|
||||
if user_firstname_attrib.count(':') > 0:
|
||||
(user_firstname_attrib, user_firstname_part) = user_firstname_attrib.split(':', 1)
|
||||
user_firstname_part = (int(user_firstname_part) - 1)
|
||||
else:
|
||||
user_firstname_part = None
|
||||
if user_lastname_attrib.count( ':' ) > 0:
|
||||
( user_lastname_attrib, user_lastname_part ) = user_lastname_attrib.split( ':', 1 )
|
||||
user_lastname_part = ( int( user_lastname_part ) - 1 )
|
||||
if user_lastname_attrib.count(':') > 0:
|
||||
(user_lastname_attrib, user_lastname_part) = user_lastname_attrib.split(':', 1)
|
||||
user_lastname_part = (int(user_lastname_part) - 1)
|
||||
else:
|
||||
user_lastname_part = None
|
||||
user_firstname_attrib = ldap.filter.escape_filter_chars( user_firstname_attrib )
|
||||
user_lastname_attrib = ldap.filter.escape_filter_chars( user_lastname_attrib )
|
||||
user_mail_attrib = ldap.filter.escape_filter_chars( user_mail_attrib )
|
||||
user_firstname_attrib = ldap.filter.escape_filter_chars(user_firstname_attrib)
|
||||
user_lastname_attrib = ldap.filter.escape_filter_chars(user_lastname_attrib)
|
||||
user_mail_attrib = ldap.filter.escape_filter_chars(user_mail_attrib)
|
||||
try:
|
||||
if allowed_groups:
|
||||
if not is_user_in_allowed_groups( username, password ):
|
||||
if not is_user_in_allowed_groups(username, password):
|
||||
return False
|
||||
con = init_ldap()
|
||||
if ldap_mode == 'ad':
|
||||
# Microsoft Active Directory
|
||||
if '@' not in username:
|
||||
domain = []
|
||||
for x in ldap_basedn.split( ',' ):
|
||||
for x in ldap_basedn.split(','):
|
||||
if "DC=" in x.upper():
|
||||
domain.append( x.split( '=' )[-1] )
|
||||
username = "%s@%s" % ( username, '.'.join( domain ) )
|
||||
username_bare = username.split( "@" )[0]
|
||||
con.set_option( ldap.OPT_PROTOCOL_VERSION, 3 )
|
||||
# In cases where ForestDnsZones and DomainDnsZones are found,
|
||||
# result will look like the following:
|
||||
# ['ldap://ForestDnsZones.domain.com/DC=ForestDnsZones,DC=domain,DC=com']
|
||||
domain.append(x.split('=')[-1])
|
||||
username = "%s@%s" % (username, '.'.join(domain))
|
||||
username_bare = username.split("@")[0]
|
||||
con.set_option(ldap.OPT_PROTOCOL_VERSION, 3)
|
||||
# In cases where ForestDnsZones and DomainDnsZones are found,
|
||||
# result will look like the following:
|
||||
# ['ldap://ForestDnsZones.domain.com/DC=ForestDnsZones,DC=domain,DC=com']
|
||||
if ldap_binddn:
|
||||
# need to search directory with an admin account 1st
|
||||
con.simple_bind_s( ldap_binddn, ldap_bindpw )
|
||||
con.simple_bind_s(ldap_binddn, ldap_bindpw)
|
||||
else:
|
||||
# credentials should be in the form of username@domain.tld
|
||||
con.simple_bind_s( username, password )
|
||||
con.simple_bind_s(username, password)
|
||||
# this will throw an index error if the account is not found
|
||||
# in the ldap_basedn
|
||||
requested_attrs = ['sAMAccountName']
|
||||
if manage_user:
|
||||
requested_attrs.extend( [user_firstname_attrib,
|
||||
user_lastname_attrib,
|
||||
user_mail_attrib] )
|
||||
result = con.search_ext_s(
|
||||
requested_attrs.extend([user_firstname_attrib,
|
||||
user_lastname_attrib,
|
||||
user_mail_attrib])
|
||||
result = con.search_ext_s(
|
||||
ldap_basedn, ldap.SCOPE_SUBTREE,
|
||||
"(&(sAMAccountName=%s)(%s))" % ( ldap.filter.escape_filter_chars( username_bare ),
|
||||
filterstr ),
|
||||
requested_attrs )[0][1]
|
||||
if not isinstance( result, dict ):
|
||||
# result should be a dict in the form {'sAMAccountName': [username_bare]}
|
||||
logger.warning( 'User [%s] not found!' % username )
|
||||
"(&(sAMAccountName=%s)(%s))" % (ldap.filter.escape_filter_chars(username_bare),
|
||||
filterstr),
|
||||
requested_attrs)[0][1]
|
||||
if not isinstance(result, dict):
|
||||
# result should be a dict in the form
|
||||
# {'sAMAccountName': [username_bare]}
|
||||
logger.warning('User [%s] not found!' % username)
|
||||
return False
|
||||
if ldap_binddn:
|
||||
# We know the user exists & is in the correct OU
|
||||
# so now we just check the password
|
||||
con.simple_bind_s( username, password )
|
||||
username=username_bare
|
||||
con.simple_bind_s(username, password)
|
||||
username = username_bare
|
||||
|
||||
if ldap_mode == 'domino':
|
||||
# Notes Domino
|
||||
if "@" in username:
|
||||
username = username.split( "@" )[0]
|
||||
con.simple_bind_s( username, password )
|
||||
username = username.split("@")[0]
|
||||
con.simple_bind_s(username, password)
|
||||
if manage_user:
|
||||
# TODO: sorry I have no clue how to query attrs in domino
|
||||
result = {user_firstname_attrib: username,
|
||||
user_lastname_attrib: None,
|
||||
user_mail_attrib: None}
|
||||
user_lastname_attrib: None,
|
||||
user_mail_attrib: None}
|
||||
|
||||
if ldap_mode == 'cn':
|
||||
# OpenLDAP (CN)
|
||||
dn = "cn=" + username + "," + ldap_basedn
|
||||
con.simple_bind_s( dn, password )
|
||||
con.simple_bind_s(dn, password)
|
||||
if manage_user:
|
||||
result = con.search_s(
|
||||
dn, ldap.SCOPE_BASE,
|
||||
"(objectClass=*)",
|
||||
[user_firstname_attrib,
|
||||
user_lastname_attrib,
|
||||
user_mail_attrib]
|
||||
)[0][1]
|
||||
result = con.search_s(dn, ldap.SCOPE_BASE,
|
||||
"(objectClass=*)",
|
||||
[user_firstname_attrib,
|
||||
user_lastname_attrib,
|
||||
user_mail_attrib])[0][1]
|
||||
|
||||
if ldap_mode == 'uid':
|
||||
# OpenLDAP (UID)
|
||||
dn = "uid=" + username + "," + ldap_basedn
|
||||
con.simple_bind_s( dn, password )
|
||||
con.simple_bind_s(dn, password)
|
||||
if manage_user:
|
||||
result = con.search_s(
|
||||
dn, ldap.SCOPE_BASE,
|
||||
"(objectClass=*)",
|
||||
[user_firstname_attrib,
|
||||
user_lastname_attrib,
|
||||
user_mail_attrib]
|
||||
)[0][1]
|
||||
result = con.search_s(dn, ldap.SCOPE_BASE,
|
||||
"(objectClass=*)",
|
||||
[user_firstname_attrib,
|
||||
user_lastname_attrib,
|
||||
user_mail_attrib])[0][1]
|
||||
|
||||
if ldap_mode == 'company':
|
||||
# no DNs or password needed to search directory
|
||||
dn = ""
|
||||
pw = ""
|
||||
# bind anonymously
|
||||
con.simple_bind_s( dn, pw )
|
||||
con.simple_bind_s(dn, pw)
|
||||
# search by e-mail address
|
||||
filter = '(&(mail=' + ldap.filter.escape_filter_chars( username ) + \
|
||||
')(' + filterstr + '))'
|
||||
filter = '(&(mail=%s)(%s))' % (ldap.filter.escape_filter_chars(username),
|
||||
filterstr)
|
||||
# find the uid
|
||||
attrs = ['uid']
|
||||
if manage_user:
|
||||
attrs.extend( [user_firstname_attrib,
|
||||
user_lastname_attrib,
|
||||
user_mail_attrib] )
|
||||
attrs.extend([user_firstname_attrib,
|
||||
user_lastname_attrib,
|
||||
user_mail_attrib])
|
||||
# perform the actual search
|
||||
company_search_result = con.search_s( ldap_basedn,
|
||||
ldap.SCOPE_SUBTREE,
|
||||
filter, attrs )
|
||||
company_search_result = con.search_s(ldap_basedn,
|
||||
ldap.SCOPE_SUBTREE,
|
||||
filter, attrs)
|
||||
dn = company_search_result[0][0]
|
||||
result = company_search_result[0][1]
|
||||
# perform the real authentication test
|
||||
con.simple_bind_s( dn, password )
|
||||
con.simple_bind_s(dn, password)
|
||||
|
||||
if ldap_mode == 'uid_r':
|
||||
# OpenLDAP (UID) with subtree search and multiple DNs
|
||||
if type( ldap_basedn ) == type( [] ):
|
||||
if isinstance(ldap_basedn, list):
|
||||
basedns = ldap_basedn
|
||||
else:
|
||||
basedns = [ldap_basedn]
|
||||
filter = '(&(uid=%s)(%s))' % ( ldap.filter.escape_filter_chars( username ), filterstr )
|
||||
finded = False
|
||||
filter = '(&(uid=%s)(%s))' % (ldap.filter.escape_filter_chars(username), filterstr)
|
||||
found = False
|
||||
for basedn in basedns:
|
||||
try:
|
||||
result = con.search_s( basedn, ldap.SCOPE_SUBTREE, filter )
|
||||
result = con.search_s(basedn, ldap.SCOPE_SUBTREE,
|
||||
filter)
|
||||
if result:
|
||||
user_dn = result[0][0]
|
||||
# Check the password
|
||||
con.simple_bind_s( user_dn, password )
|
||||
finded = True
|
||||
con.simple_bind_s(user_dn, password)
|
||||
found = True
|
||||
break
|
||||
except ldap.LDAPError, detail:
|
||||
( exc_type, exc_value ) = sys.exc_info()[:2]
|
||||
logger.warning( "ldap_auth: searching %s for %s resulted in %s: %s\n" %
|
||||
( basedn, filter, exc_type, exc_value ) )
|
||||
if not finded:
|
||||
logger.warning( 'User [%s] not found!' % username )
|
||||
(exc_type, exc_value) = sys.exc_info()[:2]
|
||||
logger.warning("ldap_auth: searching %s for %s resulted in %s: %s\n" %
|
||||
(basedn, filter, exc_type, exc_value))
|
||||
if not found:
|
||||
logger.warning('User [%s] not found!' % username)
|
||||
return False
|
||||
result = result[0][1]
|
||||
if ldap_mode == 'custom':
|
||||
# OpenLDAP (username_attrs) with subtree search and multiple DNs
|
||||
if type( ldap_basedn ) == type( [] ):
|
||||
# OpenLDAP (username_attrs) with subtree search and
|
||||
# multiple DNs
|
||||
if isinstance(ldap_basedn, list):
|
||||
basedns = ldap_basedn
|
||||
else:
|
||||
basedns = [ldap_basedn]
|
||||
filter = '(&(%s=%s)(%s))' % ( username_attrib, ldap.filter.escape_filter_chars( username ), filterstr )
|
||||
filter = '(&(%s=%s)(%s))' % (username_attrib,
|
||||
ldap.filter.escape_filter_chars(username),
|
||||
filterstr)
|
||||
if custom_scope == 'subtree':
|
||||
ldap_scope = ldap.SCOPE_SUBTREE
|
||||
elif custom_scope == 'base':
|
||||
ldap_scope = ldap.SCOPE_BASE
|
||||
elif custom_scope == 'onelevel':
|
||||
ldap_scope = ldap.SCOPE_ONELEVEL
|
||||
finded = False
|
||||
found = False
|
||||
for basedn in basedns:
|
||||
try:
|
||||
result = con.search_s( basedn, ldap_scope, filter )
|
||||
result = con.search_s(basedn, ldap_scope, filter)
|
||||
if result:
|
||||
user_dn = result[0][0]
|
||||
# Check the password
|
||||
con.simple_bind_s( user_dn, password )
|
||||
finded = True
|
||||
con.simple_bind_s(user_dn, password)
|
||||
found = True
|
||||
break
|
||||
except ldap.LDAPError, detail:
|
||||
( exc_type, exc_value ) = sys.exc_info()[:2]
|
||||
logger.warning( "ldap_auth: searching %s for %s resulted in %s: %s\n" %
|
||||
( basedn, filter, exc_type, exc_value ) )
|
||||
if not finded:
|
||||
logger.warning( 'User [%s] not found!' % username )
|
||||
(exc_type, exc_value) = sys.exc_info()[:2]
|
||||
logger.warning("ldap_auth: searching %s for %s resulted in %s: %s\n" %
|
||||
(basedn, filter, exc_type, exc_value))
|
||||
if not found:
|
||||
logger.warning('User [%s] not found!' % username)
|
||||
return False
|
||||
result = result[0][1]
|
||||
if manage_user:
|
||||
logger.info( '[%s] Manage user data' % str( username ) )
|
||||
logger.info('[%s] Manage user data' % str(username))
|
||||
try:
|
||||
if not user_firstname_part == None:
|
||||
store_user_firstname = result[user_firstname_attrib][0].split( ' ', 1 )[user_firstname_part]
|
||||
if user_firstname_part is not None:
|
||||
store_user_firstname = result[user_firstname_attrib][0].split(' ', 1)[user_firstname_part]
|
||||
else:
|
||||
store_user_firstname = result[user_firstname_attrib][0]
|
||||
except KeyError, e:
|
||||
store_user_firstname = None
|
||||
try:
|
||||
if not user_lastname_part == None:
|
||||
store_user_lastname = result[user_lastname_attrib][0].split( ' ', 1 )[user_lastname_part]
|
||||
if user_lastname_part is not None:
|
||||
store_user_lastname = result[user_lastname_attrib][0].split(' ', 1)[user_lastname_part]
|
||||
else:
|
||||
store_user_lastname = result[user_lastname_attrib][0]
|
||||
except KeyError, e:
|
||||
@@ -374,253 +388,249 @@ def ldap_auth( server = 'ldap', port = None,
|
||||
#
|
||||
# user as username
|
||||
# #################
|
||||
user_in_db = db( db.auth_user.username == username )
|
||||
user_in_db = db(db.auth_user.username == username)
|
||||
if user_in_db.count() > 0:
|
||||
user_in_db.update( first_name = store_user_firstname,
|
||||
last_name = store_user_lastname,
|
||||
email = store_user_mail )
|
||||
user_in_db.update(first_name=store_user_firstname,
|
||||
last_name=store_user_lastname,
|
||||
email=store_user_mail)
|
||||
else:
|
||||
db.auth_user.insert( first_name = store_user_firstname,
|
||||
last_name = store_user_lastname,
|
||||
email = store_user_mail,
|
||||
username = username )
|
||||
db.auth_user.insert(first_name=store_user_firstname,
|
||||
last_name=store_user_lastname,
|
||||
email=store_user_mail,
|
||||
username=username)
|
||||
except:
|
||||
#
|
||||
# user as email
|
||||
# ##############
|
||||
user_in_db = db( db.auth_user.email == username )
|
||||
user_in_db = db(db.auth_user.email == username)
|
||||
if user_in_db.count() > 0:
|
||||
user_in_db.update( first_name = store_user_firstname,
|
||||
last_name = store_user_lastname,
|
||||
)
|
||||
user_in_db.update(first_name=store_user_firstname,
|
||||
last_name=store_user_lastname)
|
||||
else:
|
||||
db.auth_user.insert( first_name = store_user_firstname,
|
||||
last_name = store_user_lastname,
|
||||
email = username
|
||||
)
|
||||
db.auth_user.insert(first_name=store_user_firstname,
|
||||
last_name=store_user_lastname,
|
||||
email=username)
|
||||
con.unbind()
|
||||
|
||||
if manage_groups:
|
||||
if not do_manage_groups( username,password ):
|
||||
if not do_manage_groups(username, password):
|
||||
return False
|
||||
return True
|
||||
except ldap.LDAPError, e:
|
||||
import traceback
|
||||
logger.warning( '[%s] Error in ldap processing' % str( username ) )
|
||||
logger.debug( traceback.format_exc() )
|
||||
logger.warning('[%s] Error in ldap processing' % str(username))
|
||||
logger.debug(traceback.format_exc())
|
||||
return False
|
||||
except IndexError, ex: # for AD membership test
|
||||
except IndexError, ex: # for AD membership test
|
||||
import traceback
|
||||
logger.warning( '[%s] Ldap result indexing error' % str( username ) )
|
||||
logger.debug( traceback.format_exc() )
|
||||
logger.warning('[%s] Ldap result indexing error' % str(username))
|
||||
logger.debug(traceback.format_exc())
|
||||
return False
|
||||
|
||||
def is_user_in_allowed_groups( username,
|
||||
password = None,
|
||||
allowed_groups = allowed_groups
|
||||
):
|
||||
'''
|
||||
Figure out if the username is a member of an allowed group in ldap or not
|
||||
'''
|
||||
def is_user_in_allowed_groups(username,
|
||||
password=None,
|
||||
allowed_groups=allowed_groups):
|
||||
"""
|
||||
Figure out if the username is a member of an allowed group
|
||||
in ldap or not
|
||||
"""
|
||||
#
|
||||
# Get all group name where the user is in actually in ldap
|
||||
# #########################################################
|
||||
ldap_groups_of_the_user = get_user_groups_from_ldap( username, password )
|
||||
ldap_groups_of_the_user = get_user_groups_from_ldap(username, password)
|
||||
|
||||
# search for allowed group names
|
||||
if type( allowed_groups ) != type( list() ):
|
||||
if type(allowed_groups) != type(list()):
|
||||
allowed_groups = [allowed_groups]
|
||||
for group in allowed_groups:
|
||||
if ldap_groups_of_the_user.count( group ) > 0:
|
||||
if ldap_groups_of_the_user.count(group) > 0:
|
||||
# Match
|
||||
return True
|
||||
# No match
|
||||
return False
|
||||
|
||||
def do_manage_groups( username,
|
||||
password = None,
|
||||
db = db,
|
||||
):
|
||||
'''
|
||||
Manage user groups
|
||||
|
||||
Get all user's group from ldap and refresh the already stored
|
||||
ones in web2py's application database or create new groups
|
||||
according to ldap.
|
||||
'''
|
||||
logger.info( '[%s] Manage user groups' % str( username ) )
|
||||
def do_manage_groups(username,
|
||||
password=None,
|
||||
db=db):
|
||||
"""
|
||||
Manage user groups
|
||||
|
||||
Get all user's group from ldap and refresh the already stored
|
||||
ones in web2py's application database or create new groups
|
||||
according to ldap.
|
||||
"""
|
||||
logger.info('[%s] Manage user groups' % str(username))
|
||||
try:
|
||||
#
|
||||
# Get all group name where the user is in actually in ldap
|
||||
# #########################################################
|
||||
ldap_groups_of_the_user = get_user_groups_from_ldap( username, password )
|
||||
ldap_groups_of_the_user = get_user_groups_from_ldap(username, password)
|
||||
|
||||
#
|
||||
# Get all group name where the user is in actually in local db
|
||||
# #############################################################
|
||||
try:
|
||||
db_user_id = db( db.auth_user.username == username ).select( db.auth_user.id ).first().id
|
||||
db_user_id = db(db.auth_user.username == username).select(db.auth_user.id).first().id
|
||||
except:
|
||||
try:
|
||||
db_user_id = db( db.auth_user.email == username ).select( db.auth_user.id ).first().id
|
||||
db_user_id = db(db.auth_user.email == username).select(db.auth_user.id).first().id
|
||||
except AttributeError, e:
|
||||
#
|
||||
# There is no user in local db
|
||||
# We create one
|
||||
# ##############################
|
||||
try:
|
||||
db_user_id = db.auth_user.insert( username = username,
|
||||
first_name = username )
|
||||
db_user_id = db.auth_user.insert(username=username,
|
||||
first_name=username)
|
||||
except AttributeError, e:
|
||||
db_user_id = db.auth_user.insert( email = username,
|
||||
first_name = username )
|
||||
db_user_id = db.auth_user.insert(email=username,
|
||||
first_name=username)
|
||||
if not db_user_id:
|
||||
logging.error( 'There is no username or email for %s!' % username )
|
||||
logging.error('There is no username or email for %s!' % username)
|
||||
raise
|
||||
db_group_search = db( ( db.auth_membership.user_id == db_user_id ) & \
|
||||
( db.auth_user.id == db.auth_membership.user_id ) & \
|
||||
( db.auth_group.id == db.auth_membership.group_id ) )
|
||||
db_group_search = db((db.auth_membership.user_id == db_user_id) &
|
||||
(db.auth_user.id == db.auth_membership.user_id) &
|
||||
(db.auth_group.id == db.auth_membership.group_id))
|
||||
db_groups_of_the_user = list()
|
||||
db_group_id = dict()
|
||||
|
||||
if db_group_search.count() > 0:
|
||||
for group in db_group_search.select( db.auth_group.id, db.auth_group.role, distinct = True ):
|
||||
for group in db_group_search.select(db.auth_group.id,
|
||||
db.auth_group.role,
|
||||
distinct=True):
|
||||
db_group_id[group.role] = group.id
|
||||
db_groups_of_the_user.append( group.role )
|
||||
logging.debug( 'db groups of user %s: %s' % ( username, str( db_groups_of_the_user ) ) )
|
||||
db_groups_of_the_user.append(group.role)
|
||||
logging.debug('db groups of user %s: %s' %
|
||||
(username, str(db_groups_of_the_user)))
|
||||
|
||||
#
|
||||
# Delete user membership from groups where user is not anymore
|
||||
# #############################################################
|
||||
for group_to_del in db_groups_of_the_user:
|
||||
if ldap_groups_of_the_user.count( group_to_del ) == 0:
|
||||
db( ( db.auth_membership.user_id == db_user_id ) & \
|
||||
( db.auth_membership.group_id == db_group_id[group_to_del] ) ).delete()
|
||||
if ldap_groups_of_the_user.count(group_to_del) == 0:
|
||||
db((db.auth_membership.user_id == db_user_id) &
|
||||
(db.auth_membership.group_id == db_group_id[group_to_del])).delete()
|
||||
|
||||
#
|
||||
# Create user membership in groups where user is not in already
|
||||
# ##############################################################
|
||||
for group_to_add in ldap_groups_of_the_user:
|
||||
if db_groups_of_the_user.count( group_to_add ) == 0:
|
||||
if db( db.auth_group.role == group_to_add ).count() == 0:
|
||||
gid = db.auth_group.insert( role = group_to_add,
|
||||
description = 'Generated from LDAP' )
|
||||
if db_groups_of_the_user.count(group_to_add) == 0:
|
||||
if db(db.auth_group.role == group_to_add).count() == 0:
|
||||
gid = db.auth_group.insert(role=group_to_add,
|
||||
description='Generated from LDAP')
|
||||
else:
|
||||
gid = db( db.auth_group.role == group_to_add ).select( db.auth_group.id ).first().id
|
||||
db.auth_membership.insert( user_id = db_user_id,
|
||||
group_id = gid )
|
||||
gid = db(db.auth_group.role == group_to_add).select(db.auth_group.id).first().id
|
||||
db.auth_membership.insert(user_id=db_user_id,
|
||||
group_id=gid)
|
||||
except:
|
||||
logger.warning( "[%s] Groups are not managed successully!" % str( username ) )
|
||||
logger.warning("[%s] Groups are not managed successfully!" %
|
||||
str(username))
|
||||
import traceback
|
||||
logger.debug( traceback.format_exc() )
|
||||
logger.debug(traceback.format_exc())
|
||||
return False
|
||||
return True
|
||||
|
||||
def init_ldap(
|
||||
ldap_server = server,
|
||||
ldap_port = port,
|
||||
ldap_basedn = base_dn,
|
||||
ldap_mode = mode,
|
||||
secure = secure,
|
||||
cert_path = cert_path,
|
||||
cert_file = cert_file
|
||||
):
|
||||
'''
|
||||
Inicialize ldap connection
|
||||
'''
|
||||
logger.info( '[%s] Inicialize ldap connection' % str( ldap_server ) )
|
||||
def init_ldap(ldap_server=server,
|
||||
ldap_port=port,
|
||||
ldap_basedn=base_dn,
|
||||
ldap_mode=mode,
|
||||
secure=secure,
|
||||
cert_path=cert_path,
|
||||
cert_file=cert_file):
|
||||
"""
|
||||
Inicialize ldap connection
|
||||
"""
|
||||
logger.info('[%s] Initialize ldap connection' % str(ldap_server))
|
||||
if secure:
|
||||
if not ldap_port:
|
||||
ldap_port = 636
|
||||
con = ldap.initialize(
|
||||
"ldaps://" + ldap_server + ":" + str( ldap_port ) )
|
||||
con = ldap.initialize(
|
||||
"ldaps://" + ldap_server + ":" + str(ldap_port))
|
||||
if cert_path:
|
||||
con.set_option( ldap.OPT_X_TLS_CACERTDIR, cert_path )
|
||||
con.set_option(ldap.OPT_X_TLS_CACERTDIR, cert_path)
|
||||
if cert_file:
|
||||
con.set_option( ldap.OPT_X_TLS_CACERTFILE, cert_file )
|
||||
con.set_option(ldap.OPT_X_TLS_CACERTFILE, cert_file)
|
||||
else:
|
||||
if not ldap_port:
|
||||
ldap_port = 389
|
||||
con = ldap.initialize(
|
||||
"ldap://" + ldap_server + ":" + str( ldap_port ) )
|
||||
con = ldap.initialize(
|
||||
"ldap://" + ldap_server + ":" + str(ldap_port))
|
||||
return con
|
||||
|
||||
def get_user_groups_from_ldap( username,
|
||||
password = None,
|
||||
base_dn = base_dn,
|
||||
ldap_binddn = bind_dn,
|
||||
ldap_bindpw = bind_pw,
|
||||
group_dn = group_dn,
|
||||
group_name_attrib = group_name_attrib,
|
||||
group_member_attrib = group_member_attrib,
|
||||
group_filterstr = group_filterstr,
|
||||
ldap_mode = mode
|
||||
):
|
||||
'''
|
||||
Get all group names from ldap where the user is in
|
||||
'''
|
||||
logger.info( '[%s] Get user groups from ldap' % str( username ) )
|
||||
def get_user_groups_from_ldap(username,
|
||||
password=None,
|
||||
base_dn=base_dn,
|
||||
ldap_binddn=bind_dn,
|
||||
ldap_bindpw=bind_pw,
|
||||
group_dn=group_dn,
|
||||
group_name_attrib=group_name_attrib,
|
||||
group_member_attrib=group_member_attrib,
|
||||
group_filterstr=group_filterstr,
|
||||
ldap_mode=mode):
|
||||
"""
|
||||
Get all group names from ldap where the user is in
|
||||
"""
|
||||
logger.info('[%s] Get user groups from ldap' % str(username))
|
||||
#
|
||||
# Get all group name where the user is in actually in ldap
|
||||
# #########################################################
|
||||
# Inicialize ldap
|
||||
# Initialize ldap
|
||||
if not group_dn:
|
||||
group_dn = base_dn
|
||||
con = init_ldap()
|
||||
logger.debug('Username init: [%s]'%username)
|
||||
if ldap_mode=='ad':
|
||||
logger.debug('Username init: [%s]' % username)
|
||||
if ldap_mode == 'ad':
|
||||
#
|
||||
# Get the AD username
|
||||
# ####################
|
||||
if '@' not in username:
|
||||
domain = []
|
||||
for x in base_dn.split( ',' ):
|
||||
for x in base_dn.split(','):
|
||||
if "DC=" in x.upper():
|
||||
domain.append( x.split( '=' )[-1] )
|
||||
username = "%s@%s" % ( username, '.'.join( domain ) )
|
||||
username_bare = username.split( "@" )[0]
|
||||
con.set_option( ldap.OPT_PROTOCOL_VERSION, 3 )
|
||||
# In cases where ForestDnsZones and DomainDnsZones are found,
|
||||
# result will look like the following:
|
||||
# ['ldap://ForestDnsZones.domain.com/DC=ForestDnsZones,DC=domain,DC=com']
|
||||
domain.append(x.split('=')[-1])
|
||||
username = "%s@%s" % (username, '.'.join(domain))
|
||||
username_bare = username.split("@")[0]
|
||||
con.set_option(ldap.OPT_PROTOCOL_VERSION, 3)
|
||||
# In cases where ForestDnsZones and DomainDnsZones are found,
|
||||
# result will look like the following:
|
||||
# ['ldap://ForestDnsZones.domain.com/DC=ForestDnsZones,DC=domain,DC=com']
|
||||
if ldap_binddn:
|
||||
# need to search directory with an admin account 1st
|
||||
con.simple_bind_s( ldap_binddn, ldap_bindpw )
|
||||
con.simple_bind_s(ldap_binddn, ldap_bindpw)
|
||||
logger.debug('Ldap bind connect...')
|
||||
else:
|
||||
# credentials should be in the form of username@domain.tld
|
||||
con.simple_bind_s( username, password )
|
||||
con.simple_bind_s(username, password)
|
||||
logger.debug('Ldap username connect...')
|
||||
# We have to use the full string
|
||||
username = con.search_ext_s(
|
||||
base_dn, ldap.SCOPE_SUBTREE,
|
||||
"(&(sAMAccountName=%s)(%s))" % ( ldap.filter.escape_filter_chars( username_bare ), filterstr ), ["cn"] )[0][0]
|
||||
username = con.search_ext_s(base_dn, ldap.SCOPE_SUBTREE,
|
||||
"(&(sAMAccountName=%s)(%s))" %
|
||||
(ldap.filter.escape_filter_chars(username_bare), filterstr), ["cn"])[0][0]
|
||||
else:
|
||||
if ldap_binddn:
|
||||
# need to search directory with an bind_dn account 1st
|
||||
con.simple_bind_s( ldap_binddn, ldap_bindpw )
|
||||
con.simple_bind_s(ldap_binddn, ldap_bindpw)
|
||||
else:
|
||||
# bind as anonymous
|
||||
con.simple_bind_s( '', '' )
|
||||
con.simple_bind_s('', '')
|
||||
|
||||
# search for groups where user is in
|
||||
filter = '(&(%s=%s)(%s))' % ( ldap.filter.escape_filter_chars( group_member_attrib ),
|
||||
ldap.filter.escape_filter_chars( username ),
|
||||
group_filterstr )
|
||||
group_search_result = con.search_s( group_dn,
|
||||
ldap.SCOPE_SUBTREE,
|
||||
filter, [group_name_attrib] )
|
||||
filter = '(&(%s=%s)(%s))' % (ldap.filter.escape_filter_chars(group_member_attrib),
|
||||
ldap.filter.escape_filter_chars(username),
|
||||
group_filterstr)
|
||||
group_search_result = con.search_s(group_dn,
|
||||
ldap.SCOPE_SUBTREE,
|
||||
filter, [group_name_attrib])
|
||||
ldap_groups_of_the_user = list()
|
||||
for group_row in group_search_result:
|
||||
group = group_row[1]
|
||||
ldap_groups_of_the_user.extend( group[group_name_attrib] )
|
||||
ldap_groups_of_the_user.extend(group[group_name_attrib])
|
||||
|
||||
con.unbind()
|
||||
logger.debug('User groups: %s' % ldap_groups_of_the_user )
|
||||
return list( ldap_groups_of_the_user )
|
||||
logger.debug('User groups: %s' % ldap_groups_of_the_user)
|
||||
return list(ldap_groups_of_the_user)
|
||||
|
||||
|
||||
if filterstr[0] == '(' and filterstr[-1] == ')': # rfc4515 syntax
|
||||
filterstr = filterstr[1:-1] # parens added again where used
|
||||
if filterstr[0] == '(' and filterstr[-1] == ')': # rfc4515 syntax
|
||||
filterstr = filterstr[1:-1] # parens added again where used
|
||||
return ldap_auth_aux
|
||||
|
||||
|
||||
@@ -1,35 +1,82 @@
|
||||
<html><body><h1>Markmin markup language</h1><h2>About</h2><p>This is a new markup language that we call markmin designed to produce high quality scientific papers and books and also put them online. We provide serializers for html, latex and pdf. It is implemented in the <code class="">markmin2html</code> function in the <code class="">markmin2html.py</code>.</p><p>Example of usage:</p><pre><code class="">>>> m = "Hello **world** [[link http://web2py.com]]"
|
||||
>>> from markmin2html import markmin2html
|
||||
>>> print markmin2html(m)
|
||||
>>> from markmin2latex import markmin2latex
|
||||
>>> print markmin2latex(m)
|
||||
>>> from markmin2pdf import markmin2pdf # requires pdflatex
|
||||
>>> print markmin2pdf(m)</code></pre><h2>Why?</h2><p>We wanted a markup language with the following requirements:</p><ul><li>less than 100 lines of functional code</li><li>easy to read</li><li>secure</li><li>support table, ul, ol, code</li><li>support html5 video and audio elements (html serialization only)</li><li>can align images and resize them</li><li>can specify class for tables and code elements</li><li>can add anchors</li><li>does not use _ for markup (since it creates odd behavior)</li><li>automatically links urls</li><li>fast</li><li>easy to extend</li><li>supports latex and pdf including references</li><li>allows to describe the markup in the markup (this document is generated from markmin syntax)</li></ul><p>(results depend on text but in average for text ~100K markmin is 30% faster than markdown, for text ~10K it is 10x faster)</p><p>The <a href="http://www.lulu.com/product/paperback/web2py-%283rd-edition%29/12822827">web2py book</a> published by lulu, for example, was entirely generated with markmin2pdf from the online <a href="http://www.web2py.com/book">web2py wiki</a></p><h2>Download</h2><ul><li>http://web2py.googlecode.com/hg/gluon/contrib/markmin/markmin2html.py</li><li>http://web2py.googlecode.com/hg/gluon/contrib/markmin/markmin2latex.py</li><li>http://web2py.googlecode.com/hg/gluon/contrib/markmin/markmin2pdf.py</li></ul><p>markmin2html.py and markmin2latex.py are single files and have no web2py dependence. Their license is BSD.</p><h2>Examples</h2><h3>Bold, italic, code and links</h3><table class=""><tr><td><b>SOURCE</b> </td><td><b>OUTPUT</b></td></tr><tr><td><code class=""># title</code> </td><td><b>title</b></td></tr><tr><td><code class="">## section</code> </td><td><b>section</b></td></tr><tr><td><code class="">### subsection</code> </td><td><b>subsection</b></td></tr><tr><td><code class="">**bold**</code> </td><td><b>bold</b></td></tr><tr><td><code class="">''italic''</code> </td><td><i>italic</i></td></tr><tr><td><code class="">``verbatim``</code> </td><td><code class="">verbatim</code></td></tr><tr><td><code class="">http://google.com</code> </td><td>http://google.com</td></tr><tr><td><code class="">[[click me #myanchor]]</code></td><td><a href="#myanchor">click me</a></td></tr></table>
|
||||
<h3>More on links</h3><p>The format is always <code class="">[[title link]]</code>. Notice you can nest bold, italic and code inside the link title.</p><h3>Anchors <span id="myanchor"><span></h3><p>You can place an anchor anywhere in the text using the syntax <code class="">[[name]]</code> where <i>name</i> is the name of the anchor.
|
||||
You can then link the anchor with <a href="#myanchor">link</a>, i.e. <code class="">[[link #myanchor]]</code>.</p><h3>Images</h3><p><img src="http://www.web2py.com/examples/static/web2py_logo.png" alt="some image" align="right" width="200px" />
|
||||
This paragraph has an image aligned to the right with a width of 200px. Its is placed using the code</p><p><code class="">[[some image http://www.web2py.com/examples/static/web2py_logo.png right 200px]]</code>.</p><h3>Unordered Lists</h3><pre><code class="">- Dog
|
||||
<html><body>
|
||||
<style>
|
||||
blockquote { background-color: lime; }
|
||||
thead { color: white; background-color: gray; text-align: center; }
|
||||
tfoot { color: white; background-color: gray; }
|
||||
|
||||
.tableclass1 { background-color: yellow; }
|
||||
.tableclass1 thead { color: yellow; background-color: green; }
|
||||
.tableclass1 tfoot { color: yellow; background-color: green; }
|
||||
|
||||
td.num { text-align: right; }
|
||||
pre { background-color: #E0E0E0; }
|
||||
</style>
|
||||
<h1>Markmin markup language</h1><h2>About</h2><p>This is a new markup language that we call markmin designed to produce high quality scientific papers and books and also put them online. We provide serializers for html, latex and pdf. It is implemented in the <code>markmin2html</code> function in the <code>markmin2html.py</code>.</p><p>Example of usage:</p><pre><code>m = "Hello **world** [[link http://web2py.com]]"
|
||||
from markmin2html import markmin2html
|
||||
print markmin2html(m)
|
||||
from markmin2latex import markmin2latex
|
||||
print markmin2latex(m)
|
||||
from markmin2pdf import markmin2pdf # requires pdflatex
|
||||
print markmin2pdf(m)</code></pre> ====================<h1>This is a test block with new features:</h1><p>This is a blockquote with a list with tables in it:</p><blockquote class="blockquoteclass" id="markmin_blockquoteid">This is a paragraph before list. You can continue paragraph on the next lines.<br />This is an ordered list with tables:<ol><li>Item 1</li><li>Item 2</li><li><table class="tableclass1" id="markmin_tableid1"><tbody><tr><td>aa</td><td>bb</td><td>cc</td></tr><tr><td class="num">11</td><td class="num">22</td><td class="num">33</td></tr></tbody></table></li><li>Item 4 <table class="tableclass1"><thead><tr><td>T1</td><td>T2</td><td>t3</td></tr></thead><tbody><tr><td>aaa</td><td>bbb</td><td>ccc</td></tr><tr><td>ddd</td><td>fff</td><td>ggg</td></tr><tr><td class="num">123</td><td class="num">0</td><td class="num">5.0</td></tr></tbody></table></li></ol></blockquote><p>This this a new paragraph with a table. Table has header and footer:</p><table class="tableclass1" id="markmin_tableid2"><thead><tr><td><strong>Title 1</strong></td><td><strong>Title 2</strong></td><td><strong>Title 3</strong></td></tr></thead><tbody><tr><td>data 1</td><td>data 2</td><td class="num">2.00</td></tr><tr><td>data 4</td><td>data5(long)</td><td class="num">23.00</td></tr><tr><td></td><td>data 8</td><td class="num">33.50</td></tr></tbody><tfoot><tr><td>Total:</td><td>3 items</td><td class="num">58.50</td></tr></tfoot></table><h2>Multilevel lists</h2><p>Now lists can be multilevel:</p><ol><li>Ordered item 1 on level 1. You can continue item text on next strings<ol><li><p>Ordered item 1 of sublevel 2 with a paragraph (paragraph can start with point after plus or minus characters, e.g. <strong>++.</strong> or <strong>--.</strong>)</p><li><p>This is another item. But with 3 paragraphs, blockquote and sublists:</p><p>This is the second paragraph in the item. You can add paragraphs to an item, using point notation, where first characters in the string are sequence of points with space between them and another string. For example, this paragraph (in sublevel 2) starts with two points:</p><code>.. This is the second paragraph...</code><blockquote><h3>this is a blockquote in a list</h3>You can use blockquote with headers, paragraphs, tables and lists in it:<br />Tables can have or have not header and footer. This table is defined without any header and footer in it:<table><tbody><tr><td>red</td><td>fox</td><td class="num">0</td></tr><tr><td>blue</td><td>dolphin</td><td class="num">1000</td></tr><tr><td>green</td><td>leaf</td><td class="num">10000</td></tr></tbody></table></blockquote><p>This is yet another paragraph in the item.</p><ul><li>This is an item of unordered list <strong>(sublevel 3)</strong></li><li>This is the second item of the unordered list <em>(sublevel 3)</em><ol><ol><ol><li>This is a single item of ordered list in sublevel 6</li></ol></ol><p>and this is a paragraph in sublevel 4</p></ol></li><li><p>This is a new item with paragraph in sublevel 3.</p><ol><li>Start ordered list in sublevel 4 with code block: <pre><code>line 1
|
||||
line 2
|
||||
line 3</code></pre></li><li><p>Yet another item with code block:</p><pre><code> line 1
|
||||
line 2
|
||||
line 3</code></pre> This item finishes with this paragraph.</li></ol><p>Item in sublevel 3 can be continued with paragraphs.</p><pre><code> this is another
|
||||
code block
|
||||
in the
|
||||
sublevel 3 item</code></pre></li></ul><ol><li>The last item in sublevel 3</li></ol><p>This is a continuous paragraph for item 2 in sublevel 2. You can use such structure to create difficult structured documents.</p><li>item 3 in sublevel 2</li></li></li></ol><ul><li>item 1 in sublevel 2 (new unordered list)</li><li>item 2 in sublevel 2</li><li>item 3 in sublevel 2</li></ul><ol><li>item 1 in sublevel 2 (new ordered list)</li><li>item 2 in sublevel 2</li><li>item 3 in sublevle 2</li></ol></li><li>item 2 in level 1</li><li>item 3 in level 1</li></ol><ul><li>new unordered list (item 1 in level 1)</li><li>level 2 in level 1</li><li>level 3 in level 1</li><li>level 4 in level 1</li></ul><h2>This is the last section of the test</h2><p>Single paragraph with '----' in it will be turned into separator:</p><hr /><p>And this is the last paragraph in the test. Be happy!</p><p>====================</p><h2>Why?</h2><p>We wanted a markup language with the following requirements:</p><ul><li>less than 300 lines of functional code</li><li>easy to read</li><li>secure</li><li>support table, ul, ol, code</li><li>support html5 video and audio elements (html serialization only)</li><li>can align images and resize them</li><li>can specify class for tables and code elements</li><li>can add anchors</li><li>does not use _ for markup (since it creates odd behavior)</li><li>automatically links urls</li><li>fast</li><li>easy to extend</li><li>supports latex and pdf including references</li><li>allows to describe the markup in the markup (this document is generated from markmin syntax)</li></ul><p>(results depend on text but in average for text ~100K markmin is 30% faster than markdown, for text ~10K it is 10x faster)</p><p>The <a href="http://www.lulu.com/product/paperback/web2py-%283rd-edition%29/12822827">web2py book</a> published by lulu, for example, was entirely generated with markmin2pdf from the online <a href="http://www.web2py.com/book">web2py wiki</a></p><h2>Download</h2><ul><li><a href="http://web2py.googlecode.com/hg/gluon/contrib/markmin/markmin2html.py">http://web2py.googlecode.com/hg/gluon/contrib/markmin/markmin2html.py</a></li><li><a href="http://web2py.googlecode.com/hg/gluon/contrib/markmin/markmin2latex.py">http://web2py.googlecode.com/hg/gluon/contrib/markmin/markmin2latex.py</a></li><li><a href="http://web2py.googlecode.com/hg/gluon/contrib/markmin/markmin2pdf.py">http://web2py.googlecode.com/hg/gluon/contrib/markmin/markmin2pdf.py</a></li></ul><p>markmin2html.py and markmin2latex.py are single files and have no web2py dependence. Their license is BSD.</p><h2>Examples</h2><h3>Bold, italic, code and links</h3><table><thead><tr><td><strong>SOURCE</strong></td><td><strong>OUTPUT</strong></td></tr></thead><tbody><tr><td><code># title</code></td><td><strong>title</strong></td></tr><tr><td><code>## section</code></td><td><strong>section</strong></td></tr><tr><td><code>### subsection</code></td><td><strong>subsection</strong></td></tr><tr><td><code>**bold**</code></td><td><strong>bold</strong></td></tr><tr><td><code>''italic''</code></td><td><em>italic</em></td></tr><tr><td><code>~~strikeout~~</code></td><td><del>strikeout</del></td></tr><tr><td><code>``verbatim``</code></td><td><code>verbatim</code></td></tr><tr><td><code>``color with **bold**``:red</code></td><td><span style="color: red">color with <strong>bold</strong></span></td></tr><tr><td><code>``many colors``:color[blue:#ffff00]</code></td><td><span style="color: blue;background-color: #ffff00;">many colors</span></td></tr><tr><td><code>http://google.com</code></td><td><a href="http://google.com">http://google.com</a></td></tr><tr><td><code>[[**click** me #myanchor]]</code></td><td><a href="#myanchor"><strong>click</strong> me</a></td></tr><tr><td><code>[[click me [extra info] #myanchor popup]]</code></td><td><a href="#myanchor" title="extra info" target="_blank">click me</a></td></tr></tbody></table><h3>More on links</h3><p>The format is always <code>[[title link]]</code> or <code>[[title [extra] link]]</code>. Notice you can nest bold, italic, strikeout and code inside the link <code>title</code>.</p><h3>Anchors <span id="myanchor"></span></h3><p>You can place an anchor anywhere in the text using the syntax <code>[[name]]</code> where <em>name</em> is the name of the anchor. You can then link the anchor with <a href="#myanchor">link</a>, i.e. <code>[[link #myanchor]]</code> or <a href="#myanchor" title="extra info">link with an extra info</a>, i.e. <code>[[link with an extra info [extra info] #myanchor]]</code>.</p><h3>Images</h3><p><img src="http://www.web2py.com/examples/static/web2py_logo.png" alt="alt-string for the image" title="the image title" style="float:right" width="200px" /> This paragraph has an image aligned to the right with a width of 200px. Its is placed using the code</p><p><code>[[alt-string for the image [the image title] http://www.web2py.com/examples/static/web2py_logo.png right 200px]]</code>.</p><h3>Unordered Lists</h3><pre><code>- Dog
|
||||
- Cat
|
||||
- Mouse</code></pre><p>is rendered as</p><ul><li>Dog</li><li>Cat</li><li>Mouse</li></ul><p>Two new lines between items break the list in two lists.</p><h3>Ordered Lists</h3><pre><code class="">+ Dog
|
||||
- Mouse</code></pre><p>is rendered as</p><ul><li>Dog</li><li>Cat</li><li>Mouse</li></ul><p>Two new lines between items break the list in two lists.</p><h3>Ordered Lists</h3><pre><code>+ Dog
|
||||
+ Cat
|
||||
+ Mouse</code></pre><p>is rendered as</p><ol><li>Dog</li><li>Cat</li><li>Mouse</li></ol><h3>Tables</h3><p>Something like this
|
||||
<pre><code class="">---------
|
||||
**A** | **B** | **C**
|
||||
0 | 0 | X
|
||||
0 | X | 0
|
||||
X | 0 | 0
|
||||
-----:abc</code></pre>
|
||||
is a table and is rendered as
|
||||
<table class="abc"><tr><td><b>A</b></td><td><b>B</b></td><td><b>C</b></td></tr><tr><td>0</td><td>0</td><td>X</td></tr><tr><td>0</td><td>X</td><td>0</td></tr><tr><td>X</td><td>0</td><td>0</td></tr></table>Four or more dashes delimit the table and | separates the columns.
|
||||
The <code class="">:abc</code> at the end sets the class for the table and it is optional.</p><h3>Blockquote</h3><p>A table with a single cell is rendered as a blockquote:</p><blockquote class="">Hello world</blockquote>
|
||||
<h3>Code, <code class=""><code></code>, escaping and extra stuff</h3><pre><code class="python">def test():
|
||||
return "this is Python code"</code></pre><p>Optionally a ` inside a <code class="">``...``</code> block can be inserted escaped with !`!.
|
||||
The <code class="">:python</code> after the markup is also optional. If present, by default, it is used to set the class of the <code> block.
|
||||
The behavior can be overridden by passing an argument <code class="">extra</code> to the <code class="">render</code> function. For example:</p><pre><code class="python">>>> markmin2html("``aaa``:custom",
|
||||
extra=dict(custom=lambda text: 'x'+text+'x'))</code></pre><p>generates</p><code class="python">'xaaax'</code><p>(the <code class="">``...``:custom</code> block is rendered by the <code class="">custom=lambda</code> function passed to <code class="">render</code>).</p><h3>Html5 support</h3><p>Markmin also supports the <video> and <audio> html5 tags using the notation:
|
||||
<pre><code class="">[[title link video]]
|
||||
[[title link audio]]</code></pre></p><h3>Latex</h3><p>Formulas can be embedded into HTML with <code class="">$</code><code class="">$</code>formula<code class="">$</code><code class="">$</code>.
|
||||
You can use Google charts to render the formula:</p><pre><code class="">>>> LATEX = '<img src="http://chart.apis.google.com/chart?cht=tx&chl=%s" align="center"/>'
|
||||
>>> markmin2html(text,{'latex':lambda code: LATEX % code.replace('"','"')})</code></pre><h3>Citations and References</h3><p>Citations are treated as internal links in html and proper citations in latex if there is a final section called "References". Items like</p><pre><code class="">- [[key]] value</code></pre><p>in the References will be translated into Latex</p><pre><code class="">\bibitem{key} value</code></pre><p>Here is an example of usage:</p><pre><code class="">As shown in Ref.``mdipierro``:cite
|
||||
+ Mouse</code></pre><p>is rendered as</p><ol><li>Dog</li><li>Cat</li><li>Mouse</li></ol><h3>Multilevel Lists</h3><pre><code>+ Dogs
|
||||
-- red
|
||||
-- brown
|
||||
-- black
|
||||
+ Cats
|
||||
-- fluffy
|
||||
-- smooth
|
||||
-- bald
|
||||
+ Mice
|
||||
-- small
|
||||
-- big
|
||||
-- huge</code></pre><p>is rendered as</p><ol><li>Dogs<ul><li>red</li><li>brown</li><li>black</li></ul></li><li>Cats<ul><li>fluffy</li><li>smooth</li><li>bald</li></ul></li><li>Mice<ul><li>small</li><li>big</li><li>huge</li></ul></li></ol><h3>Tables (with optional header and/or footer)</h3><p>Something like this</p><pre><code>-----------------
|
||||
**A**|**B**|**C**
|
||||
=================
|
||||
0 | 0 | X
|
||||
0 | X | 0
|
||||
X | 0 | 0
|
||||
=================
|
||||
**D**|**F**|**G**
|
||||
-----------------:abc[id]</code></pre> is a table and is rendered as<table class="abc" id="markmin_id"><thead><tr><td><strong>A</strong></td><td><strong>B</strong></td><td><strong>C</strong></td></tr></thead><tbody><tr><td class="num">0</td><td class="num">0</td><td>X</td></tr><tr><td class="num">0</td><td>X</td><td class="num">0</td></tr><tr><td>X</td><td class="num">0</td><td class="num">0</td></tr></tbody><tfoot><tr><td><strong>D</strong></td><td><strong>F</strong></td><td><strong>G</strong></td></tr></tfoot></table> Four or more dashes delimit the table and | separates the columns. The <code>:abc</code>, <code>:id[abc_1]</code> or <code>:abc[abc_1]</code> at the end sets the class and/or id for the table and it is optional.<h3>Blockquote</h3><p>A table with a single cell is rendered as a blockquote:</p><blockquote>Hello world</blockquote><p>Blockquote can contain headers, paragraphs, lists and tables:</p><pre><code>-----
|
||||
This is a paragraph in a blockquote
|
||||
|
||||
+ item 1
|
||||
+ item 2
|
||||
-- item 2.1
|
||||
-- item 2.2
|
||||
+ item 3
|
||||
|
||||
---------
|
||||
0 | 0 | X
|
||||
0 | X | 0
|
||||
X | 0 | 0
|
||||
---------:tableclass1
|
||||
-----</code></pre><p>is rendered as:</p><blockquote>This is a paragraph in a blockquote<ol><li>item 1</li><li>item 2<ul><li>item 2.1</li><li>item 2.2</li></ul></li><li>item 3</li></ol><table class="tableclass1"><tbody><tr><td class="num">0</td><td class="num">0</td><td>X</td></tr><tr><td class="num">0</td><td>X</td><td class="num">0</td></tr><tr><td>X</td><td class="num">0</td><td class="num">0</td></tr></tbody></table></blockquote><h3>Code, <code><code></code>, escaping and extra stuff</h3><pre><code class="python">def test():
|
||||
return "this is Python code"</code></pre><p>Optionally a ` inside a <code>``...``</code> block can be inserted escaped with !`!.</p><p><strong>NOTE:</strong> You can escape markmin constructions ('',``,**,~~,[,{,]},$,@) with '\' character: so \`\` can replace !`!`! escape string</p><p>The <code>:python</code> after the markup is also optional. If present, by default, it is used to set the class of the <code> block. The behavior can be overridden by passing an argument <code>extra</code> to the <code>render</code> function. For example:</p><pre><code class="python">markmin2html("``aaa``:custom",
|
||||
extra=dict(custom=lambda text: 'x'+text+'x'))</code></pre><p>generates</p><code class="python">'xaaax'</code><p>(the <code>``...``:custom</code> block is rendered by the <code>custom=lambda</code> function passed to <code>render</code>).</p><h3>Html5 support</h3><p>Markmin also supports the <video> and <audio> html5 tags using the notation:</p><pre><code>[[message link video]]
|
||||
[[message link audio]]
|
||||
|
||||
[[message [title] link video]]
|
||||
[[message [title] link audio]]</code></pre> where <code>message</code> will be shown in brousers without HTML5 video/audio tags support.<h3>Latex and other extensions</h3><p>Formulas can be embedded into HTML with <em>$$<code>formula</code>$$</em>. You can use Google charts to render the formula:</p><pre><code>LATEX = '<img src="http://chart.apis.google.com/chart?cht=tx&chl=%s" />'
|
||||
markmin2html(text,{'latex':lambda code: LATEX % code.replace('"','\"')})</code></pre><h3>Code with syntax highlighting</h3><p>This requires a syntax highlighting tool, such as the web2py CODE helper.</p><pre><code>extra={'code_cpp':lambda text: CODE(text,language='cpp').xml(),
|
||||
'code_java':lambda text: CODE(text,language='java').xml(),
|
||||
'code_python':lambda text: CODE(text,language='python').xml(),
|
||||
'code_html':lambda text: CODE(text,language='html').xml()}</code></pre> or simple:<pre><code>extra={'code':lambda text,lang='python': CODE(text,language=lang).xml()}</code></pre><pre><code>markmin2html(text,extra=extra)</code></pre><p>Code can now be marked up as in this example:</p><pre><code>``
|
||||
<html><body>example</body></html>
|
||||
``:code_html</code></pre> OR<pre><code>``
|
||||
<html><body>example</body></html>
|
||||
``:code[html]</code></pre><h3>Citations and References</h3><p>Citations are treated as internal links in html and proper citations in latex if there is a final section called "References". Items like</p><pre><code>- [[key]] value</code></pre><p>in the References will be translated into Latex</p><pre><code>\bibitem{key} value</code></pre><p>Here is an example of usage:</p><pre><code>As shown in Ref.``mdipierro``:cite
|
||||
|
||||
## References
|
||||
- [[mdipierro]] web2py Manual, 3rd Edition, lulu.com</code></pre><h3>Caveats</h3><p><code class=""><ul/></code>, <code class=""><ol/></code>, <code class=""><code/></code>, <code class=""><table/></code>, <code class=""><blockquote/></code>, <code class=""><h1/></code>, ..., <code class=""><h6/></code> do not have <code class=""><p>...</p></code> around them.</p></body></html>
|
||||
|
||||
- [[mdipierro]] web2py Manual, 3rd Edition, lulu.com</code></pre><h3>Caveats</h3><p><code><ul/></code>, <code><ol/></code>, <code><code/></code>, <code><table/></code>, <code><blockquote/></code>, <code><h1/></code>, ..., <code><h6/></code> do not have <code><p>...</p></code> around them.</p></body></html>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,130 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
pbkdf2
|
||||
~~~~~~
|
||||
|
||||
This module implements pbkdf2 for Python. It also has some basic
|
||||
tests that ensure that it works. The implementation is straightforward
|
||||
and uses stdlib only stuff and can be easily be copy/pasted into
|
||||
your favourite application.
|
||||
|
||||
Use this as replacement for bcrypt that does not need a c implementation
|
||||
of a modified blowfish crypto algo.
|
||||
|
||||
Example usage:
|
||||
|
||||
>>> pbkdf2_hex('what i want to hash', 'the random salt')
|
||||
'fa7cc8a2b0a932f8e6ea42f9787e9d36e592e0c222ada6a9'
|
||||
|
||||
How to use this:
|
||||
|
||||
1. Use a constant time string compare function to compare the stored hash
|
||||
with the one you're generating::
|
||||
|
||||
def safe_str_cmp(a, b):
|
||||
if len(a) != len(b):
|
||||
return False
|
||||
rv = 0
|
||||
for x, y in izip(a, b):
|
||||
rv |= ord(x) ^ ord(y)
|
||||
return rv == 0
|
||||
|
||||
2. Use `os.urandom` to generate a proper salt of at least 8 byte.
|
||||
Use a unique salt per hashed password.
|
||||
|
||||
3. Store ``algorithm$salt:costfactor$hash`` in the database so that
|
||||
you can upgrade later easily to a different algorithm if you need
|
||||
one. For instance ``PBKDF2-256$thesalt:10000$deadbeef...``.
|
||||
|
||||
|
||||
:copyright: (c) Copyright 2011 by Armin Ronacher.
|
||||
:license: BSD, see LICENSE for more details.
|
||||
"""
|
||||
import hmac
|
||||
import hashlib
|
||||
from struct import Struct
|
||||
from operator import xor
|
||||
from itertools import izip, starmap
|
||||
|
||||
|
||||
_pack_int = Struct('>I').pack
|
||||
|
||||
|
||||
def pbkdf2_hex(data, salt, iterations=1000, keylen=24, hashfunc=None):
|
||||
"""Like :func:`pbkdf2_bin` but returns a hex encoded string."""
|
||||
return pbkdf2_bin(data, salt, iterations, keylen, hashfunc).encode('hex')
|
||||
|
||||
|
||||
def pbkdf2_bin(data, salt, iterations=1000, keylen=24, hashfunc=None):
|
||||
"""Returns a binary digest for the PBKDF2 hash algorithm of `data`
|
||||
with the given `salt`. It iterates `iterations` time and produces a
|
||||
key of `keylen` bytes. By default SHA-1 is used as hash function,
|
||||
a different hashlib `hashfunc` can be provided.
|
||||
"""
|
||||
hashfunc = hashfunc or hashlib.sha1
|
||||
mac = hmac.new(data, None, hashfunc)
|
||||
def _pseudorandom(x, mac=mac):
|
||||
h = mac.copy()
|
||||
h.update(x)
|
||||
return map(ord, h.digest())
|
||||
buf = []
|
||||
for block in xrange(1, -(-keylen // mac.digest_size) + 1):
|
||||
rv = u = _pseudorandom(salt + _pack_int(block))
|
||||
for i in xrange(iterations - 1):
|
||||
u = _pseudorandom(''.join(map(chr, u)))
|
||||
rv = starmap(xor, izip(rv, u))
|
||||
buf.extend(rv)
|
||||
return ''.join(map(chr, buf))[:keylen]
|
||||
|
||||
|
||||
def test():
|
||||
failed = []
|
||||
def check(data, salt, iterations, keylen, expected):
|
||||
rv = pbkdf2_hex(data, salt, iterations, keylen)
|
||||
if rv != expected:
|
||||
print 'Test failed:'
|
||||
print ' Expected: %s' % expected
|
||||
print ' Got: %s' % rv
|
||||
print ' Parameters:'
|
||||
print ' data=%s' % data
|
||||
print ' salt=%s' % salt
|
||||
print ' iterations=%d' % iterations
|
||||
print
|
||||
failed.append(1)
|
||||
|
||||
# From RFC 6070
|
||||
check('password', 'salt', 1, 20,
|
||||
'0c60c80f961f0e71f3a9b524af6012062fe037a6')
|
||||
check('password', 'salt', 2, 20,
|
||||
'ea6c014dc72d6f8ccd1ed92ace1d41f0d8de8957')
|
||||
check('password', 'salt', 4096, 20,
|
||||
'4b007901b765489abead49d926f721d065a429c1')
|
||||
check('passwordPASSWORDpassword', 'saltSALTsaltSALTsaltSALTsaltSALTsalt',
|
||||
4096, 25, '3d2eec4fe41c849b80c8d83662c0e44a8b291a964cf2f07038')
|
||||
check('pass\x00word', 'sa\x00lt', 4096, 16,
|
||||
'56fa6aa75548099dcc37d7f03425e0c3')
|
||||
# This one is from the RFC but it just takes for ages
|
||||
##check('password', 'salt', 16777216, 20,
|
||||
## 'eefe3d61cd4da4e4e9945b3d6ba2158c2634e984')
|
||||
|
||||
# From Crypt-PBKDF2
|
||||
check('password', 'ATHENA.MIT.EDUraeburn', 1, 16,
|
||||
'cdedb5281bb2f801565a1122b2563515')
|
||||
check('password', 'ATHENA.MIT.EDUraeburn', 1, 32,
|
||||
'cdedb5281bb2f801565a1122b25635150ad1f7a04bb9f3a333ecc0e2e1f70837')
|
||||
check('password', 'ATHENA.MIT.EDUraeburn', 2, 16,
|
||||
'01dbee7f4a9e243e988b62c73cda935d')
|
||||
check('password', 'ATHENA.MIT.EDUraeburn', 2, 32,
|
||||
'01dbee7f4a9e243e988b62c73cda935da05378b93244ec8f48a99e61ad799d86')
|
||||
check('password', 'ATHENA.MIT.EDUraeburn', 1200, 32,
|
||||
'5c08eb61fdf71e4e4ec3cf6ba1f5512ba7e52ddbc5e5142f708a31e2e62b1e13')
|
||||
check('X' * 64, 'pass phrase equals block size', 1200, 32,
|
||||
'139c30c0966bc32ba55fdbf212530ac9c5ec59f1a452f5cc9ad940fea0598ed1')
|
||||
check('X' * 65, 'pass phrase exceeds block size', 1200, 32,
|
||||
'9ccad6d468770cd51b10e6a68721be611a8b4d282601db3b36be9246915ec82a')
|
||||
|
||||
raise SystemExit(bool(failed))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
test()
|
||||
@@ -103,11 +103,8 @@ def populate(table, n, default=True, compute=False):
|
||||
elif field.type=='list:integer' and hasattr(field.requires,'options'):
|
||||
options=field.requires.options(zero=False)
|
||||
if len(options) > 0:
|
||||
vals = []
|
||||
for i in range(0, random.randint(0,len(options)-1)/2):
|
||||
vals.append(options[random.randint(0,len(options)-1)][0])
|
||||
record[fieldname] = vals
|
||||
elif field.type =='integer':
|
||||
record[fieldname] = [item[0] for item in random.sample(options, random.randint(0,len(options)-1)/2)]
|
||||
elif field.type == 'integer':
|
||||
try:
|
||||
record[fieldname] = random.randint(field.requires.minimum,field.requires.maximum-1)
|
||||
except:
|
||||
@@ -143,19 +140,13 @@ def populate(table, n, default=True, compute=False):
|
||||
ids[tablename] = [x.id for x in table._db(table._db[field.type[15:]].id>0).select()]
|
||||
n = len(ids[tablename])
|
||||
if n:
|
||||
vals = []
|
||||
for i in range(0, random.randint(0,n-1)/2):
|
||||
vals.append(ids[tablename][random.randint(0,n-1)])
|
||||
record[fieldname] = vals
|
||||
record[fieldname] = [item[0] for item in random.sample(ids[tablename], random.randint(0,n-1)/2)]
|
||||
else:
|
||||
record[fieldname] = 0
|
||||
elif field.type=='list:string' and hasattr(field.requires,'options'):
|
||||
options=field.requires.options(zero=False)
|
||||
if len(options) > 0:
|
||||
vals = []
|
||||
for i in range(0, random.randint(0,len(options)-1)/2):
|
||||
vals.append(options[random.randint(0,len(options)-1)][0])
|
||||
record[fieldname] = vals
|
||||
record[fieldname] = [item[0] for item in random.sample(options, random.randint(0,len(options)-1)/2)]
|
||||
elif field.type=='string' and hasattr(field.requires,'options'):
|
||||
options=field.requires.options(zero=False)
|
||||
record[fieldname] = options[random.randint(0,len(options)-1)][0]
|
||||
|
||||
Executable
+37
@@ -0,0 +1,37 @@
|
||||
Changes
|
||||
--------
|
||||
0.4 -Miscellaneous bug fixes
|
||||
-Implementation of SSL support
|
||||
-Implementation of kill()
|
||||
-Cleaned up charset functionality
|
||||
-Fixed BIT type handling
|
||||
-Connections raise exceptions after they are close()'d
|
||||
-Full Py3k and unicode support
|
||||
|
||||
0.3 -Implemented most of the extended DBAPI 2.0 spec including callproc()
|
||||
-Fixed error handling to include the message from the server and support
|
||||
multiple protocol versions.
|
||||
-Implemented ping()
|
||||
-Implemented unicode support (probably needs better testing)
|
||||
-Removed DeprecationWarnings
|
||||
-Ran against the MySQLdb unit tests to check for bugs
|
||||
-Added support for client_flag, charset, sql_mode, read_default_file,
|
||||
use_unicode, cursorclass, init_command, and connect_timeout.
|
||||
-Refactoring for some more compatibility with MySQLdb including a fake
|
||||
pymysql.version_info attribute.
|
||||
-Now runs with no warnings with the -3 command-line switch
|
||||
-Added test cases for all outstanding tickets and closed most of them.
|
||||
-Basic Jython support added.
|
||||
-Fixed empty result sets bug.
|
||||
-Integrated new unit tests and refactored the example into one.
|
||||
-Fixed bug with decimal conversion.
|
||||
-Fixed string encoding bug. Now unicode and binary data work!
|
||||
-Added very basic docstrings.
|
||||
|
||||
0.2 -Changed connection parameter name 'password' to 'passwd'
|
||||
to make it more plugin replaceable for the other mysql clients.
|
||||
-Changed pack()/unpack() calls so it runs on 64 bit OSes too.
|
||||
-Added support for unix_socket.
|
||||
-Added support for no password.
|
||||
-Renamed decorders to decoders.
|
||||
-Better handling of non-existing decoder.
|
||||
Regular → Executable
+6
-2
@@ -7,8 +7,8 @@ PyMySQL Installation
|
||||
This package contains a pure-Python MySQL client library.
|
||||
Documentation on the MySQL client/server protocol can be found here:
|
||||
http://forge.mysql.com/wiki/MySQL_Internals_ClientServer_Protocol
|
||||
If you would like to run the test suite, create a ~/.my.cnf file and
|
||||
a database called "test_pymysql". The goal of pymysql is to be a drop-in
|
||||
If you would like to run the test suite, edit the config parameters in
|
||||
pymysql/tests/base.py. The goal of pymysql is to be a drop-in
|
||||
replacement for MySQLdb and work on CPython 2.3+, Jython, IronPython, PyPy
|
||||
and Python 3. We test for compatibility by simply changing the import
|
||||
statements in the Django MySQL backend and running its unit tests as well
|
||||
@@ -34,4 +34,8 @@ Installation
|
||||
# ... or ...
|
||||
# python setup.py install
|
||||
|
||||
Python 3.0 Support
|
||||
------------------
|
||||
|
||||
Simply run the build-py3k.sh script from the local directory. It will
|
||||
build a working package in the ./py3k directory.
|
||||
@@ -23,13 +23,13 @@ THE SOFTWARE.
|
||||
|
||||
'''
|
||||
|
||||
VERSION = (0, 4, None)
|
||||
VERSION = (0, 5, None)
|
||||
|
||||
from constants import FIELD_TYPE
|
||||
from converters import escape_dict, escape_sequence, escape_string
|
||||
from err import Warning, Error, InterfaceError, DataError, \
|
||||
DatabaseError, OperationalError, IntegrityError, InternalError, \
|
||||
NotSupportedError, ProgrammingError
|
||||
NotSupportedError, ProgrammingError, MySQLError
|
||||
from times import Date, Time, Timestamp, \
|
||||
DateFromTicks, TimeFromTicks, TimestampFromTicks
|
||||
|
||||
@@ -110,7 +110,7 @@ def thread_safe():
|
||||
def install_as_MySQLdb():
|
||||
"""
|
||||
After this function is called, any application that imports MySQLdb or
|
||||
_mysql will unwittingly actually use
|
||||
_mysql will unwittingly actually use
|
||||
"""
|
||||
sys.modules["MySQLdb"] = sys.modules["_mysql"] = sys.modules["pymysql"]
|
||||
|
||||
@@ -121,12 +121,11 @@ __all__ = [
|
||||
'InterfaceError', 'InternalError', 'MySQLError', 'NULL', 'NUMBER',
|
||||
'NotSupportedError', 'DBAPISet', 'OperationalError', 'ProgrammingError',
|
||||
'ROWID', 'STRING', 'TIME', 'TIMESTAMP', 'Warning', 'apilevel', 'connect',
|
||||
'connections', 'constants', 'converters', 'cursors', 'debug', 'escape',
|
||||
'connections', 'constants', 'converters', 'cursors',
|
||||
'escape_dict', 'escape_sequence', 'escape_string', 'get_client_info',
|
||||
'paramstyle', 'string_literal', 'threadsafety', 'version_info',
|
||||
'paramstyle', 'threadsafety', 'version_info',
|
||||
|
||||
"install_as_MySQLdb",
|
||||
|
||||
"NULL","__version__",
|
||||
]
|
||||
|
||||
|
||||
@@ -172,4 +172,3 @@ def charset_by_name(name):
|
||||
def charset_by_id(id):
|
||||
return _charsets.by_id(id)
|
||||
|
||||
|
||||
|
||||
@@ -25,6 +25,12 @@ try:
|
||||
except ImportError:
|
||||
import StringIO
|
||||
|
||||
try:
|
||||
import getpass
|
||||
DEFAULT_USER = getpass.getuser()
|
||||
except ImportError:
|
||||
DEFAULT_USER = None
|
||||
|
||||
from charset import MBLENGTH, charset_by_name, charset_by_id
|
||||
from cursors import Cursor
|
||||
from constants import FIELD_TYPE, FLAG
|
||||
@@ -50,22 +56,24 @@ UNSIGNED_INT24_LENGTH = 3
|
||||
UNSIGNED_INT64_LENGTH = 8
|
||||
|
||||
DEFAULT_CHARSET = 'latin1'
|
||||
MAX_PACKET_LENGTH = 256*256*256-1
|
||||
|
||||
|
||||
def dump_packet(data):
|
||||
|
||||
|
||||
def is_ascii(data):
|
||||
if byte2int(data) >= 65 and byte2int(data) <= 122: #data.isalnum():
|
||||
return data
|
||||
return '.'
|
||||
print "packet length %d" % len(data)
|
||||
print "method call[1]: %s" % sys._getframe(1).f_code.co_name
|
||||
print "method call[2]: %s" % sys._getframe(2).f_code.co_name
|
||||
print "method call[3]: %s" % sys._getframe(3).f_code.co_name
|
||||
print "method call[4]: %s" % sys._getframe(4).f_code.co_name
|
||||
print "method call[5]: %s" % sys._getframe(5).f_code.co_name
|
||||
print "-" * 88
|
||||
|
||||
try:
|
||||
print "packet length %d" % len(data)
|
||||
print "method call[1]: %s" % sys._getframe(1).f_code.co_name
|
||||
print "method call[2]: %s" % sys._getframe(2).f_code.co_name
|
||||
print "method call[3]: %s" % sys._getframe(3).f_code.co_name
|
||||
print "method call[4]: %s" % sys._getframe(4).f_code.co_name
|
||||
print "method call[5]: %s" % sys._getframe(5).f_code.co_name
|
||||
print "-" * 88
|
||||
except ValueError: pass
|
||||
dump_data = [data[i:i+16] for i in xrange(len(data)) if i%16 == 0]
|
||||
for d in dump_data:
|
||||
print ' '.join(map(lambda x:"%02X" % byte2int(x), d)) + \
|
||||
@@ -153,18 +161,28 @@ def unpack_uint16(n):
|
||||
# TODO: stop using bit-shifting in these functions...
|
||||
# TODO: rename to "uint" to make it clear they're unsigned...
|
||||
def unpack_int24(n):
|
||||
return struct.unpack('B',n[0])[0] + (struct.unpack('B', n[1])[0] << 8) +\
|
||||
(struct.unpack('B',n[2])[0] << 16)
|
||||
try:
|
||||
return struct.unpack('B',n[0])[0] + (struct.unpack('B', n[1])[0] << 8) +\
|
||||
(struct.unpack('B',n[2])[0] << 16)
|
||||
except TypeError:
|
||||
return n[0] + (n[1] << 8) + (n[2] << 16)
|
||||
|
||||
def unpack_int32(n):
|
||||
return struct.unpack('B',n[0])[0] + (struct.unpack('B', n[1])[0] << 8) +\
|
||||
(struct.unpack('B',n[2])[0] << 16) + (struct.unpack('B', n[3])[0] << 24)
|
||||
try:
|
||||
return struct.unpack('B',n[0])[0] + (struct.unpack('B', n[1])[0] << 8) +\
|
||||
(struct.unpack('B',n[2])[0] << 16) + (struct.unpack('B', n[3])[0] << 24)
|
||||
except TypeError:
|
||||
return n[0] + (n[1] << 8) + (n[2] << 16) + (n[3] << 24)
|
||||
|
||||
def unpack_int64(n):
|
||||
return struct.unpack('B',n[0])[0] + (struct.unpack('B', n[1])[0]<<8) +\
|
||||
(struct.unpack('B',n[2])[0] << 16) + (struct.unpack('B',n[3])[0]<<24)+\
|
||||
(struct.unpack('B',n[4])[0] << 32) + (struct.unpack('B',n[5])[0]<<40)+\
|
||||
(struct.unpack('B',n[6])[0] << 48) + (struct.unpack('B',n[7])[0]<<56)
|
||||
try:
|
||||
return struct.unpack('B',n[0])[0] + (struct.unpack('B', n[1])[0]<<8) +\
|
||||
(struct.unpack('B',n[2])[0] << 16) + (struct.unpack('B',n[3])[0]<<24)+\
|
||||
(struct.unpack('B',n[4])[0] << 32) + (struct.unpack('B',n[5])[0]<<40)+\
|
||||
(struct.unpack('B',n[6])[0] << 48) + (struct.unpack('B',n[7])[0]<<56)
|
||||
except TypeError:
|
||||
return n[0] + (n[1] << 8) + (n[2] << 16) + (n[3] << 24) +\
|
||||
(n[4] << 32) + (n[5] << 40) + (n[6] << 48) + (n[7] << 56)
|
||||
|
||||
def defaulterrorhandler(connection, cursor, errorclass, errorvalue):
|
||||
err = errorclass, errorvalue
|
||||
@@ -189,19 +207,16 @@ class MysqlPacket(object):
|
||||
from the network socket, removes packet header and provides an interface
|
||||
for reading/parsing the packet results."""
|
||||
|
||||
def __init__(self, socket):
|
||||
def __init__(self, connection):
|
||||
self.connection = connection
|
||||
self.__position = 0
|
||||
self.__recv_packet(socket)
|
||||
del socket
|
||||
self.__recv_packet()
|
||||
|
||||
def __recv_packet(self, socket):
|
||||
def __recv_packet(self):
|
||||
"""Parse the packet header and read entire packet payload into buffer."""
|
||||
packet_header = socket.recv(4)
|
||||
while len(packet_header) < 4:
|
||||
d = socket.recv(4 - len(packet_header))
|
||||
if len(d) == 0:
|
||||
raise OperationalError(2013, "Lost connection to MySQL server during query")
|
||||
packet_header += d
|
||||
packet_header = self.connection.rfile.read(4)
|
||||
if len(packet_header) < 4:
|
||||
raise OperationalError(2013, "Lost connection to MySQL server during query")
|
||||
|
||||
if DEBUG: dump_packet(packet_header)
|
||||
packet_length_bin = packet_header[:3]
|
||||
@@ -210,16 +225,11 @@ class MysqlPacket(object):
|
||||
|
||||
bin_length = packet_length_bin + int2byte(0) # pad little-endian number
|
||||
bytes_to_read = struct.unpack('<I', bin_length)[0]
|
||||
|
||||
payload_buff = [] # this is faster than cStringIO
|
||||
while bytes_to_read > 0:
|
||||
recv_data = socket.recv(bytes_to_read)
|
||||
if len(recv_data) == 0:
|
||||
raise OperationalError(2013, "Lost connection to MySQL server during query")
|
||||
if DEBUG: dump_packet(recv_data)
|
||||
payload_buff.append(recv_data)
|
||||
bytes_to_read -= len(recv_data)
|
||||
self.__data = join_bytes(payload_buff)
|
||||
recv_data = self.connection.rfile.read(bytes_to_read)
|
||||
if len(recv_data) < bytes_to_read:
|
||||
raise OperationalError(2013, "Lost connection to MySQL server during query")
|
||||
if DEBUG: dump_packet(recv_data)
|
||||
self.__data = recv_data
|
||||
|
||||
def packet_number(self): return self.__packet_number
|
||||
|
||||
@@ -354,7 +364,7 @@ class FieldDescriptorPacket(MysqlPacket):
|
||||
self.db = self.read_length_coded_string()
|
||||
self.table_name = self.read_length_coded_string()
|
||||
self.org_table = self.read_length_coded_string()
|
||||
self.name = self.read_length_coded_string()
|
||||
self.name = self.read_length_coded_string().decode(self.connection.charset)
|
||||
self.org_name = self.read_length_coded_string()
|
||||
self.advance(1) # non-null filler
|
||||
self.charsetnr = struct.unpack('<H', self.read(2))[0]
|
||||
@@ -396,6 +406,58 @@ class FieldDescriptorPacket(MysqlPacket):
|
||||
% (self.__class__, self.db, self.table_name, self.name,
|
||||
self.type_code))
|
||||
|
||||
class OKPacketWrapper(object):
|
||||
"""
|
||||
OK Packet Wrapper. It uses an existing packet object, and wraps
|
||||
around it, exposing useful variables while still providing access
|
||||
to the original packet objects variables and methods.
|
||||
"""
|
||||
|
||||
def __init__(self, from_packet):
|
||||
if not from_packet.is_ok_packet():
|
||||
raise ValueError('Cannot create ' + str(self.__class__.__name__)
|
||||
+ ' object from invalid packet type')
|
||||
|
||||
self.packet = from_packet
|
||||
self.packet.advance(1)
|
||||
|
||||
self.affected_rows = self.packet.read_length_coded_binary()
|
||||
self.insert_id = self.packet.read_length_coded_binary()
|
||||
self.server_status = struct.unpack('<H', self.packet.read(2))[0]
|
||||
self.warning_count = struct.unpack('<H', self.packet.read(2))[0]
|
||||
self.message = self.packet.read_all()
|
||||
|
||||
def __getattr__(self, key):
|
||||
if hasattr(self.packet, key):
|
||||
return getattr(self.packet, key)
|
||||
|
||||
raise AttributeError(str(self.__class__)
|
||||
+ " instance has no attribute '" + key + "'")
|
||||
|
||||
class EOFPacketWrapper(object):
|
||||
"""
|
||||
EOF Packet Wrapper. It uses an existing packet object, and wraps
|
||||
around it, exposing useful variables while still providing access
|
||||
to the original packet objects variables and methods.
|
||||
"""
|
||||
|
||||
def __init__(self, from_packet):
|
||||
if not from_packet.is_eof_packet():
|
||||
raise ValueError('Cannot create ' + str(self.__class__.__name__)
|
||||
+ ' object from invalid packet type')
|
||||
|
||||
self.packet = from_packet
|
||||
self.warning_count = self.packet.read(2)
|
||||
server_status = struct.unpack('<h', self.packet.read(2))[0]
|
||||
self.has_next = (server_status
|
||||
& SERVER_STATUS.SERVER_MORE_RESULTS_EXISTS)
|
||||
|
||||
def __getattr__(self, key):
|
||||
if hasattr(self.packet, key):
|
||||
return getattr(self.packet, key)
|
||||
|
||||
raise AttributeError(str(self.__class__)
|
||||
+ " instance has no attribute '" + key + "'")
|
||||
|
||||
class Connection(object):
|
||||
"""
|
||||
@@ -482,12 +544,12 @@ class Connection(object):
|
||||
host = _config("host", host)
|
||||
db = _config("db",db)
|
||||
unix_socket = _config("socket",unix_socket)
|
||||
port = _config("port", port)
|
||||
port = int(_config("port", port))
|
||||
charset = _config("default-character-set", charset)
|
||||
|
||||
self.host = host
|
||||
self.port = port
|
||||
self.user = user
|
||||
self.user = user or DEFAULT_USER
|
||||
self.password = passwd
|
||||
self.db = db
|
||||
self.unix_socket = unix_socket
|
||||
@@ -498,7 +560,7 @@ class Connection(object):
|
||||
self.charset = DEFAULT_CHARSET
|
||||
self.use_unicode = False
|
||||
|
||||
if use_unicode:
|
||||
if use_unicode is not None:
|
||||
self.use_unicode = use_unicode
|
||||
|
||||
client_flag |= CAPABILITIES
|
||||
@@ -512,14 +574,15 @@ class Connection(object):
|
||||
|
||||
self._connect()
|
||||
|
||||
self._result = None
|
||||
self._affected_rows = 0
|
||||
self.host_info = "Not connected"
|
||||
|
||||
self.messages = []
|
||||
self.set_charset(charset)
|
||||
self.encoders = encoders
|
||||
self.decoders = conv
|
||||
|
||||
self._affected_rows = 0
|
||||
self.host_info = "Not connected"
|
||||
|
||||
self.autocommit(False)
|
||||
|
||||
if sql_mode is not None:
|
||||
@@ -537,10 +600,16 @@ class Connection(object):
|
||||
|
||||
def close(self):
|
||||
''' Send the quit message and close the socket '''
|
||||
if self.socket is None:
|
||||
raise Error("Already closed")
|
||||
send_data = struct.pack('<i',1) + int2byte(COM_QUIT)
|
||||
self.socket.send(send_data)
|
||||
self.wfile.write(send_data)
|
||||
self.wfile.close()
|
||||
self.rfile.close()
|
||||
self.socket.close()
|
||||
self.socket = None
|
||||
self.rfile = None
|
||||
self.wfile = None
|
||||
|
||||
def autocommit(self, value):
|
||||
''' Set whether or not to commit after every execute() '''
|
||||
@@ -578,8 +647,10 @@ class Connection(object):
|
||||
''' Alias for escape() '''
|
||||
return escape_item(obj, self.charset)
|
||||
|
||||
def cursor(self):
|
||||
def cursor(self, cursor=None):
|
||||
''' Create a new cursor to execute queries with '''
|
||||
if cursor:
|
||||
return cursor(self)
|
||||
return self.cursorclass(self)
|
||||
|
||||
def __enter__(self):
|
||||
@@ -594,9 +665,11 @@ class Connection(object):
|
||||
self.commit()
|
||||
|
||||
# The following methods are INTERNAL USE ONLY (called from Cursor)
|
||||
def query(self, sql):
|
||||
def query(self, sql, unbuffered=False):
|
||||
if DEBUG:
|
||||
print "sending query: %s" % sql
|
||||
self._execute_command(COM_QUERY, sql)
|
||||
self._affected_rows = self._read_query_result()
|
||||
self._affected_rows = self._read_query_result(unbuffered=unbuffered)
|
||||
return self._affected_rows
|
||||
|
||||
def next_result(self):
|
||||
@@ -621,6 +694,8 @@ class Connection(object):
|
||||
''' Check if the server is alive '''
|
||||
try:
|
||||
self._execute_command(COM_PING, "")
|
||||
pkt = self.read_packet()
|
||||
return pkt.is_ok_packet()
|
||||
except:
|
||||
if reconnect:
|
||||
self._connect()
|
||||
@@ -630,9 +705,6 @@ class Connection(object):
|
||||
self.errorhandler(None, exc, value)
|
||||
return
|
||||
|
||||
pkt = self.read_packet()
|
||||
return pkt.is_ok_packet()
|
||||
|
||||
def set_charset(self, charset):
|
||||
try:
|
||||
if charset:
|
||||
@@ -663,64 +735,67 @@ class Connection(object):
|
||||
self.host_info = "socket %s:%d" % (self.host, self.port)
|
||||
if DEBUG: print 'connected using socket'
|
||||
self.socket = sock
|
||||
self.rfile = self.socket.makefile("rb")
|
||||
self.wfile = self.socket.makefile("wb")
|
||||
self._get_server_information()
|
||||
self._request_authentication()
|
||||
except socket.error, e:
|
||||
raise OperationalError(2003, "Can't connect to MySQL server on %r (%d)" % (self.host, e.args[0]))
|
||||
raise OperationalError(2003, "Can't connect to MySQL server on %r (%s)" % (self.host, e.args[0]))
|
||||
|
||||
def read_packet(self, packet_type=MysqlPacket):
|
||||
"""Read an entire "mysql packet" in its entirety from the network
|
||||
and return a MysqlPacket type that represents the results."""
|
||||
|
||||
# TODO: is socket.recv(small_number) significantly slower than
|
||||
# socket.recv(large_number)? if so, maybe we should buffer
|
||||
# the socket.recv() (though that obviously makes memory management
|
||||
# more complicated.
|
||||
packet = packet_type(self.socket)
|
||||
packet = packet_type(self)
|
||||
packet.check_error()
|
||||
return packet
|
||||
|
||||
def _read_query_result(self):
|
||||
result = MySQLResult(self)
|
||||
result.read()
|
||||
def _read_query_result(self, unbuffered=False):
|
||||
if unbuffered:
|
||||
try:
|
||||
result = MySQLResult(self)
|
||||
result.init_unbuffered_query()
|
||||
except:
|
||||
result.unbuffered_active = False
|
||||
raise
|
||||
else:
|
||||
result = MySQLResult(self)
|
||||
result.read()
|
||||
self._result = result
|
||||
return result.affected_rows
|
||||
|
||||
def insert_id(self):
|
||||
if self._result:
|
||||
return self._result.insert_id
|
||||
else:
|
||||
return 0
|
||||
|
||||
def _send_command(self, command, sql):
|
||||
#send_data = struct.pack('<i', len(sql) + 1) + command + sql
|
||||
# could probably be more efficient, at least it's correct
|
||||
if not self.socket:
|
||||
self.errorhandler(None, InterfaceError, "(0, '')")
|
||||
|
||||
# If the last query was unbuffered, make sure it finishes before
|
||||
# sending new commands
|
||||
if self._result is not None and self._result.unbuffered_active:
|
||||
self._result._finish_unbuffered_query()
|
||||
|
||||
if isinstance(sql, unicode):
|
||||
sql = sql.encode(self.charset)
|
||||
|
||||
buf = int2byte(command) + sql
|
||||
pckt_no = 0
|
||||
while len(buf) >= MAX_PACKET_LENGTH:
|
||||
header = struct.pack('<i', MAX_PACKET_LENGTH)[:-1]+int2byte(pckt_no)
|
||||
send_data = header + buf[:MAX_PACKET_LENGTH]
|
||||
self.socket.send(send_data)
|
||||
if DEBUG: dump_packet(send_data)
|
||||
buf = buf[MAX_PACKET_LENGTH:]
|
||||
pckt_no += 1
|
||||
header = struct.pack('<i', len(buf))[:-1]+int2byte(pckt_no)
|
||||
self.socket.send(header+buf)
|
||||
|
||||
|
||||
#sock = self.socket
|
||||
#sock.send(send_data)
|
||||
|
||||
#
|
||||
prelude = struct.pack('<i', len(sql)+1) + int2byte(command)
|
||||
self.wfile.write(prelude + sql)
|
||||
self.wfile.flush()
|
||||
if DEBUG: dump_packet(prelude + sql)
|
||||
|
||||
def _execute_command(self, command, sql):
|
||||
self._send_command(command, sql)
|
||||
|
||||
|
||||
def _request_authentication(self):
|
||||
self._send_authentication()
|
||||
|
||||
def _send_authentication(self):
|
||||
sock = self.socket
|
||||
self.client_flag |= CAPABILITIES
|
||||
if self.server_version.startswith('5'):
|
||||
self.client_flag |= MULTI_RESULTS
|
||||
@@ -742,12 +817,15 @@ class Connection(object):
|
||||
|
||||
if DEBUG: dump_packet(data)
|
||||
|
||||
sock.send(data)
|
||||
sock = self.socket = ssl.wrap_socket(sock, keyfile=self.key,
|
||||
certfile=self.cert,
|
||||
ssl_version=ssl.PROTOCOL_TLSv1,
|
||||
cert_reqs=ssl.CERT_REQUIRED,
|
||||
ca_certs=self.ca)
|
||||
self.wfile.write(data)
|
||||
self.wfile.flush()
|
||||
self.socket = ssl.wrap_self.socketet(self.socket, keyfile=self.key,
|
||||
certfile=self.cert,
|
||||
ssl_version=ssl.PROTOCOL_TLSv1,
|
||||
cert_reqs=ssl.CERT_REQUIRED,
|
||||
ca_certs=self.ca)
|
||||
self.rfile = self.socket.makefile("rb")
|
||||
self.wfile = self.socket.makefile("wb")
|
||||
|
||||
data = data_init + self.user+int2byte(0) + _scramble(self.password.encode(self.charset), self.salt)
|
||||
|
||||
@@ -760,9 +838,10 @@ class Connection(object):
|
||||
|
||||
if DEBUG: dump_packet(data)
|
||||
|
||||
sock.send(data)
|
||||
self.wfile.write(data)
|
||||
self.wfile.flush()
|
||||
|
||||
auth_packet = MysqlPacket(sock)
|
||||
auth_packet = MysqlPacket(self)
|
||||
auth_packet.check_error()
|
||||
if DEBUG: auth_packet.dump()
|
||||
|
||||
@@ -776,8 +855,9 @@ class Connection(object):
|
||||
data = _scramble_323(self.password.encode(self.charset), self.salt.encode(self.charset)) + int2byte(0)
|
||||
data = pack_int24(len(data)) + int2byte(next_packet) + data
|
||||
|
||||
sock.send(data)
|
||||
auth_packet = MysqlPacket(sock)
|
||||
self.wfile.write(data)
|
||||
self.wfile.flush()
|
||||
auth_packet = MysqlPacket(self)
|
||||
auth_packet.check_error()
|
||||
if DEBUG: auth_packet.dump()
|
||||
|
||||
@@ -796,9 +876,8 @@ class Connection(object):
|
||||
return self.protocol_version
|
||||
|
||||
def _get_server_information(self):
|
||||
sock = self.socket
|
||||
i = 0
|
||||
packet = MysqlPacket(sock)
|
||||
packet = MysqlPacket(self)
|
||||
data = packet.get_all_data()
|
||||
|
||||
if DEBUG: dump_packet(data)
|
||||
@@ -862,6 +941,11 @@ class MySQLResult(object):
|
||||
self.description = None
|
||||
self.rows = None
|
||||
self.has_next = None
|
||||
self.unbuffered_active = False
|
||||
|
||||
def __del__(self):
|
||||
if self.unbuffered_active:
|
||||
self._finish_unbuffered_query()
|
||||
|
||||
def read(self):
|
||||
self.first_packet = self.connection.read_packet()
|
||||
@@ -872,19 +956,78 @@ class MySQLResult(object):
|
||||
else:
|
||||
self._read_result_packet()
|
||||
|
||||
def init_unbuffered_query(self):
|
||||
self.unbuffered_active = True
|
||||
self.first_packet = self.connection.read_packet()
|
||||
|
||||
if self.first_packet.is_ok_packet():
|
||||
self._read_ok_packet()
|
||||
self.unbuffered_active = False
|
||||
else:
|
||||
self.field_count = byte2int(self.first_packet.read(1))
|
||||
self._get_descriptions()
|
||||
|
||||
# Apparently, MySQLdb picks this number because it's the maximum
|
||||
# value of a 64bit unsigned integer. Since we're emulating MySQLdb,
|
||||
# we set it to this instead of None, which would be preferred.
|
||||
self.affected_rows = 18446744073709551615
|
||||
|
||||
def _read_ok_packet(self):
|
||||
self.first_packet.advance(1) # field_count (always '0')
|
||||
self.affected_rows = self.first_packet.read_length_coded_binary()
|
||||
self.insert_id = self.first_packet.read_length_coded_binary()
|
||||
self.server_status = struct.unpack('<H', self.first_packet.read(2))[0]
|
||||
self.warning_count = struct.unpack('<H', self.first_packet.read(2))[0]
|
||||
self.message = self.first_packet.read_all()
|
||||
ok_packet = OKPacketWrapper(self.first_packet)
|
||||
self.affected_rows = ok_packet.affected_rows
|
||||
self.insert_id = ok_packet.insert_id
|
||||
self.server_status = ok_packet.server_status
|
||||
self.warning_count = ok_packet.warning_count
|
||||
self.message = ok_packet.message
|
||||
|
||||
def _check_packet_is_eof(self, packet):
|
||||
if packet.is_eof_packet():
|
||||
eof_packet = EOFPacketWrapper(packet)
|
||||
self.warning_count = eof_packet.warning_count
|
||||
self.has_next = eof_packet.has_next
|
||||
return True
|
||||
return False
|
||||
|
||||
def _read_result_packet(self):
|
||||
self.field_count = byte2int(self.first_packet.read(1))
|
||||
self._get_descriptions()
|
||||
self._read_rowdata_packet()
|
||||
|
||||
def _read_rowdata_packet_unbuffered(self):
|
||||
# Check if in an active query
|
||||
if self.unbuffered_active == False: return
|
||||
|
||||
# EOF
|
||||
packet = self.connection.read_packet()
|
||||
if self._check_packet_is_eof(packet):
|
||||
self.unbuffered_active = False
|
||||
self.rows = None
|
||||
return
|
||||
|
||||
row = []
|
||||
for field in self.fields:
|
||||
data = packet.read_length_coded_string()
|
||||
converted = None
|
||||
if field.type_code in self.connection.decoders:
|
||||
converter = self.connection.decoders[field.type_code]
|
||||
if DEBUG: print "DEBUG: field=%s, converter=%s" % (field, converter)
|
||||
if data != None:
|
||||
converted = converter(self.connection, field, data)
|
||||
row.append(converted)
|
||||
|
||||
self.affected_rows = 1
|
||||
self.rows = tuple((row))
|
||||
if DEBUG: self.rows
|
||||
|
||||
def _finish_unbuffered_query(self):
|
||||
# After much reading on the MySQL protocol, it appears that there is,
|
||||
# in fact, no way to stop MySQL from sending all the data after
|
||||
# executing a query, so we just spin, and wait for an EOF packet.
|
||||
while self.unbuffered_active:
|
||||
packet = self.connection.read_packet()
|
||||
if self._check_packet_is_eof(packet):
|
||||
self.unbuffered_active = False
|
||||
|
||||
# TODO: implement this as an iteratable so that it is more
|
||||
# memory efficient and lower-latency to client...
|
||||
def _read_rowdata_packet(self):
|
||||
@@ -892,24 +1035,18 @@ class MySQLResult(object):
|
||||
rows = []
|
||||
while True:
|
||||
packet = self.connection.read_packet()
|
||||
if packet.is_eof_packet():
|
||||
self.warning_count = packet.read(2)
|
||||
server_status = struct.unpack('<h', packet.read(2))[0]
|
||||
self.has_next = (server_status
|
||||
& SERVER_STATUS.SERVER_MORE_RESULTS_EXISTS)
|
||||
if self._check_packet_is_eof(packet):
|
||||
break
|
||||
|
||||
row = []
|
||||
for field in self.fields:
|
||||
data = packet.read_length_coded_string()
|
||||
converted = None
|
||||
if field.type_code in self.connection.decoders:
|
||||
converter = self.connection.decoders[field.type_code]
|
||||
|
||||
if DEBUG: print "DEBUG: field=%s, converter=%s" % (field, converter)
|
||||
data = packet.read_length_coded_string()
|
||||
converted = None
|
||||
if data != None:
|
||||
converted = converter(self.connection, field, data)
|
||||
|
||||
row.append(converted)
|
||||
|
||||
rows.append(tuple(row))
|
||||
@@ -930,4 +1067,3 @@ class MySQLResult(object):
|
||||
eof_packet = self.connection.read_packet()
|
||||
assert eof_packet.is_eof_packet(), 'Protocol error, expecting EOF'
|
||||
self.description = tuple(description)
|
||||
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
import re
|
||||
import datetime
|
||||
import time
|
||||
import sys
|
||||
|
||||
from constants import FIELD_TYPE, FLAG
|
||||
from charset import charset_by_id
|
||||
|
||||
PYTHON3 = sys.version_info[0] > 2
|
||||
|
||||
try:
|
||||
set
|
||||
except NameError:
|
||||
@@ -22,12 +25,12 @@ def escape_item(val, charset):
|
||||
return escape_sequence(val, charset)
|
||||
if type(val) is dict:
|
||||
return escape_dict(val, charset)
|
||||
if hasattr(val, "decode") and not isinstance(val, unicode):
|
||||
if PYTHON3 and hasattr(val, "decode") and not isinstance(val, unicode):
|
||||
# deal with py3k bytes
|
||||
val = val.decode(charset)
|
||||
encoder = encoders[type(val)]
|
||||
val = encoder(val)
|
||||
if type(val) is str:
|
||||
if type(val) in [str, int]:
|
||||
return val
|
||||
val = val.encode(charset)
|
||||
return val
|
||||
@@ -44,7 +47,7 @@ def escape_sequence(val, charset):
|
||||
for item in val:
|
||||
quoted = escape_item(item, charset)
|
||||
n.append(quoted)
|
||||
return tuple(n)
|
||||
return "(" + ",".join(n) + ")"
|
||||
|
||||
def escape_set(val, charset):
|
||||
val = map(lambda x: escape_item(x, charset), val)
|
||||
@@ -56,7 +59,10 @@ def escape_bool(value):
|
||||
def escape_object(value):
|
||||
return str(value)
|
||||
|
||||
escape_int = escape_long = escape_object
|
||||
def escape_int(value):
|
||||
return value
|
||||
|
||||
escape_long = escape_object
|
||||
|
||||
def escape_float(value):
|
||||
return ('%.15g' % value)
|
||||
@@ -142,16 +148,19 @@ def convert_timedelta(connection, field, obj):
|
||||
can accept values as (+|-)DD HH:MM:SS. The latter format will not
|
||||
be parsed correctly by this function.
|
||||
"""
|
||||
from math import modf
|
||||
try:
|
||||
microseconds = 0
|
||||
if not isinstance(obj, unicode):
|
||||
obj = obj.decode(connection.charset)
|
||||
hours, minutes, seconds = tuple([int(x) for x in obj.split(':')])
|
||||
if "." in obj:
|
||||
(obj, tail) = obj.split('.')
|
||||
microseconds = int(tail)
|
||||
hours, minutes, seconds = obj.split(':')
|
||||
tdelta = datetime.timedelta(
|
||||
hours = int(hours),
|
||||
minutes = int(minutes),
|
||||
seconds = int(seconds),
|
||||
microseconds = int(modf(float(seconds))[0]*1000000),
|
||||
microseconds = microseconds
|
||||
)
|
||||
return tdelta
|
||||
except ValueError:
|
||||
@@ -179,12 +188,14 @@ def convert_time(connection, field, obj):
|
||||
to be treated as time-of-day and not a time offset, then you can
|
||||
use set this function as the converter for FIELD_TYPE.TIME.
|
||||
"""
|
||||
from math import modf
|
||||
try:
|
||||
hour, minute, second = obj.split(':')
|
||||
return datetime.time(hour=int(hour), minute=int(minute),
|
||||
second=int(second),
|
||||
microsecond=int(modf(float(second))[0]*1000000))
|
||||
microseconds = 0
|
||||
if "." in obj:
|
||||
(obj, tail) = obj.split('.')
|
||||
microseconds = int(tail)
|
||||
hours, minutes, seconds = obj.split(':')
|
||||
return datetime.time(hour=int(hours), minute=int(minutes),
|
||||
second=int(seconds), microsecond=microseconds)
|
||||
except ValueError:
|
||||
return None
|
||||
|
||||
@@ -267,8 +278,6 @@ def convert_characters(connection, field, data):
|
||||
elif connection.charset != field_charset:
|
||||
data = data.decode(field_charset)
|
||||
data = data.encode(connection.charset)
|
||||
else:
|
||||
data = data.decode(connection.charset)
|
||||
return data
|
||||
|
||||
def convert_int(connection, field, data):
|
||||
@@ -334,6 +343,7 @@ try:
|
||||
# python version > 2.3
|
||||
from decimal import Decimal
|
||||
def convert_decimal(connection, field, data):
|
||||
data = data.decode(connection.charset)
|
||||
return Decimal(data)
|
||||
decoders[FIELD_TYPE.DECIMAL] = convert_decimal
|
||||
decoders[FIELD_TYPE.NEWDECIMAL] = convert_decimal
|
||||
@@ -344,4 +354,3 @@ try:
|
||||
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
|
||||
@@ -92,12 +92,21 @@ class Cursor(object):
|
||||
|
||||
# TODO: make sure that conn.escape is correct
|
||||
|
||||
if args is not None:
|
||||
query = query % conn.escape(args)
|
||||
|
||||
if isinstance(query, unicode):
|
||||
query = query.encode(charset)
|
||||
|
||||
if args is not None:
|
||||
if isinstance(args, tuple) or isinstance(args, list):
|
||||
escaped_args = tuple(conn.escape(arg) for arg in args)
|
||||
elif isinstance(args, dict):
|
||||
escaped_args = dict((key, conn.escape(val)) for (key, val) in args.items())
|
||||
else:
|
||||
#If it's not a dictionary let's try escaping it anyways.
|
||||
#Worst case it will throw a Value error
|
||||
escaped_args = conn.escape(args)
|
||||
|
||||
query = query % escaped_args
|
||||
|
||||
result = 0
|
||||
try:
|
||||
result = self._query(query)
|
||||
@@ -113,12 +122,12 @@ class Cursor(object):
|
||||
def executemany(self, query, args):
|
||||
''' Run several data against one query '''
|
||||
del self.messages[:]
|
||||
conn = self._get_db()
|
||||
#conn = self._get_db()
|
||||
if not args:
|
||||
return
|
||||
charset = conn.charset
|
||||
if isinstance(query, unicode):
|
||||
query = query.encode(charset)
|
||||
#charset = conn.charset
|
||||
#if isinstance(query, unicode):
|
||||
# query = query.encode(charset)
|
||||
|
||||
self.rowcount = sum([ self.execute(query, arg) for arg in args ])
|
||||
return self.rowcount
|
||||
@@ -231,12 +240,9 @@ class Cursor(object):
|
||||
self.lastrowid = conn._result.insert_id
|
||||
self._rows = conn._result.rows
|
||||
self._has_next = conn._result.has_next
|
||||
conn._result = None
|
||||
|
||||
def __iter__(self):
|
||||
self._check_executed()
|
||||
result = self.rownumber and self._rows[self.rownumber:] or self._rows
|
||||
return iter(result)
|
||||
return iter(self.fetchone, None)
|
||||
|
||||
Warning = Warning
|
||||
Error = Error
|
||||
@@ -249,3 +255,156 @@ class Cursor(object):
|
||||
ProgrammingError = ProgrammingError
|
||||
NotSupportedError = NotSupportedError
|
||||
|
||||
class DictCursor(Cursor):
|
||||
"""A cursor which returns results as a dictionary"""
|
||||
|
||||
def execute(self, query, args=None):
|
||||
result = super(DictCursor, self).execute(query, args)
|
||||
if self.description:
|
||||
self._fields = [ field[0] for field in self.description ]
|
||||
return result
|
||||
|
||||
def fetchone(self):
|
||||
''' Fetch the next row '''
|
||||
self._check_executed()
|
||||
if self._rows is None or self.rownumber >= len(self._rows):
|
||||
return None
|
||||
result = dict(zip(self._fields, self._rows[self.rownumber]))
|
||||
self.rownumber += 1
|
||||
return result
|
||||
|
||||
def fetchmany(self, size=None):
|
||||
''' Fetch several rows '''
|
||||
self._check_executed()
|
||||
if self._rows is None:
|
||||
return None
|
||||
end = self.rownumber + (size or self.arraysize)
|
||||
result = [ dict(zip(self._fields, r)) for r in self._rows[self.rownumber:end] ]
|
||||
self.rownumber = min(end, len(self._rows))
|
||||
return tuple(result)
|
||||
|
||||
def fetchall(self):
|
||||
''' Fetch all the rows '''
|
||||
self._check_executed()
|
||||
if self._rows is None:
|
||||
return None
|
||||
if self.rownumber:
|
||||
result = [ dict(zip(self._fields, r)) for r in self._rows[self.rownumber:] ]
|
||||
else:
|
||||
result = [ dict(zip(self._fields, r)) for r in self._rows ]
|
||||
self.rownumber = len(self._rows)
|
||||
return tuple(result)
|
||||
|
||||
class SSCursor(Cursor):
|
||||
"""
|
||||
Unbuffered Cursor, mainly useful for queries that return a lot of data,
|
||||
or for connections to remote servers over a slow network.
|
||||
|
||||
Instead of copying every row of data into a buffer, this will fetch
|
||||
rows as needed. The upside of this, is the client uses much less memory,
|
||||
and rows are returned much faster when traveling over a slow network,
|
||||
or if the result set is very big.
|
||||
|
||||
There are limitations, though. The MySQL protocol doesn't support
|
||||
returning the total number of rows, so the only way to tell how many rows
|
||||
there are is to iterate over every row returned. Also, it currently isn't
|
||||
possible to scroll backwards, as only the current row is held in memory.
|
||||
"""
|
||||
|
||||
def close(self):
|
||||
conn = self._get_db()
|
||||
conn._result._finish_unbuffered_query()
|
||||
|
||||
try:
|
||||
if self._has_next:
|
||||
while self.nextset(): pass
|
||||
except: pass
|
||||
|
||||
def _query(self, q):
|
||||
conn = self._get_db()
|
||||
self._last_executed = q
|
||||
conn.query(q, unbuffered=True)
|
||||
self._do_get_result()
|
||||
return self.rowcount
|
||||
|
||||
def read_next(self):
|
||||
""" Read next row """
|
||||
|
||||
conn = self._get_db()
|
||||
conn._result._read_rowdata_packet_unbuffered()
|
||||
return conn._result.rows
|
||||
|
||||
def fetchone(self):
|
||||
""" Fetch next row """
|
||||
|
||||
self._check_executed()
|
||||
row = self.read_next()
|
||||
if row is None:
|
||||
return None
|
||||
self.rownumber += 1
|
||||
return row
|
||||
|
||||
def fetchall(self):
|
||||
"""
|
||||
Fetch all, as per MySQLdb. Pretty useless for large queries, as
|
||||
it is buffered. See fetchall_unbuffered(), if you want an unbuffered
|
||||
generator version of this method.
|
||||
"""
|
||||
|
||||
rows = []
|
||||
while True:
|
||||
row = self.fetchone()
|
||||
if row is None:
|
||||
break
|
||||
rows.append(row)
|
||||
return tuple(rows)
|
||||
|
||||
def fetchall_unbuffered(self):
|
||||
"""
|
||||
Fetch all, implemented as a generator, which isn't to standard,
|
||||
however, it doesn't make sense to return everything in a list, as that
|
||||
would use ridiculous memory for large result sets.
|
||||
"""
|
||||
|
||||
row = self.fetchone()
|
||||
while row is not None:
|
||||
yield row
|
||||
row = self.fetchone()
|
||||
|
||||
def fetchmany(self, size=None):
|
||||
""" Fetch many """
|
||||
|
||||
self._check_executed()
|
||||
if size is None:
|
||||
size = self.arraysize
|
||||
|
||||
rows = []
|
||||
for i in range(0, size):
|
||||
row = self.read_next()
|
||||
if row is None:
|
||||
break
|
||||
rows.append(row)
|
||||
self.rownumber += 1
|
||||
return tuple(rows)
|
||||
|
||||
def scroll(self, value, mode='relative'):
|
||||
self._check_executed()
|
||||
if not mode == 'relative' and not mode == 'absolute':
|
||||
self.errorhandler(self, ProgrammingError,
|
||||
"unknown scroll mode %s" % mode)
|
||||
|
||||
if mode == 'relative':
|
||||
if value < 0:
|
||||
self.errorhandler(self, NotSupportedError,
|
||||
"Backwards scrolling not supported by this cursor")
|
||||
|
||||
for i in range(0, value): self.read_next()
|
||||
self.rownumber += value
|
||||
else:
|
||||
if value < self.rownumber:
|
||||
self.errorhandler(self, NotSupportedError,
|
||||
"Backwards scrolling not supported by this cursor")
|
||||
|
||||
end = value - self.rownumber
|
||||
for i in range(0, end): self.read_next()
|
||||
self.rownumber = value
|
||||
|
||||
@@ -2,20 +2,21 @@ import struct
|
||||
|
||||
|
||||
try:
|
||||
Exception, Warning
|
||||
StandardError, Warning
|
||||
except ImportError:
|
||||
try:
|
||||
from exceptions import Exception, Warning
|
||||
from exceptions import StandardError, Warning
|
||||
except ImportError:
|
||||
import sys
|
||||
e = sys.modules['exceptions']
|
||||
Exception = e.Exception
|
||||
StandardError = e.StandardError
|
||||
Warning = e.Warning
|
||||
|
||||
|
||||
from constants import ER
|
||||
import sys
|
||||
|
||||
class MySQLError(Exception):
|
||||
|
||||
class MySQLError(StandardError):
|
||||
|
||||
"""Exception related to operation with MySQL."""
|
||||
|
||||
|
||||
@@ -106,13 +107,19 @@ _map_error(IntegrityError, ER.DUP_ENTRY, ER.NO_REFERENCED_ROW,
|
||||
ER.CANNOT_ADD_FOREIGN)
|
||||
_map_error(NotSupportedError, ER.WARNING_NOT_COMPLETE_ROLLBACK,
|
||||
ER.NOT_SUPPORTED_YET, ER.FEATURE_DISABLED, ER.UNKNOWN_STORAGE_ENGINE)
|
||||
_map_error(OperationalError, ER.DBACCESS_DENIED_ERROR, ER.ACCESS_DENIED_ERROR,
|
||||
ER.TABLEACCESS_DENIED_ERROR, ER.COLUMNACCESS_DENIED_ERROR)
|
||||
|
||||
del _map_error, ER
|
||||
|
||||
|
||||
|
||||
def _get_error_info(data):
|
||||
errno = struct.unpack('<h', data[1:3])[0]
|
||||
if data[3] == "#":
|
||||
if sys.version_info[0] == 3:
|
||||
is_41 = data[3] == ord("#")
|
||||
else:
|
||||
is_41 = data[3] == "#"
|
||||
if is_41:
|
||||
# version 4.1
|
||||
sqlstate = data[4:9].decode("utf8")
|
||||
errorvalue = data[9:].decode("utf8")
|
||||
@@ -122,7 +129,7 @@ def _get_error_info(data):
|
||||
return (errno, None, data[3:].decode("utf8"))
|
||||
|
||||
def _check_mysql_exception(errinfo):
|
||||
errno, sqlstate, errorvalue = errinfo
|
||||
errno, sqlstate, errorvalue = errinfo
|
||||
errorclass = error_map.get(errno, None)
|
||||
if errorclass:
|
||||
raise errorclass, (errno,errorvalue)
|
||||
@@ -133,8 +140,7 @@ def _check_mysql_exception(errinfo):
|
||||
def raise_mysql_exception(data):
|
||||
errinfo = _get_error_info(data)
|
||||
_check_mysql_exception(errinfo)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,12 @@
|
||||
from gluon.contrib.pymysql.tests.test_issues import *
|
||||
from gluon.contrib.pymysql.tests.test_example import *
|
||||
from gluon.contrib.pymysql.tests.test_basic import *
|
||||
from pymysql.tests.test_issues import *
|
||||
from pymysql.tests.test_example import *
|
||||
from pymysql.tests.test_basic import *
|
||||
from pymysql.tests.test_DictCursor import *
|
||||
|
||||
import sys
|
||||
if sys.version_info[0] == 2:
|
||||
# MySQLdb tests were designed for Python 3
|
||||
from pymysql.tests.thirdparty import *
|
||||
|
||||
if __name__ == "__main__":
|
||||
import unittest
|
||||
|
||||
@@ -1,20 +1,18 @@
|
||||
from gluon.contrib import pymysql
|
||||
import pymysql
|
||||
import unittest
|
||||
|
||||
class PyMySQLTestCase(unittest.TestCase):
|
||||
# Edit this to suit your test environment.
|
||||
databases = [
|
||||
{"host":"localhost","user":"root",
|
||||
"passwd":"","db":"test_pymysql", "use_unicode": True},
|
||||
{"host":"localhost","user":"root","passwd":"","db":"test_pymysql2"}]
|
||||
|
||||
def setUp(self):
|
||||
try:
|
||||
self.connections = []
|
||||
self.connections = []
|
||||
|
||||
for params in self.databases:
|
||||
self.connections.append(pymysql.connect(**params))
|
||||
except pymysql.err.OperationalError as e:
|
||||
self.skipTest('Cannot connect to MySQL - skipping pymysql tests because of (%s) %s' % (type(e), e))
|
||||
for params in self.databases:
|
||||
self.connections.append(pymysql.connect(**params))
|
||||
|
||||
def tearDown(self):
|
||||
for connection in self.connections:
|
||||
|
||||
+56
@@ -0,0 +1,56 @@
|
||||
from pymysql.tests import base
|
||||
import pymysql.cursors
|
||||
|
||||
import datetime
|
||||
|
||||
class TestDictCursor(base.PyMySQLTestCase):
|
||||
|
||||
def test_DictCursor(self):
|
||||
#all assert test compare to the structure as would come out from MySQLdb
|
||||
conn = self.connections[0]
|
||||
c = conn.cursor(pymysql.cursors.DictCursor)
|
||||
# create a table ane some data to query
|
||||
c.execute("""CREATE TABLE dictcursor (name char(20), age int , DOB datetime)""")
|
||||
data = (("bob",21,"1990-02-06 23:04:56"),
|
||||
("jim",56,"1955-05-09 13:12:45"),
|
||||
("fred",100,"1911-09-12 01:01:01"))
|
||||
bob = {'name':'bob','age':21,'DOB':datetime.datetime(1990, 02, 6, 23, 04, 56)}
|
||||
jim = {'name':'jim','age':56,'DOB':datetime.datetime(1955, 05, 9, 13, 12, 45)}
|
||||
fred = {'name':'fred','age':100,'DOB':datetime.datetime(1911, 9, 12, 1, 1, 1)}
|
||||
try:
|
||||
c.executemany("insert into dictcursor values (%s,%s,%s)", data)
|
||||
# try an update which should return no rows
|
||||
c.execute("update dictcursor set age=20 where name='bob'")
|
||||
bob['age'] = 20
|
||||
# pull back the single row dict for bob and check
|
||||
c.execute("SELECT * from dictcursor where name='bob'")
|
||||
r = c.fetchone()
|
||||
self.assertEqual(bob,r,"fetchone via DictCursor failed")
|
||||
# same again, but via fetchall => tuple)
|
||||
c.execute("SELECT * from dictcursor where name='bob'")
|
||||
r = c.fetchall()
|
||||
self.assertEqual((bob,),r,"fetch a 1 row result via fetchall failed via DictCursor")
|
||||
# same test again but iterate over the
|
||||
c.execute("SELECT * from dictcursor where name='bob'")
|
||||
for r in c:
|
||||
self.assertEqual(bob, r,"fetch a 1 row result via iteration failed via DictCursor")
|
||||
# get all 3 row via fetchall
|
||||
c.execute("SELECT * from dictcursor")
|
||||
r = c.fetchall()
|
||||
self.assertEqual((bob,jim,fred), r, "fetchall failed via DictCursor")
|
||||
#same test again but do a list comprehension
|
||||
c.execute("SELECT * from dictcursor")
|
||||
r = [x for x in c]
|
||||
self.assertEqual([bob,jim,fred], r, "list comprehension failed via DictCursor")
|
||||
# get all 2 row via fetchmany
|
||||
c.execute("SELECT * from dictcursor")
|
||||
r = c.fetchmany(2)
|
||||
self.assertEqual((bob,jim), r, "fetchmany failed via DictCursor")
|
||||
finally:
|
||||
c.execute("drop table dictcursor")
|
||||
|
||||
__all__ = ["TestDictCursor"]
|
||||
|
||||
if __name__ == "__main__":
|
||||
import unittest
|
||||
unittest.main()
|
||||
Executable
+100
@@ -0,0 +1,100 @@
|
||||
import sys
|
||||
|
||||
try:
|
||||
from pymysql.tests import base
|
||||
import pymysql.cursors
|
||||
except:
|
||||
# For local testing from top-level directory, without installing
|
||||
sys.path.append('../pymysql')
|
||||
from pymysql.tests import base
|
||||
import pymysql.cursors
|
||||
|
||||
class TestSSCursor(base.PyMySQLTestCase):
|
||||
def test_SSCursor(self):
|
||||
affected_rows = 18446744073709551615
|
||||
|
||||
conn = self.connections[0]
|
||||
data = [
|
||||
('America', '', 'America/Jamaica'),
|
||||
('America', '', 'America/Los_Angeles'),
|
||||
('America', '', 'America/Lima'),
|
||||
('America', '', 'America/New_York'),
|
||||
('America', '', 'America/Menominee'),
|
||||
('America', '', 'America/Havana'),
|
||||
('America', '', 'America/El_Salvador'),
|
||||
('America', '', 'America/Costa_Rica'),
|
||||
('America', '', 'America/Denver'),
|
||||
('America', '', 'America/Detroit'),]
|
||||
|
||||
try:
|
||||
cursor = conn.cursor(pymysql.cursors.SSCursor)
|
||||
|
||||
# Create table
|
||||
cursor.execute(('CREATE TABLE tz_data ('
|
||||
'region VARCHAR(64),'
|
||||
'zone VARCHAR(64),'
|
||||
'name VARCHAR(64))'))
|
||||
|
||||
# Test INSERT
|
||||
for i in data:
|
||||
cursor.execute('INSERT INTO tz_data VALUES (%s, %s, %s)', i)
|
||||
self.assertEqual(conn.affected_rows(), 1, 'affected_rows does not match')
|
||||
conn.commit()
|
||||
|
||||
# Test fetchone()
|
||||
iter = 0
|
||||
cursor.execute('SELECT * FROM tz_data')
|
||||
while True:
|
||||
row = cursor.fetchone()
|
||||
if row is None:
|
||||
break
|
||||
iter += 1
|
||||
|
||||
# Test cursor.rowcount
|
||||
self.assertEqual(cursor.rowcount, affected_rows,
|
||||
'cursor.rowcount != %s' % (str(affected_rows)))
|
||||
|
||||
# Test cursor.rownumber
|
||||
self.assertEqual(cursor.rownumber, iter,
|
||||
'cursor.rowcount != %s' % (str(iter)))
|
||||
|
||||
# Test row came out the same as it went in
|
||||
self.assertEqual((row in data), True,
|
||||
'Row not found in source data')
|
||||
|
||||
# Test fetchall
|
||||
cursor.execute('SELECT * FROM tz_data')
|
||||
self.assertEqual(len(cursor.fetchall()), len(data),
|
||||
'fetchall failed. Number of rows does not match')
|
||||
|
||||
# Test fetchmany
|
||||
cursor.execute('SELECT * FROM tz_data')
|
||||
self.assertEqual(len(cursor.fetchmany(2)), 2,
|
||||
'fetchmany failed. Number of rows does not match')
|
||||
|
||||
# So MySQLdb won't throw "Commands out of sync"
|
||||
while True:
|
||||
res = cursor.fetchone()
|
||||
if res is None:
|
||||
break
|
||||
|
||||
# Test update, affected_rows()
|
||||
cursor.execute('UPDATE tz_data SET zone = %s', ['Foo'])
|
||||
conn.commit()
|
||||
self.assertEqual(cursor.rowcount, len(data),
|
||||
'Update failed. affected_rows != %s' % (str(len(data))))
|
||||
|
||||
# Test executemany
|
||||
cursor.executemany('INSERT INTO tz_data VALUES (%s, %s, %s)', data)
|
||||
self.assertEqual(cursor.rowcount, len(data),
|
||||
'executemany failed. cursor.rowcount != %s' % (str(len(data))))
|
||||
|
||||
finally:
|
||||
cursor.execute('DROP TABLE tz_data')
|
||||
cursor.close()
|
||||
|
||||
__all__ = ["TestSSCursor"]
|
||||
|
||||
if __name__ == "__main__":
|
||||
import unittest
|
||||
unittest.main()
|
||||
@@ -1,5 +1,5 @@
|
||||
from gluon.contrib.pymysql.tests import base
|
||||
from gluon.contrib.pymysql import util
|
||||
from pymysql.tests import base
|
||||
from pymysql import util
|
||||
|
||||
import time
|
||||
import datetime
|
||||
@@ -55,6 +55,31 @@ class TestConversion(base.PyMySQLTestCase):
|
||||
finally:
|
||||
c.execute("drop table test_dict")
|
||||
|
||||
def test_string(self):
|
||||
conn = self.connections[0]
|
||||
c = conn.cursor()
|
||||
c.execute("create table test_dict (a text)")
|
||||
test_value = "I am a test string"
|
||||
try:
|
||||
c.execute("insert into test_dict (a) values (%s)", test_value)
|
||||
c.execute("select a from test_dict")
|
||||
self.assertEqual((test_value,), c.fetchone())
|
||||
finally:
|
||||
c.execute("drop table test_dict")
|
||||
|
||||
def test_integer(self):
|
||||
conn = self.connections[0]
|
||||
c = conn.cursor()
|
||||
c.execute("create table test_dict (a integer)")
|
||||
test_value = 12345
|
||||
try:
|
||||
c.execute("insert into test_dict (a) values (%s)", test_value)
|
||||
c.execute("select a from test_dict")
|
||||
self.assertEqual((test_value,), c.fetchone())
|
||||
finally:
|
||||
c.execute("drop table test_dict")
|
||||
|
||||
|
||||
def test_big_blob(self):
|
||||
""" test tons of data """
|
||||
conn = self.connections[0]
|
||||
@@ -67,6 +92,26 @@ class TestConversion(base.PyMySQLTestCase):
|
||||
self.assertEqual(data.encode(conn.charset), c.fetchone()[0])
|
||||
finally:
|
||||
c.execute("drop table test_big_blob")
|
||||
|
||||
def test_untyped(self):
|
||||
""" test conversion of null, empty string """
|
||||
conn = self.connections[0]
|
||||
c = conn.cursor()
|
||||
c.execute("select null,''")
|
||||
self.assertEqual((None,u''), c.fetchone())
|
||||
c.execute("select '',null")
|
||||
self.assertEqual((u'',None), c.fetchone())
|
||||
|
||||
def test_datetime(self):
|
||||
""" test conversion of null, empty string """
|
||||
conn = self.connections[0]
|
||||
c = conn.cursor()
|
||||
c.execute("select time('12:30'), time('23:12:59'), time('23:12:59.05100')")
|
||||
self.assertEqual((datetime.timedelta(0, 45000),
|
||||
datetime.timedelta(0, 83579),
|
||||
datetime.timedelta(0, 83579, 51000)),
|
||||
c.fetchone())
|
||||
|
||||
|
||||
class TestCursor(base.PyMySQLTestCase):
|
||||
# this test case does not work quite right yet, however,
|
||||
@@ -134,6 +179,33 @@ class TestCursor(base.PyMySQLTestCase):
|
||||
finally:
|
||||
c.execute("drop table test_nr")
|
||||
|
||||
def test_aggregates(self):
|
||||
""" test aggregate functions """
|
||||
conn = self.connections[0]
|
||||
c = conn.cursor()
|
||||
try:
|
||||
c.execute('create table test_aggregates (i integer)')
|
||||
for i in xrange(0, 10):
|
||||
c.execute('insert into test_aggregates (i) values (%s)', (i,))
|
||||
c.execute('select sum(i) from test_aggregates')
|
||||
r, = c.fetchone()
|
||||
self.assertEqual(sum(range(0,10)), r)
|
||||
finally:
|
||||
c.execute('drop table test_aggregates')
|
||||
|
||||
def test_single_tuple(self):
|
||||
""" test a single tuple """
|
||||
conn = self.connections[0]
|
||||
c = conn.cursor()
|
||||
try:
|
||||
c.execute("create table mystuff (id integer primary key)")
|
||||
c.execute("insert into mystuff (id) values (1)")
|
||||
c.execute("insert into mystuff (id) values (2)")
|
||||
c.execute("select id from mystuff where id in %s", ((1,),))
|
||||
self.assertEqual([(1,)], list(c.fetchall()))
|
||||
finally:
|
||||
c.execute("drop table mystuff")
|
||||
|
||||
__all__ = ["TestConversion","TestCursor"]
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
from gluon.contrib import pymysql
|
||||
from gluon.contrib.pymysql.tests import base
|
||||
import pymysql
|
||||
from pymysql.tests import base
|
||||
|
||||
class TestExample(base.PyMySQLTestCase):
|
||||
def test_example(self):
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
from gluon.contrib import pymysql
|
||||
from gluon.contrib.pymysql.tests import base
|
||||
import pymysql
|
||||
from pymysql.tests import base
|
||||
import unittest
|
||||
|
||||
import sys
|
||||
|
||||
@@ -11,6 +12,10 @@ except AttributeError:
|
||||
|
||||
import datetime
|
||||
|
||||
# backwards compatibility:
|
||||
if not hasattr(unittest, "skip"):
|
||||
unittest.skip = lambda message: lambda f: f
|
||||
|
||||
class TestOldIssues(base.PyMySQLTestCase):
|
||||
def test_issue_3(self):
|
||||
""" undefined methods datetime_or_None, date_or_None """
|
||||
@@ -89,15 +94,15 @@ KEY (`station`,`dh`,`echeance`)) ENGINE=MyISAM DEFAULT CHARSET=latin1;""")
|
||||
""" can't handle large result fields """
|
||||
conn = self.connections[0]
|
||||
cur = conn.cursor()
|
||||
cur.execute("create table issue13 (t text)")
|
||||
try:
|
||||
cur.execute("create table issue13 (t text)")
|
||||
# ticket says 18k
|
||||
size = 18*1024
|
||||
cur.execute("insert into issue13 (t) values (%s)", ("x" * size,))
|
||||
cur.execute("select t from issue13")
|
||||
# use assert_ so that obscenely huge error messages don't print
|
||||
# use assertTrue so that obscenely huge error messages don't print
|
||||
r = cur.fetchone()[0]
|
||||
self.assert_("x" * size == r)
|
||||
self.assertTrue("x" * size == r)
|
||||
finally:
|
||||
cur.execute("drop table issue13")
|
||||
|
||||
@@ -115,7 +120,7 @@ KEY (`station`,`dh`,`echeance`)) ENGINE=MyISAM DEFAULT CHARSET=latin1;""")
|
||||
c = conn.cursor()
|
||||
c.execute("create table issue15 (t varchar(32))")
|
||||
try:
|
||||
c.execute("insert into issue15 (t) values (%s)", (u'\xe4\xf6\xfc'))
|
||||
c.execute("insert into issue15 (t) values (%s)", (u'\xe4\xf6\xfc',))
|
||||
c.execute("select t from issue15")
|
||||
self.assertEqual(u'\xe4\xf6\xfc', c.fetchone()[0])
|
||||
finally:
|
||||
@@ -133,6 +138,7 @@ KEY (`station`,`dh`,`echeance`)) ENGINE=MyISAM DEFAULT CHARSET=latin1;""")
|
||||
finally:
|
||||
c.execute("drop table issue16")
|
||||
|
||||
@unittest.skip("test_issue_17() requires a custom, legacy MySQL configuration and will not be run.")
|
||||
def test_issue_17(self):
|
||||
""" could not connect mysql use passwod """
|
||||
conn = self.connections[0]
|
||||
@@ -181,23 +187,22 @@ class TestNewIssues(base.PyMySQLTestCase):
|
||||
finally:
|
||||
c.execute(_uni("drop table hei\xc3\x9fe", "utf8"))
|
||||
|
||||
# Will fail without manual intervention:
|
||||
#def test_issue_35(self):
|
||||
#
|
||||
# conn = self.connections[0]
|
||||
# c = conn.cursor()
|
||||
# print "sudo killall -9 mysqld within the next 10 seconds"
|
||||
# try:
|
||||
# c.execute("select sleep(10)")
|
||||
# self.fail()
|
||||
# except pymysql.OperationalError, e:
|
||||
# self.assertEqual(2013, e.args[0])
|
||||
@unittest.skip("This test requires manual intervention")
|
||||
def test_issue_35(self):
|
||||
conn = self.connections[0]
|
||||
c = conn.cursor()
|
||||
print "sudo killall -9 mysqld within the next 10 seconds"
|
||||
try:
|
||||
c.execute("select sleep(10)")
|
||||
self.fail()
|
||||
except pymysql.OperationalError, e:
|
||||
self.assertEqual(2013, e.args[0])
|
||||
|
||||
def test_issue_36(self):
|
||||
conn = self.connections[0]
|
||||
c = conn.cursor()
|
||||
# kill connections[0]
|
||||
original_count = c.execute("show processlist")
|
||||
c.execute("show processlist")
|
||||
kill_id = None
|
||||
for id,user,host,db,command,time,state,info in c.fetchall():
|
||||
if info == "show processlist":
|
||||
@@ -212,8 +217,13 @@ class TestNewIssues(base.PyMySQLTestCase):
|
||||
except:
|
||||
pass
|
||||
# check the process list from the other connection
|
||||
self.assertEqual(original_count - 1, self.connections[1].cursor().execute("show processlist"))
|
||||
del self.connections[0]
|
||||
try:
|
||||
c = self.connections[1].cursor()
|
||||
c.execute("show processlist")
|
||||
ids = [row[0] for row in c.fetchall()]
|
||||
self.assertFalse(kill_id in ids)
|
||||
finally:
|
||||
del self.connections[0]
|
||||
|
||||
def test_issue_37(self):
|
||||
conn = self.connections[0]
|
||||
@@ -230,10 +240,38 @@ class TestNewIssues(base.PyMySQLTestCase):
|
||||
|
||||
try:
|
||||
c.execute("create table issue38 (id integer, data mediumblob)")
|
||||
c.execute("insert into issue38 values (1, %s)", datum)
|
||||
c.execute("insert into issue38 values (1, %s)", (datum,))
|
||||
finally:
|
||||
c.execute("drop table issue38")
|
||||
__all__ = ["TestOldIssues", "TestNewIssues"]
|
||||
|
||||
def disabled_test_issue_54(self):
|
||||
conn = self.connections[0]
|
||||
c = conn.cursor()
|
||||
big_sql = "select * from issue54 where "
|
||||
big_sql += " and ".join("%d=%d" % (i,i) for i in xrange(0, 100000))
|
||||
|
||||
try:
|
||||
c.execute("create table issue54 (id integer primary key)")
|
||||
c.execute("insert into issue54 (id) values (7)")
|
||||
c.execute(big_sql)
|
||||
self.assertEqual(7, c.fetchone()[0])
|
||||
finally:
|
||||
c.execute("drop table issue54")
|
||||
|
||||
class TestGitHubIssues(base.PyMySQLTestCase):
|
||||
def test_issue_66(self):
|
||||
conn = self.connections[0]
|
||||
c = conn.cursor()
|
||||
self.assertEqual(0, conn.insert_id())
|
||||
try:
|
||||
c.execute("create table issue66 (id integer primary key auto_increment, x integer)")
|
||||
c.execute("insert into issue66 (x) values (1)")
|
||||
c.execute("insert into issue66 (x) values (1)")
|
||||
self.assertEqual(2, conn.insert_id())
|
||||
finally:
|
||||
c.execute("drop table issue66")
|
||||
|
||||
__all__ = ["TestOldIssues", "TestNewIssues", "TestGitHubIssues"]
|
||||
|
||||
if __name__ == "__main__":
|
||||
import unittest
|
||||
|
||||
@@ -14,4 +14,3 @@ def TimeFromTicks(ticks):
|
||||
|
||||
def TimestampFromTicks(ticks):
|
||||
return datetime(*localtime(ticks)[:6])
|
||||
|
||||
|
||||
@@ -17,4 +17,3 @@ def join_bytes(bs):
|
||||
for b in bs[1:]:
|
||||
rv += b
|
||||
return rv
|
||||
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
import os
|
||||
import pyuca
|
||||
|
||||
unicode_collator = pyuca.Collator(os.path.join(os.path.dirname(__file__), 'allkeys.txt'))
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,133 @@
|
||||
# pyuca - Unicode Collation Algorithm
|
||||
# Version: 2006-02-13
|
||||
#
|
||||
# James Tauber
|
||||
# http://jtauber.com/
|
||||
|
||||
# Copyright (c) 2006 James Tauber
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
|
||||
|
||||
"""
|
||||
Preliminary implementation of the Unicode Collation Algorithm.
|
||||
|
||||
|
||||
This only implements the simple parts of the algorithm but I have successfully
|
||||
tested it using the Default Unicode Collation Element Table (DUCET) to collate
|
||||
Ancient Greek correctly.
|
||||
|
||||
Usage example:
|
||||
|
||||
from pyuca import Collator
|
||||
c = Collator("allkeys.txt")
|
||||
|
||||
sorted_words = sorted(words, key=c.sort_key)
|
||||
|
||||
allkeys.txt (1 MB) is available at
|
||||
|
||||
http://www.unicode.org/Public/UCA/latest/allkeys.txt
|
||||
|
||||
but you can always subset this for just the characters you are dealing with.
|
||||
"""
|
||||
|
||||
|
||||
class Trie:
|
||||
|
||||
def __init__(self):
|
||||
self.root = [None, {}]
|
||||
|
||||
def add(self, key, value):
|
||||
curr_node = self.root
|
||||
for part in key:
|
||||
curr_node = curr_node[1].setdefault(part, [None, {}])
|
||||
curr_node[0] = value
|
||||
|
||||
def find_prefix(self, key):
|
||||
curr_node = self.root
|
||||
remainder = key
|
||||
for part in key:
|
||||
if part not in curr_node[1]:
|
||||
break
|
||||
curr_node = curr_node[1][part]
|
||||
remainder = remainder[1:]
|
||||
return (curr_node[0], remainder)
|
||||
|
||||
|
||||
class Collator:
|
||||
|
||||
def __init__(self, filename):
|
||||
self.table = Trie()
|
||||
self.load(filename)
|
||||
|
||||
def load(self, filename):
|
||||
for line in open(filename):
|
||||
if line.startswith("#") or line.startswith("%"):
|
||||
continue
|
||||
if line.strip() == "":
|
||||
continue
|
||||
line = line[:line.find("#")] + "\n"
|
||||
line = line[:line.find("%")] + "\n"
|
||||
line = line.strip()
|
||||
|
||||
if line.startswith("@"):
|
||||
pass
|
||||
else:
|
||||
semicolon = line.find(";")
|
||||
charList = line[:semicolon].strip().split()
|
||||
x = line[semicolon:]
|
||||
collElements = []
|
||||
while True:
|
||||
begin = x.find("[")
|
||||
if begin == -1:
|
||||
break
|
||||
end = x[begin:].find("]")
|
||||
collElement = x[begin:begin+end+1]
|
||||
x = x[begin + 1:]
|
||||
|
||||
alt = collElement[1]
|
||||
chars = collElement[2:-1].split(".")
|
||||
|
||||
collElements.append((alt, chars))
|
||||
integer_points = [int(ch, 16) for ch in charList]
|
||||
self.table.add(integer_points, collElements)
|
||||
|
||||
def sort_key(self, string):
|
||||
|
||||
collation_elements = []
|
||||
|
||||
lookup_key = [ord(ch) for ch in string]
|
||||
while lookup_key:
|
||||
value, lookup_key = self.table.find_prefix(lookup_key)
|
||||
if not value:
|
||||
# @@@
|
||||
raise ValueError, map(hex, lookup_key)
|
||||
collation_elements.extend(value)
|
||||
|
||||
sort_key = []
|
||||
|
||||
for level in range(4):
|
||||
if level:
|
||||
sort_key.append(0) # level separator
|
||||
for element in collation_elements:
|
||||
ce_l = int(element[1][level], 16)
|
||||
if ce_l:
|
||||
sort_key.append(ce_l)
|
||||
|
||||
return tuple(sort_key)
|
||||
@@ -0,0 +1,17 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf8 -*-
|
||||
# Plural-Forms for af (Afrikaans (South Africa))
|
||||
|
||||
nplurals=2 # Afrikaans language has 2 forms:
|
||||
# 1 singular and 1 plural
|
||||
|
||||
# Determine plural_id for number *n* as sequence of positive
|
||||
# integers: 0,1,...
|
||||
# NOTE! For singular form ALWAYS return plural_id = 0
|
||||
get_plural_id = lambda n: int(n != 1)
|
||||
|
||||
# Construct and return plural form of *word* using
|
||||
# *plural_id* (which ALWAYS>0). This function will be executed
|
||||
# for words (or phrases) not found in plural_dict dictionary
|
||||
# construct_plural_form = lambda word, plural_id: (word + 'suffix')
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf8 -*-
|
||||
# Plural-Forms for bg (Bulgarian)
|
||||
|
||||
nplurals=2 # Bulgarian language has 2 forms:
|
||||
# 1 singular and 1 plural
|
||||
|
||||
# Determine plural_id for number *n* as sequence of positive
|
||||
# integers: 0,1,...
|
||||
# NOTE! For singular form ALWAYS return plural_id = 0
|
||||
get_plural_id = lambda n: int(n != 1)
|
||||
|
||||
# Construct and return plural form of *word* using
|
||||
# *plural_id* (which ALWAYS>0). This function will be executed
|
||||
# for words (or phrases) not found in plural_dict dictionary
|
||||
# construct_plural_form = lambda word, plural_id: (word + 'suffix')
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user