Skip to content

Commit cac572c

Browse files
babel integration
1 parent 0bba066 commit cac572c

23 files changed

+350
-56
lines changed

Diff for: .gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@
33
app.db
44
search.db
55
flask
6+
*.mo
67

Diff for: app/__init__.py

+3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from flask.ext.login import LoginManager
55
from flask.ext.openid import OpenID
66
from flask.ext.mail import Mail
7+
from flask.ext.babel import Babel, lazy_gettext
78
from config import basedir, ADMINS, MAIL_SERVER, MAIL_PORT, MAIL_USERNAME, MAIL_PASSWORD
89
from momentjs import momentjs
910

@@ -13,8 +14,10 @@
1314
lm = LoginManager()
1415
lm.init_app(app)
1516
lm.login_view = 'login'
17+
lm.login_message = lazy_gettext('Please log in to access this page.')
1618
oid = OpenID(app, os.path.join(basedir, 'tmp'))
1719
mail = Mail(app)
20+
babel = Babel(app)
1821

1922
if not app.debug:
2023
import logging

Diff for: app/forms.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from flask.ext.wtf import Form, TextField, BooleanField, TextAreaField
22
from flask.ext.wtf import Required, Length
3+
from flask.ext.babel import gettext
34
from app.models import User
45

56
class LoginForm(Form):
@@ -19,9 +20,12 @@ def validate(self):
1920
return False
2021
if self.nickname.data == self.original_nickname:
2122
return True
23+
if self.nickname.data != User.make_valid_nickname(self.nickname.data):
24+
self.nickname.errors.append(gettext('This nickname has invalid characters. Please use letters, numbers, dots and underscores only.'))
25+
return False
2226
user = User.query.filter_by(nickname = self.nickname.data).first()
2327
if user != None:
24-
self.nickname.errors.append('This nickname is already in use. Please choose another one.')
28+
self.nickname.errors.append(gettext('This nickname is already in use. Please choose another one.'))
2529
return False
2630
return True
2731

Diff for: app/models.py

+5
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from app import db
33
from app import app
44
import flask.ext.whooshalchemy as whooshalchemy
5+
import re
56

67
ROLE_USER = 0
78
ROLE_ADMIN = 1
@@ -26,6 +27,10 @@ class User(db.Model):
2627
backref = db.backref('followers', lazy = 'dynamic'),
2728
lazy = 'dynamic')
2829

30+
@staticmethod
31+
def make_valid_nickname(nickname):
32+
return re.sub('[^a-zA-Z0-9_\.]', '', nickname)
33+
2934
@staticmethod
3035
def make_unique_nickname(nickname):
3136
if User.query.filter_by(nickname = nickname).first() == None:

Diff for: app/static/js/moment-es.min.js

+4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: app/templates/404.html

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22
{% extends "base.html" %}
33

44
{% block content %}
5-
<h1>File Not Found</h1>
6-
<p><a href="{{url_for('index')}}">Back</a></p>
5+
<h1>{{ _('File Not Found') }}</h1>
6+
<p><a href="{{url_for('index')}}">{{ _('Back') }}</a></p>
77
{% endblock %}

Diff for: app/templates/500.html

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
{% extends "base.html" %}
33

44
{% block content %}
5-
<h1>An unexpected error has occurred</h1>
6-
<p>The administrator has been notified. Sorry for the inconvenience!</p>
7-
<p><a href="{{url_for('index')}}">Back</a></p>
5+
<h1>{{ _('An unexpected error has occurred') }}</h1>
6+
<p>{{ _('The administrator has been notified. Sorry for the inconvenience!') }}</p>
7+
<p><a href="{{url_for('index')}}">{{ _('Back') }}</a></p>
88
{% endblock %}

Diff for: app/templates/base.html

