diff --git a/.travis.yml b/.travis.yml
index e7c88e7e..644e6211 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -10,12 +10,16 @@ python:
- '2.7'
- '3.5'
- '3.6'
+ - '3.6-dev'
+ - '3.7-dev'
- 'pypy-5.3.1'
- 'pypy3.5-5.7.1-beta'
matrix:
allow_failures:
- python: 'pypy3.5-5.7.1-beta'
+ - python: '3.6-dev'
+ - python: '3.7-dev'
install:
- pip install -e .
diff --git a/gluon/contrib/login_methods/janrain_account.py b/gluon/contrib/login_methods/janrain_account.py
index 02229ce8..1834b322 100644
--- a/gluon/contrib/login_methods/janrain_account.py
+++ b/gluon/contrib/login_methods/janrain_account.py
@@ -78,10 +78,13 @@ class RPXAccount(object):
def get_user(self):
request = self.request
- if request.vars.token:
+ # Janrain now sends the token via both a POST body and the query
+ # string, so we should keep only one of these.
+ token = request.post_vars.token or request.get_vars.token
+ if token:
user = Storage()
data = urllib.urlencode(
- dict(apiKey=self.api_key, token=request.vars.token))
+ dict(apiKey=self.api_key, token=token))
auth_info_json = fetch(self.auth_url + '?' + data)
auth_info = json.loads(auth_info_json)
diff --git a/gluon/contrib/login_methods/rpx_account.py b/gluon/contrib/login_methods/rpx_account.py
index 4d7cbf40..dcfdc114 100644
--- a/gluon/contrib/login_methods/rpx_account.py
+++ b/gluon/contrib/login_methods/rpx_account.py
@@ -78,10 +78,13 @@ class RPXAccount(object):
def get_user(self):
request = self.request
- if request.vars.token:
+ # Janrain now sends the token via both a POST body and the query
+ # string, so we should keep only one of these.
+ token = request.post_vars.token or request.get_vars.token
+ if token:
user = Storage()
data = urllib.urlencode(
- dict(apiKey=self.api_key, token=request.vars.token))
+ dict(apiKey=self.api_key, token=token))
auth_info_json = fetch(self.auth_url + '?' + data)
auth_info = json.loads(auth_info_json)
diff --git a/gluon/globals.py b/gluon/globals.py
index b4344f0f..767a9b0b 100644
--- a/gluon/globals.py
+++ b/gluon/globals.py
@@ -464,7 +464,7 @@ class Response(Storage):
for meta in iteritems((self.meta or {})):
k, v = meta
if isinstance(v, dict):
- s += '\n'
else:
s += '\n' % (k, to_native(xmlescape(v)))
diff --git a/gluon/sqlhtml.py b/gluon/sqlhtml.py
index 213a38a9..7549bacd 100644
--- a/gluon/sqlhtml.py
+++ b/gluon/sqlhtml.py
@@ -1677,6 +1677,7 @@ class SQLFORM(FORM):
keepvalues = True if self.record else False
if self.readonly:
+ self.deleted = False
return False
if request_vars.__class__.__name__ == 'Request':
diff --git a/gluon/tests/test_globals.py b/gluon/tests/test_globals.py
index da403dbe..666249fa 100644
--- a/gluon/tests/test_globals.py
+++ b/gluon/tests/test_globals.py
@@ -230,3 +230,14 @@ class testResponse(unittest.TestCase):
current.session._fixup_before_save()
cookie = str(current.response.cookies)
self.assertTrue('httponly' not in cookie.lower())
+
+ def test_include_meta(self):
+ response = Response()
+ response.meta[u'web2py'] = 'web2py'
+ response.include_meta()
+ self.assertEqual(response.body.getvalue(), '\n\n')
+ response = Response()
+ response.meta[u'meta_dict'] = {u'tag_name':'tag_value'}
+ response.include_meta()
+ self.assertEqual(response.body.getvalue(), '\n\n')
+
diff --git a/gluon/validators.py b/gluon/validators.py
index 21de1ce2..718758ce 100644
--- a/gluon/validators.py
+++ b/gluon/validators.py
@@ -1656,173 +1656,292 @@ class IS_GENERIC_URL(Validator):
# else the URL is not valid
return (value, translate(self.error_message))
-# Sources (obtained 2015-Feb-24):
+# Sources (obtained 2017-Nov-11):
# http://data.iana.org/TLD/tlds-alpha-by-domain.txt
# see scripts/parse_top_level_domains.py for an easy update
official_top_level_domains = [
# a
- 'abogado', 'ac', 'academy', 'accountants', 'active', 'actor',
- 'ad', 'adult', 'ae', 'aero', 'af', 'ag', 'agency', 'ai',
- 'airforce', 'al', 'allfinanz', 'alsace', 'am', 'amsterdam', 'an',
- 'android', 'ao', 'apartments', 'aq', 'aquarelle', 'ar', 'archi',
- 'army', 'arpa', 'as', 'asia', 'associates', 'at', 'attorney',
- 'au', 'auction', 'audio', 'autos', 'aw', 'ax', 'axa', 'az',
+ 'aaa', 'aarp', 'abarth', 'abb', 'abbott', 'abbvie', 'abc',
+ 'able', 'abogado', 'abudhabi', 'ac', 'academy', 'accenture',
+ 'accountant', 'accountants', 'aco', 'active', 'actor', 'ad',
+ 'adac', 'ads', 'adult', 'ae', 'aeg', 'aero', 'aetna', 'af',
+ 'afamilycompany', 'afl', 'africa', 'ag', 'agakhan', 'agency',
+ 'ai', 'aig', 'aigo', 'airbus', 'airforce', 'airtel', 'akdn',
+ 'al', 'alfaromeo', 'alibaba', 'alipay', 'allfinanz', 'allstate',
+ 'ally', 'alsace', 'alstom', 'am', 'americanexpress',
+ 'americanfamily', 'amex', 'amfam', 'amica', 'amsterdam',
+ 'analytics', 'android', 'anquan', 'anz', 'ao', 'aol',
+ 'apartments', 'app', 'apple', 'aq', 'aquarelle', 'ar', 'arab',
+ 'aramco', 'archi', 'army', 'arpa', 'art', 'arte', 'as', 'asda',
+ 'asia', 'associates', 'at', 'athleta', 'attorney', 'au',
+ 'auction', 'audi', 'audible', 'audio', 'auspost', 'author',
+ 'auto', 'autos', 'avianca', 'aw', 'aws', 'ax', 'axa', 'az',
+ 'azure',
# b
- 'ba', 'band', 'bank', 'bar', 'barclaycard', 'barclays',
- 'bargains', 'bayern', 'bb', 'bd', 'be', 'beer', 'berlin', 'best',
- 'bf', 'bg', 'bh', 'bi', 'bid', 'bike', 'bingo', 'bio', 'biz',
- 'bj', 'black', 'blackfriday', 'bloomberg', 'blue', 'bm', 'bmw',
- 'bn', 'bnpparibas', 'bo', 'boo', 'boutique', 'br', 'brussels',
- 'bs', 'bt', 'budapest', 'build', 'builders', 'business', 'buzz',
- 'bv', 'bw', 'by', 'bz', 'bzh',
+ 'ba', 'baby', 'baidu', 'banamex', 'bananarepublic', 'band',
+ 'bank', 'bar', 'barcelona', 'barclaycard', 'barclays',
+ 'barefoot', 'bargains', 'baseball', 'basketball', 'bauhaus',
+ 'bayern', 'bb', 'bbc', 'bbt', 'bbva', 'bcg', 'bcn', 'bd', 'be',
+ 'beats', 'beauty', 'beer', 'bentley', 'berlin', 'best',
+ 'bestbuy', 'bet', 'bf', 'bg', 'bh', 'bharti', 'bi', 'bible',
+ 'bid', 'bike', 'bing', 'bingo', 'bio', 'biz', 'bj', 'black',
+ 'blackfriday', 'blanco', 'blockbuster', 'blog', 'bloomberg',
+ 'blue', 'bm', 'bms', 'bmw', 'bn', 'bnl', 'bnpparibas', 'bo',
+ 'boats', 'boehringer', 'bofa', 'bom', 'bond', 'boo', 'book',
+ 'booking', 'boots', 'bosch', 'bostik', 'boston', 'bot',
+ 'boutique', 'box', 'br', 'bradesco', 'bridgestone', 'broadway',
+ 'broker', 'brother', 'brussels', 'bs', 'bt', 'budapest',
+ 'bugatti', 'build', 'builders', 'business', 'buy', 'buzz', 'bv',
+ 'bw', 'by', 'bz', 'bzh',
# c
- 'ca', 'cab', 'cal', 'camera', 'camp', 'cancerresearch', 'canon',
- 'capetown', 'capital', 'caravan', 'cards', 'care', 'career',
- 'careers', 'cartier', 'casa', 'cash', 'casino', 'cat',
- 'catering', 'cbn', 'cc', 'cd', 'center', 'ceo', 'cern', 'cf',
- 'cg', 'ch', 'channel', 'chat', 'cheap', 'christmas', 'chrome',
- 'church', 'ci', 'citic', 'city', 'ck', 'cl', 'claims',
- 'cleaning', 'click', 'clinic', 'clothing', 'club', 'cm', 'cn',
- 'co', 'coach', 'codes', 'coffee', 'college', 'cologne', 'com',
- 'community', 'company', 'computer', 'condos', 'construction',
- 'consulting', 'contractors', 'cooking', 'cool', 'coop',
- 'country', 'cr', 'credit', 'creditcard', 'cricket', 'crs',
- 'cruises', 'cu', 'cuisinella', 'cv', 'cw', 'cx', 'cy', 'cymru',
- 'cz',
+ 'ca', 'cab', 'cafe', 'cal', 'call', 'calvinklein', 'cam',
+ 'camera', 'camp', 'cancerresearch', 'canon', 'capetown',
+ 'capital', 'capitalone', 'car', 'caravan', 'cards', 'care',
+ 'career', 'careers', 'cars', 'cartier', 'casa', 'case', 'caseih',
+ 'cash', 'casino', 'cat', 'catering', 'catholic', 'cba', 'cbn',
+ 'cbre', 'cbs', 'cc', 'cd', 'ceb', 'center', 'ceo', 'cern', 'cf',
+ 'cfa', 'cfd', 'cg', 'ch', 'chanel', 'channel', 'chase', 'chat',
+ 'cheap', 'chintai', 'christmas', 'chrome', 'chrysler', 'church',
+ 'ci', 'cipriani', 'circle', 'cisco', 'citadel', 'citi', 'citic',
+ 'city', 'cityeats', 'ck', 'cl', 'claims', 'cleaning', 'click',
+ 'clinic', 'clinique', 'clothing', 'cloud', 'club', 'clubmed',
+ 'cm', 'cn', 'co', 'coach', 'codes', 'coffee', 'college',
+ 'cologne', 'com', 'comcast', 'commbank', 'community', 'company',
+ 'compare', 'computer', 'comsec', 'condos', 'construction',
+ 'consulting', 'contact', 'contractors', 'cooking',
+ 'cookingchannel', 'cool', 'coop', 'corsica', 'country', 'coupon',
+ 'coupons', 'courses', 'cr', 'credit', 'creditcard',
+ 'creditunion', 'cricket', 'crown', 'crs', 'cruise', 'cruises',
+ 'csc', 'cu', 'cuisinella', 'cv', 'cw', 'cx', 'cy', 'cymru',
+ 'cyou', 'cz',
# d
- 'dabur', 'dad', 'dance', 'dating', 'day', 'dclk', 'de', 'deals',
- 'degree', 'delivery', 'democrat', 'dental', 'dentist', 'desi',
- 'design', 'dev', 'diamonds', 'diet', 'digital', 'direct',
- 'directory', 'discount', 'dj', 'dk', 'dm', 'dnp', 'do', 'docs',
- 'domains', 'doosan', 'durban', 'dvag', 'dz',
+ 'dabur', 'dad', 'dance', 'data', 'date', 'dating', 'datsun',
+ 'day', 'dclk', 'dds', 'de', 'deal', 'dealer', 'deals', 'degree',
+ 'delivery', 'dell', 'deloitte', 'delta', 'democrat', 'dental',
+ 'dentist', 'desi', 'design', 'dev', 'dhl', 'diamonds', 'diet',
+ 'digital', 'direct', 'directory', 'discount', 'discover', 'dish',
+ 'diy', 'dj', 'dk', 'dm', 'dnp', 'do', 'docs', 'doctor', 'dodge',
+ 'dog', 'doha', 'domains', 'dot', 'download', 'drive', 'dtv',
+ 'dubai', 'duck', 'dunlop', 'duns', 'dupont', 'durban', 'dvag',
+ 'dvr', 'dz',
# e
- 'eat', 'ec', 'edu', 'education', 'ee', 'eg', 'email', 'emerck',
- 'energy', 'engineer', 'engineering', 'enterprises', 'equipment',
- 'er', 'es', 'esq', 'estate', 'et', 'eu', 'eurovision', 'eus',
- 'events', 'everbank', 'exchange', 'expert', 'exposed',
+ 'earth', 'eat', 'ec', 'eco', 'edeka', 'edu', 'education', 'ee',
+ 'eg', 'email', 'emerck', 'energy', 'engineer', 'engineering',
+ 'enterprises', 'epost', 'epson', 'equipment', 'er', 'ericsson',
+ 'erni', 'es', 'esq', 'estate', 'esurance', 'et', 'etisalat',
+ 'eu', 'eurovision', 'eus', 'events', 'everbank', 'exchange',
+ 'expert', 'exposed', 'express', 'extraspace',
# f
- 'fail', 'fans', 'farm', 'fashion', 'feedback', 'fi', 'finance',
- 'financial', 'firmdale', 'fish', 'fishing', 'fit', 'fitness',
- 'fj', 'fk', 'flights', 'florist', 'flowers', 'flsmidth', 'fly',
- 'fm', 'fo', 'foo', 'football', 'forsale', 'foundation', 'fr',
- 'frl', 'frogans', 'fund', 'furniture', 'futbol',
+ 'fage', 'fail', 'fairwinds', 'faith', 'family', 'fan', 'fans',
+ 'farm', 'farmers', 'fashion', 'fast', 'fedex', 'feedback',
+ 'ferrari', 'ferrero', 'fi', 'fiat', 'fidelity', 'fido', 'film',
+ 'final', 'finance', 'financial', 'fire', 'firestone', 'firmdale',
+ 'fish', 'fishing', 'fit', 'fitness', 'fj', 'fk', 'flickr',
+ 'flights', 'flir', 'florist', 'flowers', 'fly', 'fm', 'fo',
+ 'foo', 'food', 'foodnetwork', 'football', 'ford', 'forex',
+ 'forsale', 'forum', 'foundation', 'fox', 'fr', 'free',
+ 'fresenius', 'frl', 'frogans', 'frontdoor', 'frontier', 'ftr',
+ 'fujitsu', 'fujixerox', 'fun', 'fund', 'furniture', 'futbol',
+ 'fyi',
# g
- 'ga', 'gal', 'gallery', 'garden', 'gb', 'gbiz', 'gd', 'gdn',
- 'ge', 'gent', 'gf', 'gg', 'ggee', 'gh', 'gi', 'gift', 'gifts',
- 'gives', 'gl', 'glass', 'gle', 'global', 'globo', 'gm', 'gmail',
- 'gmo', 'gmx', 'gn', 'goldpoint', 'goog', 'google', 'gop', 'gov',
- 'gp', 'gq', 'gr', 'graphics', 'gratis', 'green', 'gripe', 'gs',
- 'gt', 'gu', 'guide', 'guitars', 'guru', 'gw', 'gy',
+ 'ga', 'gal', 'gallery', 'gallo', 'gallup', 'game', 'games',
+ 'gap', 'garden', 'gb', 'gbiz', 'gd', 'gdn', 'ge', 'gea', 'gent',
+ 'genting', 'george', 'gf', 'gg', 'ggee', 'gh', 'gi', 'gift',
+ 'gifts', 'gives', 'giving', 'gl', 'glade', 'glass', 'gle',
+ 'global', 'globo', 'gm', 'gmail', 'gmbh', 'gmo', 'gmx', 'gn',
+ 'godaddy', 'gold', 'goldpoint', 'golf', 'goo', 'goodhands',
+ 'goodyear', 'goog', 'google', 'gop', 'got', 'gov', 'gp', 'gq',
+ 'gr', 'grainger', 'graphics', 'gratis', 'green', 'gripe',
+ 'grocery', 'group', 'gs', 'gt', 'gu', 'guardian', 'gucci',
+ 'guge', 'guide', 'guitars', 'guru', 'gw', 'gy',
# h
- 'hamburg', 'hangout', 'haus', 'healthcare', 'help', 'here',
- 'hermes', 'hiphop', 'hiv', 'hk', 'hm', 'hn', 'holdings',
- 'holiday', 'homes', 'horse', 'host', 'hosting', 'house', 'how',
- 'hr', 'ht', 'hu',
+ 'hair', 'hamburg', 'hangout', 'haus', 'hbo', 'hdfc', 'hdfcbank',
+ 'health', 'healthcare', 'help', 'helsinki', 'here', 'hermes',
+ 'hgtv', 'hiphop', 'hisamitsu', 'hitachi', 'hiv', 'hk', 'hkt',
+ 'hm', 'hn', 'hockey', 'holdings', 'holiday', 'homedepot',
+ 'homegoods', 'homes', 'homesense', 'honda', 'honeywell', 'horse',
+ 'hospital', 'host', 'hosting', 'hot', 'hoteles', 'hotels',
+ 'hotmail', 'house', 'how', 'hr', 'hsbc', 'ht', 'hu', 'hughes',
+ 'hyatt', 'hyundai',
# i
- 'ibm', 'id', 'ie', 'ifm', 'il', 'im', 'immo', 'immobilien', 'in',
- 'industries', 'info', 'ing', 'ink', 'institute', 'insure', 'int',
- 'international', 'investments', 'io', 'iq', 'ir', 'irish', 'is',
- 'it', 'iwc',
+ 'ibm', 'icbc', 'ice', 'icu', 'id', 'ie', 'ieee', 'ifm', 'ikano',
+ 'il', 'im', 'imamat', 'imdb', 'immo', 'immobilien', 'in',
+ 'industries', 'infiniti', 'info', 'ing', 'ink', 'institute',
+ 'insurance', 'insure', 'int', 'intel', 'international', 'intuit',
+ 'investments', 'io', 'ipiranga', 'iq', 'ir', 'irish', 'is',
+ 'iselect', 'ismaili', 'ist', 'istanbul', 'it', 'itau', 'itv',
+ 'iveco', 'iwc',
# j
- 'jcb', 'je', 'jetzt', 'jm', 'jo', 'jobs', 'joburg', 'jp',
- 'juegos',
+ 'jaguar', 'java', 'jcb', 'jcp', 'je', 'jeep', 'jetzt', 'jewelry',
+ 'jio', 'jlc', 'jll', 'jm', 'jmp', 'jnj', 'jo', 'jobs', 'joburg',
+ 'jot', 'joy', 'jp', 'jpmorgan', 'jprs', 'juegos', 'juniper',
# k
- 'kaufen', 'kddi', 'ke', 'kg', 'kh', 'ki', 'kim', 'kitchen',
- 'kiwi', 'km', 'kn', 'koeln', 'kp', 'kr', 'krd', 'kred', 'kw',
- 'ky', 'kyoto', 'kz',
+ 'kaufen', 'kddi', 'ke', 'kerryhotels', 'kerrylogistics',
+ 'kerryproperties', 'kfh', 'kg', 'kh', 'ki', 'kia', 'kim',
+ 'kinder', 'kindle', 'kitchen', 'kiwi', 'km', 'kn', 'koeln',
+ 'komatsu', 'kosher', 'kp', 'kpmg', 'kpn', 'kr', 'krd', 'kred',
+ 'kuokgroup', 'kw', 'ky', 'kyoto', 'kz',
# l
- 'la', 'lacaixa', 'land', 'lat', 'latrobe', 'lawyer', 'lb', 'lc',
- 'lds', 'lease', 'legal', 'lgbt', 'li', 'lidl', 'life',
- 'lighting', 'limited', 'limo', 'link', 'lk', 'loans',
- 'localhost', 'london', 'lotte', 'lotto', 'lr', 'ls', 'lt',
- 'ltda', 'lu', 'luxe', 'luxury', 'lv', 'ly',
+ 'la', 'lacaixa', 'ladbrokes', 'lamborghini', 'lamer',
+ 'lancaster', 'lancia', 'lancome', 'land', 'landrover', 'lanxess',
+ 'lasalle', 'lat', 'latino', 'latrobe', 'law', 'lawyer', 'lb',
+ 'lc', 'lds', 'lease', 'leclerc', 'lefrak', 'legal', 'lego',
+ 'lexus', 'lgbt', 'li', 'liaison', 'lidl', 'life',
+ 'lifeinsurance', 'lifestyle', 'lighting', 'like', 'lilly',
+ 'limited', 'limo', 'lincoln', 'linde', 'link', 'lipsy', 'live',
+ 'living', 'lixil', 'lk', 'loan', 'loans', 'localhost', 'locker',
+ 'locus', 'loft', 'lol', 'london', 'lotte', 'lotto', 'love',
+ 'lpl', 'lplfinancial', 'lr', 'ls', 'lt', 'ltd', 'ltda', 'lu',
+ 'lundbeck', 'lupin', 'luxe', 'luxury', 'lv', 'ly',
# m
- 'ma', 'madrid', 'maison', 'management', 'mango', 'market',
- 'marketing', 'marriott', 'mc', 'md', 'me', 'media', 'meet',
- 'melbourne', 'meme', 'memorial', 'menu', 'mg', 'mh', 'miami',
- 'mil', 'mini', 'mk', 'ml', 'mm', 'mn', 'mo', 'mobi', 'moda',
- 'moe', 'monash', 'money', 'mormon', 'mortgage', 'moscow',
- 'motorcycles', 'mov', 'mp', 'mq', 'mr', 'ms', 'mt', 'mu',
- 'museum', 'mv', 'mw', 'mx', 'my', 'mz',
+ 'ma', 'macys', 'madrid', 'maif', 'maison', 'makeup', 'man',
+ 'management', 'mango', 'map', 'market', 'marketing', 'markets',
+ 'marriott', 'marshalls', 'maserati', 'mattel', 'mba', 'mc',
+ 'mckinsey', 'md', 'me', 'med', 'media', 'meet', 'melbourne',
+ 'meme', 'memorial', 'men', 'menu', 'meo', 'merckmsd', 'metlife',
+ 'mg', 'mh', 'miami', 'microsoft', 'mil', 'mini', 'mint', 'mit',
+ 'mitsubishi', 'mk', 'ml', 'mlb', 'mls', 'mm', 'mma', 'mn', 'mo',
+ 'mobi', 'mobile', 'mobily', 'moda', 'moe', 'moi', 'mom',
+ 'monash', 'money', 'monster', 'mopar', 'mormon', 'mortgage',
+ 'moscow', 'moto', 'motorcycles', 'mov', 'movie', 'movistar',
+ 'mp', 'mq', 'mr', 'ms', 'msd', 'mt', 'mtn', 'mtr', 'mu',
+ 'museum', 'mutual', 'mv', 'mw', 'mx', 'my', 'mz',
# n
- 'na', 'nagoya', 'name', 'navy', 'nc', 'ne', 'net', 'network',
- 'neustar', 'new', 'nexus', 'nf', 'ng', 'ngo', 'nhk', 'ni',
- 'nico', 'ninja', 'nl', 'no', 'np', 'nr', 'nra', 'nrw', 'ntt',
- 'nu', 'nyc', 'nz',
+ 'na', 'nab', 'nadex', 'nagoya', 'name', 'nationwide', 'natura',
+ 'navy', 'nba', 'nc', 'ne', 'nec', 'net', 'netbank', 'netflix',
+ 'network', 'neustar', 'new', 'newholland', 'news', 'next',
+ 'nextdirect', 'nexus', 'nf', 'nfl', 'ng', 'ngo', 'nhk', 'ni',
+ 'nico', 'nike', 'nikon', 'ninja', 'nissan', 'nissay', 'nl', 'no',
+ 'nokia', 'northwesternmutual', 'norton', 'now', 'nowruz',
+ 'nowtv', 'np', 'nr', 'nra', 'nrw', 'ntt', 'nu', 'nyc', 'nz',
# o
- 'okinawa', 'om', 'one', 'ong', 'onl', 'ooo', 'org', 'organic',
- 'osaka', 'otsuka', 'ovh',
+ 'obi', 'observer', 'off', 'office', 'okinawa', 'olayan',
+ 'olayangroup', 'oldnavy', 'ollo', 'om', 'omega', 'one', 'ong',
+ 'onl', 'online', 'onyourside', 'ooo', 'open', 'oracle', 'orange',
+ 'org', 'organic', 'origins', 'osaka', 'otsuka', 'ott', 'ovh',
# p
- 'pa', 'paris', 'partners', 'parts', 'party', 'pe', 'pf', 'pg',
- 'ph', 'pharmacy', 'photo', 'photography', 'photos', 'physio',
- 'pics', 'pictures', 'pink', 'pizza', 'pk', 'pl', 'place',
- 'plumbing', 'pm', 'pn', 'pohl', 'poker', 'porn', 'post', 'pr',
- 'praxi', 'press', 'pro', 'prod', 'productions', 'prof',
- 'properties', 'property', 'ps', 'pt', 'pub', 'pw', 'py',
+ 'pa', 'page', 'panasonic', 'panerai', 'paris', 'pars',
+ 'partners', 'parts', 'party', 'passagens', 'pay', 'pccw', 'pe',
+ 'pet', 'pf', 'pfizer', 'pg', 'ph', 'pharmacy', 'phd', 'philips',
+ 'phone', 'photo', 'photography', 'photos', 'physio', 'piaget',
+ 'pics', 'pictet', 'pictures', 'pid', 'pin', 'ping', 'pink',
+ 'pioneer', 'pizza', 'pk', 'pl', 'place', 'play', 'playstation',
+ 'plumbing', 'plus', 'pm', 'pn', 'pnc', 'pohl', 'poker',
+ 'politie', 'porn', 'post', 'pr', 'pramerica', 'praxi', 'press',
+ 'prime', 'pro', 'prod', 'productions', 'prof', 'progressive',
+ 'promo', 'properties', 'property', 'protection', 'pru',
+ 'prudential', 'ps', 'pt', 'pub', 'pw', 'pwc', 'py',
# q
- 'qa', 'qpon', 'quebec',
+ 'qa', 'qpon', 'quebec', 'quest', 'qvc',
# r
- 're', 'realtor', 'recipes', 'red', 'rehab', 'reise', 'reisen',
- 'reit', 'ren', 'rentals', 'repair', 'report', 'republican',
- 'rest', 'restaurant', 'reviews', 'rich', 'rio', 'rip', 'ro',
- 'rocks', 'rodeo', 'rs', 'rsvp', 'ru', 'ruhr', 'rw', 'ryukyu',
+ 'racing', 'radio', 'raid', 're', 'read', 'realestate', 'realtor',
+ 'realty', 'recipes', 'red', 'redstone', 'redumbrella', 'rehab',
+ 'reise', 'reisen', 'reit', 'reliance', 'ren', 'rent', 'rentals',
+ 'repair', 'report', 'republican', 'rest', 'restaurant', 'review',
+ 'reviews', 'rexroth', 'rich', 'richardli', 'ricoh',
+ 'rightathome', 'ril', 'rio', 'rip', 'rmit', 'ro', 'rocher',
+ 'rocks', 'rodeo', 'rogers', 'room', 'rs', 'rsvp', 'ru', 'rugby',
+ 'ruhr', 'run', 'rw', 'rwe', 'ryukyu',
# s
- 'sa', 'saarland', 'sale', 'samsung', 'sarl', 'saxo', 'sb', 'sc',
- 'sca', 'scb', 'schmidt', 'school', 'schule', 'schwarz',
- 'science', 'scot', 'sd', 'se', 'services', 'sew', 'sexy', 'sg',
- 'sh', 'shiksha', 'shoes', 'shriram', 'si', 'singles', 'sj', 'sk',
- 'sky', 'sl', 'sm', 'sn', 'so', 'social', 'software', 'sohu',
- 'solar', 'solutions', 'soy', 'space', 'spiegel', 'sr', 'st',
- 'style', 'su', 'supplies', 'supply', 'support', 'surf',
- 'surgery', 'suzuki', 'sv', 'sx', 'sy', 'sydney', 'systems', 'sz',
+ 'sa', 'saarland', 'safe', 'safety', 'sakura', 'sale', 'salon',
+ 'samsclub', 'samsung', 'sandvik', 'sandvikcoromant', 'sanofi',
+ 'sap', 'sapo', 'sarl', 'sas', 'save', 'saxo', 'sb', 'sbi', 'sbs',
+ 'sc', 'sca', 'scb', 'schaeffler', 'schmidt', 'scholarships',
+ 'school', 'schule', 'schwarz', 'science', 'scjohnson', 'scor',
+ 'scot', 'sd', 'se', 'search', 'seat', 'secure', 'security',
+ 'seek', 'select', 'sener', 'services', 'ses', 'seven', 'sew',
+ 'sex', 'sexy', 'sfr', 'sg', 'sh', 'shangrila', 'sharp', 'shaw',
+ 'shell', 'shia', 'shiksha', 'shoes', 'shop', 'shopping',
+ 'shouji', 'show', 'showtime', 'shriram', 'si', 'silk', 'sina',
+ 'singles', 'site', 'sj', 'sk', 'ski', 'skin', 'sky', 'skype',
+ 'sl', 'sling', 'sm', 'smart', 'smile', 'sn', 'sncf', 'so',
+ 'soccer', 'social', 'softbank', 'software', 'sohu', 'solar',
+ 'solutions', 'song', 'sony', 'soy', 'space', 'spiegel', 'spot',
+ 'spreadbetting', 'sr', 'srl', 'srt', 'st', 'stada', 'staples',
+ 'star', 'starhub', 'statebank', 'statefarm', 'statoil', 'stc',
+ 'stcgroup', 'stockholm', 'storage', 'store', 'stream', 'studio',
+ 'study', 'style', 'su', 'sucks', 'supplies', 'supply', 'support',
+ 'surf', 'surgery', 'suzuki', 'sv', 'swatch', 'swiftcover',
+ 'swiss', 'sx', 'sy', 'sydney', 'symantec', 'systems', 'sz',
# t
- 'taipei', 'tatar', 'tattoo', 'tax', 'tc', 'td', 'technology',
- 'tel', 'temasek', 'tennis', 'tf', 'tg', 'th', 'tienda', 'tips',
- 'tires', 'tirol', 'tj', 'tk', 'tl', 'tm', 'tn', 'to', 'today',
- 'tokyo', 'tools', 'top', 'toshiba', 'town', 'toys', 'tp', 'tr',
- 'trade', 'training', 'travel', 'trust', 'tt', 'tui', 'tv', 'tw',
- 'tz',
+ 'tab', 'taipei', 'talk', 'taobao', 'target', 'tatamotors',
+ 'tatar', 'tattoo', 'tax', 'taxi', 'tc', 'tci', 'td', 'tdk',
+ 'team', 'tech', 'technology', 'tel', 'telecity', 'telefonica',
+ 'temasek', 'tennis', 'teva', 'tf', 'tg', 'th', 'thd', 'theater',
+ 'theatre', 'tiaa', 'tickets', 'tienda', 'tiffany', 'tips',
+ 'tires', 'tirol', 'tj', 'tjmaxx', 'tjx', 'tk', 'tkmaxx', 'tl',
+ 'tm', 'tmall', 'tn', 'to', 'today', 'tokyo', 'tools', 'top',
+ 'toray', 'toshiba', 'total', 'tours', 'town', 'toyota', 'toys',
+ 'tr', 'trade', 'trading', 'training', 'travel', 'travelchannel',
+ 'travelers', 'travelersinsurance', 'trust', 'trv', 'tt', 'tube',
+ 'tui', 'tunes', 'tushu', 'tv', 'tvs', 'tw', 'tz',
# u
- 'ua', 'ug', 'uk', 'university', 'uno', 'uol', 'us', 'uy', 'uz',
+ 'ua', 'ubank', 'ubs', 'uconnect', 'ug', 'uk', 'unicom',
+ 'university', 'uno', 'uol', 'ups', 'us', 'uy', 'uz',
# v
- 'va', 'vacations', 'vc', 've', 'vegas', 'ventures',
- 'versicherung', 'vet', 'vg', 'vi', 'viajes', 'video', 'villas',
- 'vision', 'vlaanderen', 'vn', 'vodka', 'vote', 'voting', 'voto',
- 'voyage', 'vu',
+ 'va', 'vacations', 'vana', 'vanguard', 'vc', 've', 'vegas',
+ 'ventures', 'verisign', 'versicherung', 'vet', 'vg', 'vi',
+ 'viajes', 'video', 'vig', 'viking', 'villas', 'vin', 'vip',
+ 'virgin', 'visa', 'vision', 'vista', 'vistaprint', 'viva',
+ 'vivo', 'vlaanderen', 'vn', 'vodka', 'volkswagen', 'volvo',
+ 'vote', 'voting', 'voto', 'voyage', 'vu', 'vuelos',
# w
- 'wales', 'wang', 'watch', 'webcam', 'website', 'wed', 'wedding',
- 'wf', 'whoswho', 'wien', 'wiki', 'williamhill', 'wme', 'work',
- 'works', 'world', 'ws', 'wtc', 'wtf',
+ 'wales', 'walmart', 'walter', 'wang', 'wanggou', 'warman',
+ 'watch', 'watches', 'weather', 'weatherchannel', 'webcam',
+ 'weber', 'website', 'wed', 'wedding', 'weibo', 'weir', 'wf',
+ 'whoswho', 'wien', 'wiki', 'williamhill', 'win', 'windows',
+ 'wine', 'winners', 'wme', 'wolterskluwer', 'woodside', 'work',
+ 'works', 'world', 'wow', 'ws', 'wtc', 'wtf',
# x
- 'xn--1qqw23a', 'xn--3bst00m', 'xn--3ds443g', 'xn--3e0b707e',
- 'xn--45brj9c', 'xn--45q11c', 'xn--4gbrim', 'xn--55qw42g',
- 'xn--55qx5d', 'xn--6frz82g', 'xn--6qq986b3xl', 'xn--80adxhks',
- 'xn--80ao21a', 'xn--80asehdb', 'xn--80aswg', 'xn--90a3ac',
- 'xn--90ais', 'xn--b4w605ferd', 'xn--c1avg', 'xn--cg4bki',
- 'xn--clchc0ea0b2g2a9gcd', 'xn--czr694b', 'xn--czrs0t',
- 'xn--czru2d', 'xn--d1acj3b', 'xn--d1alf', 'xn--fiq228c5hs',
- 'xn--fiq64b', 'xn--fiqs8s', 'xn--fiqz9s', 'xn--flw351e',
- 'xn--fpcrj9c3d', 'xn--fzc2c9e2c', 'xn--gecrj9c', 'xn--h2brj9c',
- 'xn--hxt814e', 'xn--i1b6b1a6a2e', 'xn--io0a7i', 'xn--j1amh',
- 'xn--j6w193g', 'xn--kprw13d', 'xn--kpry57d', 'xn--kput3i',
- 'xn--l1acc', 'xn--lgbbat1ad8j', 'xn--mgb9awbf',
- 'xn--mgba3a4f16a', 'xn--mgbaam7a8h', 'xn--mgbab2bd',
- 'xn--mgbayh7gpa', 'xn--mgbbh1a71e', 'xn--mgbc0a9azcg',
- 'xn--mgberp4a5d4ar', 'xn--mgbx4cd0ab', 'xn--ngbc5azd',
- 'xn--node', 'xn--nqv7f', 'xn--nqv7fs00ema', 'xn--o3cw4h',
- 'xn--ogbpf8fl', 'xn--p1acf', 'xn--p1ai', 'xn--pgbs0dh',
- 'xn--q9jyb4c', 'xn--qcka1pmc', 'xn--rhqv96g', 'xn--s9brj9c',
- 'xn--ses554g', 'xn--unup4y', 'xn--vermgensberater-ctb',
- 'xn--vermgensberatung-pwb', 'xn--vhquv', 'xn--wgbh1c',
+ 'xbox', 'xerox', 'xfinity', 'xihuan', 'xin', 'xn--11b4c3d',
+ 'xn--1ck2e1b', 'xn--1qqw23a', 'xn--2scrj9c', 'xn--30rr7y',
+ 'xn--3bst00m', 'xn--3ds443g', 'xn--3e0b707e', 'xn--3hcrj9c',
+ 'xn--3oq18vl8pn36a', 'xn--3pxu8k', 'xn--42c2d9a', 'xn--45br5cyl',
+ 'xn--45brj9c', 'xn--45q11c', 'xn--4gbrim', 'xn--54b7fta0cc',
+ 'xn--55qw42g', 'xn--55qx5d', 'xn--5su34j936bgsg', 'xn--5tzm5g',
+ 'xn--6frz82g', 'xn--6qq986b3xl', 'xn--80adxhks', 'xn--80ao21a',
+ 'xn--80aqecdr1a', 'xn--80asehdb', 'xn--80aswg', 'xn--8y0a063a',
+ 'xn--90a3ac', 'xn--90ae', 'xn--90ais', 'xn--9dbq2a',
+ 'xn--9et52u', 'xn--9krt00a', 'xn--b4w605ferd',
+ 'xn--bck1b9a5dre4c', 'xn--c1avg', 'xn--c2br7g', 'xn--cck2b3b',
+ 'xn--cg4bki', 'xn--clchc0ea0b2g2a9gcd', 'xn--czr694b',
+ 'xn--czrs0t', 'xn--czru2d', 'xn--d1acj3b', 'xn--d1alf',
+ 'xn--e1a4c', 'xn--eckvdtc9d', 'xn--efvy88h', 'xn--estv75g',
+ 'xn--fct429k', 'xn--fhbei', 'xn--fiq228c5hs', 'xn--fiq64b',
+ 'xn--fiqs8s', 'xn--fiqz9s', 'xn--fjq720a', 'xn--flw351e',
+ 'xn--fpcrj9c3d', 'xn--fzc2c9e2c', 'xn--fzys8d69uvgm',
+ 'xn--g2xx48c', 'xn--gckr3f0f', 'xn--gecrj9c', 'xn--gk3at1e',
+ 'xn--h2breg3eve', 'xn--h2brj9c', 'xn--h2brj9c8c', 'xn--hxt814e',
+ 'xn--i1b6b1a6a2e', 'xn--imr513n', 'xn--io0a7i', 'xn--j1aef',
+ 'xn--j1amh', 'xn--j6w193g', 'xn--jlq61u9w7b', 'xn--jvr189m',
+ 'xn--kcrx77d1x4a', 'xn--kprw13d', 'xn--kpry57d', 'xn--kpu716f',
+ 'xn--kput3i', 'xn--l1acc', 'xn--lgbbat1ad8j', 'xn--mgb9awbf',
+ 'xn--mgba3a3ejt', 'xn--mgba3a4f16a', 'xn--mgba7c0bbn0a',
+ 'xn--mgbaakc7dvf', 'xn--mgbaam7a8h', 'xn--mgbab2bd',
+ 'xn--mgbai9azgqp6j', 'xn--mgbayh7gpa', 'xn--mgbb9fbpob',
+ 'xn--mgbbh1a', 'xn--mgbbh1a71e', 'xn--mgbc0a9azcg',
+ 'xn--mgbca7dzdo', 'xn--mgberp4a5d4ar', 'xn--mgbgu82a',
+ 'xn--mgbi4ecexp', 'xn--mgbpl2fh', 'xn--mgbt3dhd', 'xn--mgbtx2b',
+ 'xn--mgbx4cd0ab', 'xn--mix891f', 'xn--mk1bu44c', 'xn--mxtq1m',
+ 'xn--ngbc5azd', 'xn--ngbe9e0a', 'xn--ngbrx', 'xn--node',
+ 'xn--nqv7f', 'xn--nqv7fs00ema', 'xn--nyqy26a', 'xn--o3cw4h',
+ 'xn--ogbpf8fl', 'xn--p1acf', 'xn--p1ai', 'xn--pbt977c',
+ 'xn--pgbs0dh', 'xn--pssy2u', 'xn--q9jyb4c', 'xn--qcka1pmc',
+ 'xn--qxam', 'xn--rhqv96g', 'xn--rovu88b', 'xn--rvc1e0am3e',
+ 'xn--s9brj9c', 'xn--ses554g', 'xn--t60b56a', 'xn--tckwe',
+ 'xn--tiq49xqyj', 'xn--unup4y', 'xn--vermgensberater-ctb',
+ 'xn--vermgensberatung-pwb', 'xn--vhquv', 'xn--vuq861b',
+ 'xn--w4r85el8fhu5dnra', 'xn--w4rs40l', 'xn--wgbh1c',
'xn--wgbl6a', 'xn--xhq521b', 'xn--xkc2al3hye2a',
- 'xn--xkc2dl3a5ee0h', 'xn--yfro4i67o', 'xn--ygbi2ammx',
- 'xn--zfr164b', 'xxx', 'xyz',
+ 'xn--xkc2dl3a5ee0h', 'xn--y9a3aq', 'xn--yfro4i67o',
+ 'xn--ygbi2ammx', 'xn--zfr164b', 'xperia', 'xxx', 'xyz',
# y
- 'yachts', 'yandex', 'ye', 'yodobashi', 'yoga', 'yokohama',
- 'youtube', 'yt',
+ 'yachts', 'yahoo', 'yamaxun', 'yandex', 'ye', 'yodobashi',
+ 'yoga', 'yokohama', 'you', 'youtube', 'yt', 'yun',
# z
- 'za', 'zip', 'zm', 'zone', 'zuerich', 'zw'
+ 'za', 'zappos', 'zara', 'zero', 'zip', 'zippo', 'zm', 'zone',
+ 'zuerich', 'zw'
]
diff --git a/scripts/update_languages.py b/scripts/update_languages.py
index 3e94cb36..a918379b 100644
--- a/scripts/update_languages.py
+++ b/scripts/update_languages.py
@@ -18,7 +18,7 @@ from gluon.utf8 import Utf8
from gluon._compat import copyreg, PY2, maketrans, iterkeys, unicodeT, to_unicode, to_bytes, iteritems, to_native, pjoin
from gluon.languages import findT
-# This script can be run with no arguments (which sets the language folder to the current working directory, and default language to English), one argument (which sets the default language), or two arguments (language folder path and default language).
+# This script can be run with no arguments (which sets the application folder to the current working directory, and default language to English), one argument (which sets the default language), or two arguments (application folder path and default language).
# When run, it will update the default language, as well as strip all of the strings found in the non-default languages but not in the default language, and add the strings found in the default language to the non-default languages it is not, making sure translators don't do additional work that will never be used.
def read_dict_aux(filename):
@@ -53,21 +53,21 @@ def write_file(file, contents):
file.close()
def update_languages(cwd, default_lang):
- defaultfp = os.path.join(cwd, '%s.py' %default_lang)
+ defaultfp = os.path.join(cwd, "languages", '%s.py' %default_lang)
findT(cwd, default_lang)
default = read_dict(defaultfp)
- for x in os.listdir(cwd):
- if x == default_lang or x.startswith("plural-"): continue
+ for lang in os.listdir(os.path.join(cwd, "languages")):
+ if lang == default_lang+".py" or lang.startswith("plural-"): continue
- i18n = read_dict(os.path.join(cwd, x))
+ i18n = read_dict(os.path.join(cwd, "languages", lang))
if i18n:
- nd = default
- for k_d1 in i18n:
- if k_d1 in default:
- nd[k_d1] = i18n[k_d1]
- write_file(open(x, 'w'), nd)
- print x
+ new_dict = default
+ for phrase in i18n:
+ if phrase in default:
+ new_dict[phrase] = i18n[phrase]
+ write_file(open(os.path.join(cwd, "languages", lang), 'w'), new_dict)
+ print lang
if __name__ == "__main__":
cwd = os.getcwd()