+8-4
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
<script src="http://code.jquery.com/jquery-latest.js"></script>
1212
<script src="/static/js/bootstrap.min.js"></script>
1313
<script src="/static/js/moment.min.js"></script>
14+
{% if g.locale != 'en' %}
15+
<script src="/static/js/moment-{{g.locale}}.min.js"></script>
16+
{% endif %}
1417
<meta name="viewport" content="width=device-width, initial-scale=1.0">
1518
</head>
1619
<body>
@@ -24,15 +27,15 @@
2427
</a>
2528
<a class="brand" href="/">microblog</a>
2629
<ul class="nav">
27-
<li><a href="{{ url_for('index') }}">Home</a></li>
30+
<li><a href="{{ url_for('index') }}">{{ _('Home') }}</a></li>
2831
{% if g.user.is_authenticated() %}
29-
<li><a href="{{ url_for('user', nickname = g.user.nickname) }}">Your Profile</a></li>
30-
<li><a href="{{ url_for('logout') }}">Logout</a></li>
32+
<li><a href="{{ url_for('user', nickname = g.user.nickname) }}">{{ _('Your Profile') }}</a></li>
33+
<li><a href="{{ url_for('logout') }}">{{ _('Logout') }}</a></li>
3134
{% endif %}
3235
</ul>
3336
<div class="nav-collapse collapse">
3437
{% if g.user.is_authenticated() %}
35-
<form class="navbar-search pull-right" action="{{url_for('search')}}" method="post" name="search">{{g.search_form.hidden_tag()}}{{g.search_form.search(size=20,placeholder="Search",class="search-query")}}</form>
38+
<form class="navbar-search pull-right" action="{{url_for('search')}}" method="post" name="search">{{g.search_form.hidden_tag()}}{{g.search_form.search(size=20,placeholder=_('Search'),class="search-query")}}</form>
3639
{% endif %}
3740
</div>
3841
</div>
@@ -45,3 +48,4 @@
4548
</div>
4649
</body>
4750
</html>
51+

Diff for: app/templates/edit.html

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
{% extends "base.html" %}
33

44
{% block content %}
5-
<h1>Edit Your Profile</h1>
5+
<h1>{{ _('Edit Your Profile') }}</h1>
66
{% include 'flash.html' %}
77
<div class="well">
88
<form class="form-horizontal" action="" method="post" name="edit">
99
{{form.hidden_tag()}}
1010
<div class="control-group{% if form.errors.post %} error{% endif %}">
11-
<label class="control-label" for="nickname">Your nickname:</label>
11+
<label class="control-label" for="nickname">{{ _('Your nickname:') }}</label>
1212
<div class="controls">
1313
{{ form.nickname(maxlength = 64, class = "span4") }}
1414
{% for error in form.errors.nickname %}
@@ -17,7 +17,7 @@ <h1>Edit Your Profile</h1>
1717
</div>
1818
</div>
1919
<div class="control-group{% if form.errors.post %} error{% endif %}">
20-
<label class="control-label" for="about_me">About yourself:</label>
20+
<label class="control-label" for="about_me">{{ _('About yourself:') }}</label>
2121
<div class="controls">
2222
{{ form.about_me(cols = 64, rows = 4, class = "span4") }}
2323
{% for error in form.errors.about_me %}
@@ -27,7 +27,7 @@ <h1>Edit Your Profile</h1>
2727
</div>
2828
<div class="control-group">
2929
<div class="controls">
30-
<input class="btn btn-primary" type="submit" value="Save Changes">
30+
<input class="btn btn-primary" type="submit" value="{{ _('Save Changes') }}">
3131
</div>
3232
</div>
3333
</form>

Diff for: app/templates/follower_email.html

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<p>Dear {{user.nickname}},</p>
2-
<p><a href="{{url_for("user", nickname = follower.nickname, _external = True)}}">{{follower.nickname}}</a> is now a follower.</p>
2+
<p>{{ _('%(nickname)s is now a follower.', nickname = '<a href="' + url_for("user", nickname = follower.nickname, _external = True) + '">' + follower.nickname + '</a>') }}</p>
33
<table>
44
<tr valign="top">
55
<td><img src="{{follower.avatar(50)}}"></td>
@@ -9,5 +9,5 @@
99
</td>
1010
</tr>
1111
</table>
12-
<p>Regards,</p>
13-
<p>The <code>microblog</code> admin</p>
12+
<p>{{ _('Regards,') }}</p>
13+
<p>{{ _('The <code>microblog</code> admin') }}</p>

Diff for: app/templates/follower_email.txt

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
Dear {{user.nickname}},
1+
{{ _('Dear %(nickname)s,', nickname = user.nickname) }}
22

3-
{{follower.nickname}} is now a follower. Click on the following link to visit {{follower.nickname}}'s profile page:
3+
{{ _('%(nickname)s is now a follower. Click on the following link to visit %(nickname)s\'s profile page:', nickname = follower.nickname) }}
44

55
{{url_for("user", nickname = follower.nickname, _external = True)}}
66

7-
Regards,
7+
{{ _('Regards,') }}
88

9-
The microblog admin
9+
{{ _('The microblog admin') }}

Diff for: app/templates/index.html

+8-8
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
{% extends "base.html" %}
33

44
{% block content %}
5-
<h1>Hi, {{g.user.nickname}}!</h1>
5+
<h1>{{ _('Hi, %(nickname)s!', nickname = g.user.nickname) }}</h1>
66
{% include 'flash.html' %}
77
<div class="well">
88
<form class="form-horizontal" action="" method="post" name="post">
99
{{form.hidden_tag()}}
1010
<div class="control-group{% if form.errors.post %} error{% endif %}">
11-
<label class="control-label" for="post">Say something:</label>
11+
<label class="control-label" for="post">{{ _('Say something:') }}</label>
1212
<div class="controls">
1313
{{ form.post(size = 30, maxlength = 140) }}
1414
{% for error in form.errors.post %}
@@ -18,7 +18,7 @@ <h1>Hi, {{g.user.nickname}}!</h1>
1818
</div>
1919
<div class="control-group">
2020
<div class="controls">
21-
<input class="btn btn-primary" type="submit" value="Post!">
21+
<input class="btn btn-primary" type="submit" value="{{ _('Post!') }}">
2222
</div>
2323
</div>
2424
</form>
@@ -28,14 +28,14 @@ <h1>Hi, {{g.user.nickname}}!</h1>
2828
{% endfor %}
2929
<ul class="pager">
3030
{% if posts.has_prev %}
31-
<li class="previous"><a href="{{ url_for('index', page = posts.prev_num) }}">Newer posts</a></li>
31+
<li class="previous"><a href="{{ url_for('index', page = posts.prev_num) }}">{{ _('Newer posts') }}</a></li>
3232
{% else %}
33-
<li class="previous disabled"><a href="#">Newer posts</a></li>
33+
<li class="previous disabled"><a href="#">{{ _('Newer posts') }}</a></li>
3434
{% endif %}
3535
{% if posts.has_next %}
36-
<li class="next"><a href="{{ url_for('index', page = posts.next_num) }}">Older posts</a></li>
36+
<li class="next"><a href="{{ url_for('index', page = posts.next_num) }}">{{ _('Older posts') }}</a></li>
3737
{% else %}
38-
<li class="next disabled"><a href="#">Older posts</a></li>
38+
<li class="next disabled"><a href="#">{{ _('Older posts') }}</a></li>
3939
{% endif %}
4040
</ul>
41-
{% endblock %}
41+
{% endblock %}

Diff for: app/templates/login.html

+5-5
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,17 @@
1717
</script>
1818
{% include 'flash.html' %}
1919
<div class="well">
20-
<h3>Please Sign In</h3>
20+
<h3>{{ _('Please Sign In') }}</h3>
2121
<form class="form" action="" method="post" name="login">
2222
{{form.hidden_tag()}}
23-
<div class="help-block">Click on your OpenID provider below:</div>
23+
<div class="help-block">{{ _('Click on your OpenID provider below:') }}</div>
2424
<div class="control-group">
2525
{% for pr in providers %}
2626
<a href="javascript:set_openid('{{pr.url}}', '{{pr.name}}');"><img src="/static/img/{{pr.name.lower()}}.png" class="img-polaroid" style="margin:2px;" /></a>
2727
{% endfor %}
2828
</div>
2929
<div class="control-group{% if form.errors.openid %} error{% endif %}">
30-
<label class="control-label" for="openid">Or enter your OpenID here:</label>
30+
<label class="control-label" for="openid">{{ _('Or enter your OpenID here:') }}</label>
3131
<div class="controls">
3232
{{ form.openid(size = 80, class = "span4") }}
3333
{% for error in form.errors.openid %}
@@ -38,13 +38,13 @@ <h3>Please Sign In</h3>
3838
<div class="control-group">
3939
<div class="controls">
4040
<label class="checkbox" for="remember_me">
41-
{{ form.remember_me }} Remember Me
41+
{{ form.remember_me }} {{ _('Remember Me') }}
4242
</label>
4343
</div>
4444
</div>
4545
<div class="control-group">
4646
<div class="controls">
47-
<input class="btn btn-primary" type="submit" value="Sign In">
47+
<input class="btn btn-primary" type="submit" value="{{ _('Sign In') }}">
4848
</div>
4949
</div>
5050
</form>

Diff for: app/templates/post.html

+3-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
<tr>
33
<td width="70px"><a href="{{url_for('user', nickname = post.author.nickname)}}"><img src="{{post.author.avatar(70)}}" /></a></td>
44
<td>
5-
<p><a href="{{url_for('user', nickname = post.author.nickname)}}">{{post.author.nickname}}</a> said {{momentjs(post.timestamp).fromNow()}}:</p>
5+
{% autoescape false %}
6+
<p>{{ _('%(nickname)s said %(when)s:', nickname = '<a href="%s">%s</a>' % (url_for('user', nickname = post.author.nickname), post.author.nickname), when = momentjs(post.timestamp).fromNow()) }}</p>
7+
{% endautoescape %}
68
<p><strong>{{post.body}}</strong></p>
79
</td>
810
</tr>

Diff for: app/templates/search_results.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
{% extends "base.html" %}
33

44
{% block content %}
5-
<h1>Search results for "{{query}}":</h1>
5+
<h1>{{ _('Search results for "%(query)s":', query = query) }}</h1>
66
{% include 'flash.html' %}
77
{% for post in results %}
88
{% include 'post.html' %}

Diff for: app/templates/user.html

+9-9
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@
1010
<h1>{{user.nickname}}</h1>
1111
{% if user.about_me %}<p>{{user.about_me}}</p>{% endif %}
1212
{% if user.last_seen %}
13-
<p><em>Last seen: {{momentjs(user.last_seen).calendar()}}</em></p>
13+
<p><em>{{ _('Last seen:') }} {{ momentjs(user.last_seen).calendar() }}</em></p>
1414
{% endif %}
15-
<p>Followers: {{user.followers.count() - 1}} | Following: {{user.followed.count() - 1}} |
15+
<p>{{ _('Followers:') }} {{user.followers.count() - 1}} | {{ _('Following:') }} {{user.followed.count() - 1}} |
1616
{% if user.id == g.user.id %}
17-
<a href="{{url_for('edit')}}">Edit your profile</a>
17+
<a href="{{url_for('edit')}}">{{ _('Edit your profile') }}</a>
1818
{% elif not g.user.is_following(user) %}
19-
<a href="{{url_for('follow', nickname = user.nickname)}}">Follow</a>
19+
<a href="{{url_for('follow', nickname = user.nickname)}}">{{ _('Follow') }}</a>
2020
{% else %}
21-
<a href="{{url_for('unfollow', nickname = user.nickname)}}">Unfollow</a>
21+
<a href="{{url_for('unfollow', nickname = user.nickname)}}">{{ _('Unfollow') }}</a>
2222
{% endif %}
2323
</p>
2424
</div>
@@ -27,14 +27,14 @@ <h1>{{user.nickname}}</h1>
2727
{% endfor %}
2828
<ul class="pager">
2929
{% if posts.has_prev %}
30-
<li class="previous"><a href="{{ url_for('user', nickname = user.nickname, page = posts.prev_num) }}">Newer posts</a></li>
30+
<li class="previous"><a href="{{ url_for('user', nickname = user.nickname, page = posts.prev_num) }}">{{ _('Newer posts') }}</a></li>
3131
{% else %}
32-
<li class="previous disabled"><a href="#">Newer posts</a></li>
32+
<li class="previous disabled"><a href="#">{{ _('Newer posts') }}</a></li>
3333
{% endif %}
3434
{% if posts.has_next %}
35-
<li class="next"><a href="{{ url_for('user', nickname = user.nickname, page = posts.next_num) }}">Older posts</a></li>
35+
<li class="next"><a href="{{ url_for('user', nickname = user.nickname, page = posts.next_num) }}">{{ _('Older posts') }}</a></li>
3636
{% else %}
37-
<li class="next disabled"><a href="#">Older posts</a></li>
37+
<li class="next disabled"><a href="#">{{ _('Older posts') }}</a></li>
3838
{% endif %}
3939
</ul>
4040
{% endblock %}

0 commit comments

Comments
 (0)