Merge lp:~ursinha/launchpad/bug-418345-language-index-migration into lp:launchpad

Proposed by Guilherme Salgado
Status: Merged
Merged at revision: not available
Proposed branch: lp:~ursinha/launchpad/bug-418345-language-index-migration
Merge into: lp:launchpad
Diff against target: None lines
To merge this branch: bzr merge lp:~ursinha/launchpad/bug-418345-language-index-migration
Reviewer Review Type Date Requested Status
Guilherme Salgado (community) Approve
Review via email: mp+10857@code.launchpad.net

This proposal supersedes a proposal from 2009-08-28.

To post a comment you must log in.
Revision history for this message
Ursula Junque (ursinha) wrote : Posted in a previous version of this proposal

= Summary =

This branch migrates the template of language-index page to the new format.
The bug that's tracking this change is bug 418345.
It also has a fix for test_translationlinksaggregator, that was relying on the database data order and started to fail.
I've added a 3-line fix for bug 404898, because it wasn't worthy creating a separated branch for it. Besides, the fix is related to the main change here, that's bug 418345.

== Pre-implementation notes ==

It was discussed with rockstar about how to deal with the context menu now, and he said we should now use NavigationMenu instead of ContextMenu. So, considering nothing else in translations was using LanguageContextMenu, I've changed this to inherit NavigationMenu, and renamed it to LanguageNavigationMenu.

== Tests ==

This should test all changes, including a fix for test_translationlinksaggregator:
 bin/test -vvt lp.translations.*

To test specifically the template migration changes:
 bin/test -vvt xx-language

== Demo and Q/A ==

To check the changed pages, go to:
 - https://translations.launchpad.dev/+languages/us
 As a regular user you should see the changed layout.
 As an admin user, you should also be able to see the 'Administer' link as well, in the new format.

= Launchpad lint =

Checking for conflicts. and issues in doctests and templates.
Running jslint, xmllint, pyflakes, and pylint.
Using normal rules.

Linting changed files:
 lib/lp/translations/browser/configure.zcml
 lib/lp/translations/browser/tests/language-views.txt
 lib/lp/translations/browser/language.py
 lib/lp/translations/browser/tests/test_translationlinksaggregator.py
 lib/lp/translations/templates/language-index.pt
 lib/lp/translations/stories/standalone/xx-language.txt
 lib/lp/translations/templates/language-portlet-top-contributors.pt

Revision history for this message
Guilherme Salgado (salgado) wrote : Posted in a previous version of this proposal
Download full text (12.0 KiB)

Hi Ursula,

This looks good, but there are a few stylistic issues that need fixing,
so I'm just giving you some quick feedback, so that you can do these
changes with any other changes that come up during the UI review of
this.

 review needs-fixing

On Fri, 2009-08-28 at 13:15 +0000, Ursula Junque wrote:
> = Summary =
>
> This branch migrates the template of language-index page to the new
> format.
> The bug that's tracking this change is bug 418345.
> It also has a fix for test_translationlinksaggregator, that was
> relying on the database data order and started to fail.
> I've added a 3-line fix for bug 404898, because it wasn't worthy
> creating a separated branch for it. Besides, the fix is related to the
> main change here, that's bug 418345.
>
>
> == Pre-implementation notes ==
>
> It was discussed with rockstar about how to deal with the context menu
> now, and he said we should now use NavigationMenu instead of
> ContextMenu. So, considering nothing else in translations was using
> LanguageContextMenu, I've changed this to inherit NavigationMenu, and
> renamed it to LanguageNavigationMenu.
>
>
> == Tests ==
>
> This should test all changes, including a fix for
> test_translationlinksaggregator:
> bin/test -vvt lp.translations.*
>
> To test specifically the template migration changes:
> bin/test -vvt xx-language
>
>
> == Demo and Q/A ==
>
> To check the changed pages, go to:
> - https://translations.launchpad.dev/+languages/us
> As a regular user you should see the changed layout.
> As an admin user, you should also be able to see the 'Administer'
> link as well, in the new format.

> === modified file 'lib/lp/translations/stories/standalone/xx-language.txt'
> --- lib/lp/translations/stories/standalone/xx-language.txt 2009-07-01 20:45:39 +0000
> +++ lib/lp/translations/stories/standalone/xx-language.txt 2009-08-28 09:10:18 +0000
> @@ -89,15 +89,16 @@
> >>> print browser.url
> http://translations.launchpad.dev/+languages/es
>
> - >>> pluralforms_portlet = find_portlet(browser.contents, 'Plural Forms')
> + >>> pluralforms_portlet = find_portlet(browser.contents, 'Plural forms')
> >>> print pluralforms_portlet
> - <...
> - The amount of plural forms for Spanish is: 2
> + <div ...
> ...
> - And its default plural form expression is:
> + There are 2
> + plural forms for Spanish.

Our test suite runs with the NORMALIZE_WHITESPACE [1] option turned on,
so you can join the two lines above and trim it to make the test a bit
more readable.

[1] http://www.python.org/doc/2.5.2/lib/doctest-options.html

> ...
> <pre>n != 1</pre>
> ...
> + </div>

Why do you want to show that this is inside a <div> now?

>
> >>> translationteams_portlet = find_portlet(
> ... browser.contents, 'Translation teams')
>
> === modified file 'lib/lp/translations/templates/language-index.pt'
> --- lib/lp/translations/templates/language-index.pt 2009-07-17 17:59:07 +0000
> +++ lib/lp/translations/templates/language-index.pt 2009-08-28 10:29:18 +0000
> @@ -3,99 +3,75 @@
> xmlns:tal="http://xml.zope.org/namespaces/tal"
...

review: Needs Fixing
Revision history for this message
Barry Warsaw (barry) wrote : Posted in a previous version of this proposal

The language 'us' gives me a NotFound but 'en' works just fine and the ui looks great. You'll need a second mentat ui review. ui=me*

review: Approve (ui)
Revision history for this message
Ursula Junque (ursinha) wrote : Posted in a previous version of this proposal

> = Summary =
>
> This branch migrates the template of language-index page to the new format.
> The bug that's tracking this change is bug 418345.
> It also has a fix for test_translationlinksaggregator, that was relying on the
> database data order and started to fail.
> I've added a 3-line fix for bug 404898, because it wasn't worthy creating a
> separated branch for it. Besides, the fix is related to the main change here,
> that's bug 418345.
>
>
> == Pre-implementation notes ==
>
> It was discussed with rockstar about how to deal with the context menu now,
> and he said we should now use NavigationMenu instead of ContextMenu. So,
> considering nothing else in translations was using LanguageContextMenu, I've
> changed this to inherit NavigationMenu, and renamed it to
> LanguageNavigationMenu.
>
>
> == Tests ==
>
> This should test all changes, including a fix for
> test_translationlinksaggregator:
> bin/test -vvt lp.translations.*
>
> To test specifically the template migration changes:
> bin/test -vvt xx-language
>
>
> == Demo and Q/A ==
>
> To check the changed pages, go to:
> - https://translations.launchpad.dev/+languages/us

I'm sorry, the correct language is 'en'. This makes the correct link:
 - https://translations.launchpad.dev/+languages/en

> As a regular user you should see the changed layout.
> As an admin user, you should also be able to see the 'Administer' link as
> well, in the new format.
>
>
> = Launchpad lint =
>
> Checking for conflicts. and issues in doctests and templates.
> Running jslint, xmllint, pyflakes, and pylint.
> Using normal rules.
>
> Linting changed files:
> lib/lp/translations/browser/configure.zcml
> lib/lp/translations/browser/tests/language-views.txt
> lib/lp/translations/browser/language.py
> lib/lp/translations/browser/tests/test_translationlinksaggregator.py
> lib/lp/translations/templates/language-index.pt
> lib/lp/translations/stories/standalone/xx-language.txt
> lib/lp/translations/templates/language-portlet-top-contributors.pt

Revision history for this message
Ursula Junque (ursinha) wrote : Posted in a previous version of this proposal
Download full text (13.0 KiB)

> Hi Ursula,
>
> This looks good, but there are a few stylistic issues that need fixing,
> so I'm just giving you some quick feedback, so that you can do these
> changes with any other changes that come up during the UI review of
> this.
>
> review needs-fixing
>
> On Fri, 2009-08-28 at 13:15 +0000, Ursula Junque wrote:
> > = Summary =
> >
> > This branch migrates the template of language-index page to the new
> > format.
> > The bug that's tracking this change is bug 418345.
> > It also has a fix for test_translationlinksaggregator, that was
> > relying on the database data order and started to fail.
> > I've added a 3-line fix for bug 404898, because it wasn't worthy
> > creating a separated branch for it. Besides, the fix is related to the
> > main change here, that's bug 418345.
> >
> >
> > == Pre-implementation notes ==
> >
> > It was discussed with rockstar about how to deal with the context menu
> > now, and he said we should now use NavigationMenu instead of
> > ContextMenu. So, considering nothing else in translations was using
> > LanguageContextMenu, I've changed this to inherit NavigationMenu, and
> > renamed it to LanguageNavigationMenu.
> >
> >
> > == Tests ==
> >
> > This should test all changes, including a fix for
> > test_translationlinksaggregator:
> > bin/test -vvt lp.translations.*
> >
> > To test specifically the template migration changes:
> > bin/test -vvt xx-language
> >
> >
> > == Demo and Q/A ==
> >
> > To check the changed pages, go to:
> > - https://translations.launchpad.dev/+languages/us
> > As a regular user you should see the changed layout.
> > As an admin user, you should also be able to see the 'Administer'
> > link as well, in the new format.
>
> > === modified file 'lib/lp/translations/stories/standalone/xx-language.txt'
> > --- lib/lp/translations/stories/standalone/xx-language.txt 2009-07-01
> 20:45:39 +0000
> > +++ lib/lp/translations/stories/standalone/xx-language.txt 2009-08-28
> 09:10:18 +0000
> > @@ -89,15 +89,16 @@
> > >>> print browser.url
> > http://translations.launchpad.dev/+languages/es
> >
> > - >>> pluralforms_portlet = find_portlet(browser.contents, 'Plural
> Forms')
> > + >>> pluralforms_portlet = find_portlet(browser.contents, 'Plural
> forms')
> > >>> print pluralforms_portlet
> > - <...
> > - The amount of plural forms for Spanish is: 2
> > + <div ...
> > ...
> > - And its default plural form expression is:
> > + There are 2
> > + plural forms for Spanish.
>
> Our test suite runs with the NORMALIZE_WHITESPACE [1] option turned on,
> so you can join the two lines above and trim it to make the test a bit
> more readable.
>
> [1] http://www.python.org/doc/2.5.2/lib/doctest-options.html

Thanks for the information. Fixed.

>
> > ...
> > <pre>n != 1</pre>
> > ...
> > + </div>
>
> Why do you want to show that this is inside a <div> now?

I didn't, fixed.

>
> >
> > >>> translationteams_portlet = find_portlet(
> > ... browser.contents, 'Translation teams')
> >
> > === modified file 'lib/lp/translations/templates/language-index.pt'
> > --- lib/lp/transla...

review: Needs Resubmitting
Revision history for this message
Edwin Grubbs (edwin-grubbs) wrote : Posted in a previous version of this proposal

ui=me

review: Approve (ui)
Revision history for this message
Guilherme Salgado (salgado) wrote :

with the few changes we discussed on IRC, r=me

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lib/lp/translations/browser/configure.zcml'
2--- lib/lp/translations/browser/configure.zcml 2009-08-25 16:52:31 +0000
3+++ lib/lp/translations/browser/configure.zcml 2009-08-28 01:59:32 +0000
4@@ -295,7 +295,7 @@
5 module="lp.translations.browser.language"
6 classes="
7 LanguageSetContextMenu
8- LanguageContextMenu"/>
9+ LanguageNavigationMenu"/>
10 <browser:url
11 for="canonical.launchpad.interfaces.ILanguage"
12 path_expression="code"
13
14=== modified file 'lib/lp/translations/browser/language.py'
15--- lib/lp/translations/browser/language.py 2009-08-24 13:50:42 +0000
16+++ lib/lp/translations/browser/language.py 2009-08-28 09:27:25 +0000
17@@ -6,7 +6,6 @@
18 __metaclass__ = type
19 __all__ = [
20 'LanguageAddView',
21- 'LanguageContextMenu',
22 'LanguageAdminView',
23 'LanguageSetContextMenu',
24 'LanguageSetNavigation',
25@@ -25,7 +24,7 @@
26 from lp.translations.browser.translations import TranslationsMixin
27 from canonical.launchpad.webapp import (
28 GetitemNavigation, LaunchpadView, LaunchpadFormView,
29- LaunchpadEditFormView, action, canonical_url, ContextMenu,
30+ LaunchpadEditFormView, action, canonical_url, ContextMenu, NavigationMenu,
31 enabled_with_permission, Link, custom_widget)
32
33 from canonical.widgets import LabeledMultiCheckBoxWidget
34@@ -44,8 +43,9 @@
35 return Link('+add', text, icon='add')
36
37
38-class LanguageContextMenu(ContextMenu):
39+class LanguageNavigationMenu(NavigationMenu):
40 usedfor = ILanguage
41+ facet = 'translations'
42 links = ['administer']
43
44 @enabled_with_permission('launchpad.Admin')
45
46=== modified file 'lib/lp/translations/browser/tests/language-views.txt'
47--- lib/lp/translations/browser/tests/language-views.txt 2009-08-24 13:49:14 +0000
48+++ lib/lp/translations/browser/tests/language-views.txt 2009-08-28 06:48:47 +0000
49@@ -10,25 +10,25 @@
50
51 >>> language_set = getUtility(ILanguageSet)
52 >>> language = language_set.getLanguageByCode('pt_BR')
53- >>> language_view = create_view(
54+ >>> language_admin_view = create_view(
55 ... language, '+admin', layer=TranslationsLayer)
56- >>> language_view.initialize()
57+ >>> language_admin_view.initialize()
58
59 The language +admin view provides a label and a page_title for the page.
60
61- >>> print language_view.label
62+ >>> print language_admin_view.label
63 Edit Portuguese (Brazil) in Launchpad
64
65- >>> print language_view.page_title
66+ >>> print language_admin_view.page_title
67 Edit Portuguese (Brazil) (pt_BR)
68
69 The view provides also a cancel_url and a next_url, but they're the same because
70 the previous and next steps of editing a language are returning to its index.
71
72- >>> print language_view.cancel_url
73+ >>> print language_admin_view.cancel_url
74 http://translations.launchpad.dev/+languages/pt_BR
75
76- >>> print language_view.next_url
77+ >>> print language_admin_view.next_url
78 http://translations.launchpad.dev/+languages/pt_BR
79
80
81@@ -73,4 +73,3 @@
82 >>> print language_add_view.next_url
83 http://translations.launchpad.dev/+languages/lp_US
84
85-
86
87=== modified file 'lib/lp/translations/browser/tests/test_translationlinksaggregator.py'
88--- lib/lp/translations/browser/tests/test_translationlinksaggregator.py 2009-08-25 10:35:29 +0000
89+++ lib/lp/translations/browser/tests/test_translationlinksaggregator.py 2009-08-28 08:01:51 +0000
90@@ -224,7 +224,7 @@
91 (product, canonical_url(product_pofile), [product_pofile]),
92 (package, canonical_url(package_pofile), [package_pofile]),
93 ]
94- self.assertEqual(expected, descriptions)
95+ self.assertContentEqual(expected, descriptions)
96
97 def test_aggregate_bundles_productseries(self):
98 # _aggregateTranslationTargets describes POFiles for the same
99
100=== modified file 'lib/lp/translations/stories/standalone/xx-language.txt'
101--- lib/lp/translations/stories/standalone/xx-language.txt 2009-07-01 20:45:39 +0000
102+++ lib/lp/translations/stories/standalone/xx-language.txt 2009-08-28 15:43:29 +0000
103@@ -89,12 +89,11 @@
104 >>> print browser.url
105 http://translations.launchpad.dev/+languages/es
106
107- >>> pluralforms_portlet = find_portlet(browser.contents, 'Plural Forms')
108+ >>> pluralforms_portlet = find_portlet(browser.contents, 'Plural forms')
109 >>> print pluralforms_portlet
110- <...
111- The amount of plural forms for Spanish is: 2
112+ <div ...
113 ...
114- And its default plural form expression is:
115+ There are 2 plural forms for Spanish.
116 ...
117 <pre>n != 1</pre>
118 ...
119
120=== modified file 'lib/lp/translations/templates/language-index.pt'
121--- lib/lp/translations/templates/language-index.pt 2009-07-17 17:59:07 +0000
122+++ lib/lp/translations/templates/language-index.pt 2009-08-28 15:42:38 +0000
123@@ -3,39 +3,12 @@
124 xmlns:tal="http://xml.zope.org/namespaces/tal"
125 xmlns:metal="http://xml.zope.org/namespaces/metal"
126 xmlns:i18n="http://xml.zope.org/namespaces/i18n"
127- xml:lang="en"
128- lang="en"
129- dir="ltr"
130- metal:use-macro="context/@@main_template/master"
131 i18n:domain="launchpad"
132+ metal:use-macro="view/macro:page/main_side"
133 >
134- <body>
135- <metal:leftportlets fill-slot="portlets_one">
136- <div tal:replace="structure context/@@+portlet-details" />
137- </metal:leftportlets>
138-
139- <div metal:fill-slot="help">
140- <p>
141- Here you see the information we have available about this language.
142- </p>
143-
144- <p>
145- If you see anything wrong with this information, please see whether it's
146- already been brought up in the
147- <a tal:attributes="href view/answers_url">Answers</a> application.
148- If not, please file a question there.
149- </p>
150-
151- <ul class="info">
152- <li>
153- <a href="https://help.launchpad.net/RosettaFAQ"
154- >Frequently asked questions</a>
155- </li>
156- </ul>
157- </div>
158-
159- <div metal:fill-slot="main">
160- <h1>Overview of
161+<body>
162+ <h1 metal:fill-slot="heading">
163+ Overview of
164 <tal:has_nativename condition="context/nativename">
165 <tal:nativename replace="context/nativename">
166 Espa&ntilde;ol
167@@ -43,47 +16,41 @@
168 </tal:has_nativename>
169 <tal:englishname replace="context/englishname">Spain</tal:englishname>
170 <tal:has_nativename condition="context/nativename">)</tal:has_nativename>
171- in Launchpad.
172- </h1>
173-
174- <tal:not-visible condition="not:context/visible">
175- This language is not usually displayed in lists of languages. You will
176- have to select it specially in your <a href="/+editmylanguages">language
177- preferences</a> in order to see it.
178- </tal:not-visible>
179-
180- <div class="left">
181- <div class="section">
182+ in Launchpad
183+ </h1>
184+
185+ <tal:side metal:fill-slot="side">
186+ <div tal:replace="structure context/@@+global-actions" />
187+ <div tal:replace="structure context/@@+portlet-details" />
188+ </tal:side>
189+
190+
191+ <tal:main metal:fill-slot="main">
192+ <div class="yui-g">
193+ <div class="yui-u first">
194 <div class="portlet">
195- <h2>Plural Forms</h2>
196- <p>
197- When translating into this language, you need to be able to
198- express plural forms effectively. The plural form expression tells
199- the translation system when to use each plural form. For example,
200- some languages express the idea of "zero objects" differently to
201- "one object" or "more than ten objects". In these cases, the
202- plural form expression captures the information needed to know
203- which form to use based on the number in question.
204- </p>
205+ <h2>Plural forms</h2>
206 <tal:has_pluralforms condition="context/pluralexpression">
207 <p>
208- The amount of plural forms for
209- <tal:language replace="view/language_name">
210- Espa&ntilde;ol
211- </tal:language>
212- is:
213- <tal:pluralforms replace="context/pluralforms">
214- 2
215- </tal:pluralforms>
216- </p>
217- <p>
218- And its default plural form expression is:
219- </p>
220- <p>
221+ There are <tal:pluralforms replace="context/pluralforms">2</tal:pluralforms>
222+ plural forms for <tal:language replace="view/language_name">Espa&ntilde;ol</tal:language>.
223+ </p>
224+ <p>
225+ The default plural form expression for <tal:language replace="view/language_name">Espa&ntilde;ol</tal:language> is:
226 <pre tal:content="context/pluralexpression">
227 n != 1
228 </pre>
229 </p>
230+ <p></p>
231+ <p>
232+ When translating into this language, you need to be able to
233+ express plural forms effectively. The plural form expression tells
234+ the translation system when to use each plural form. For example,
235+ some languages express the idea of "zero objects" differently to
236+ "one object" or "more than ten objects". In these cases, the
237+ plural form expression captures the information needed to know
238+ which form to use based on the number in question.
239+ </p>
240 </tal:has_pluralforms>
241 <tal:has_not_pluralforms condition="not:context/pluralexpression">
242 <p class="helpwanted">
243@@ -95,7 +62,14 @@
244 </tal:has_not_pluralforms>
245 </div>
246 </div>
247- <div class="section">
248+
249+ <div class="yui-u">
250+ <div tal:content="structure context/@@+portlet-top-contributors" />
251+ </div>
252+ </div>
253+
254+ <div class="yui-g">
255+ <div class="first yui-u">
256 <div class="portlet">
257 <h2>Translation teams</h2>
258 <p tal:condition="view/translation_teams">
259@@ -110,25 +84,25 @@
260 <tr tal:repeat="expert_info view/translation_teams">
261 <td>
262 <img tal:condition="expert_info/expert/isTeam"
263- src="/@@/team" />
264+ src="/@@/team" />
265 <img tal:condition="not:expert_info/expert/isTeam"
266- src="/@@/person" />
267+ src="/@@/person" />
268 </td>
269 <td>
270 <div>
271 <a
272- tal:attributes="
273- href expert_info/expert/fmt:url;
274- title expert_info/expert/displayname/fmt:shorten/80"
275- tal:content="expert_info/expert/displayname"
276- >Expert name</a>(
277- <tal:groups repeat="group expert_info/groups">
278- <a tal:attributes="
279- href group/fmt:url;
280- title group/title/fmt:shorten/80"
281- tal:content="group/title"
282- >Translation group title</a>
283- </tal:groups>)
284+ tal:attributes="
285+ href expert_info/expert/fmt:url;
286+ title expert_info/expert/displayname/fmt:shorten/80"
287+ tal:content="expert_info/expert/displayname"
288+ >Expert name</a>(
289+ <tal:groups repeat="group expert_info/groups">
290+ <a tal:attributes="
291+ href group/fmt:url;
292+ title group/title/fmt:shorten/80"
293+ tal:content="group/title"
294+ >Translation group title</a>
295+ </tal:groups>)
296 </div>
297 </td>
298 </tr>
299@@ -141,9 +115,8 @@
300 </p>
301 </div>
302 </div>
303- </div>
304- <div class="right">
305- <div class="section">
306+
307+ <div class="yui-u">
308 <div class="portlet">
309 <h2>Countries</h2>
310 <tal:has_countries condition="context/countries">
311@@ -151,29 +124,31 @@
312 <tal:language replace="view/language_name">
313 Espa&ntilde;ol
314 </tal:language>
315- is registered as being spoken in the following countries:
316+ is registered as being spoken in the following countries:
317 </p>
318 <ul>
319 <li tal:repeat="country context/countries"
320- tal:content="country/name">Spain</li>
321+ tal:content="country/name">Spain</li>
322 </ul>
323 </tal:has_countries>
324 <tal:has_not_countries condition="not:context/countries">
325- <p class="helpwanted">
326- <tal:language replace="view/language_name">
327- Espa&ntilde;ol
328- </tal:language>
329- is not registered as being spoken in any country. If you know
330- about a country that officially speaks this language, please
331- open a <a href="/rosetta/+addticket">ticket</a> with that
332- information, so we can add it to Launchpad.
333- </p>
334+ <p class="helpwanted">
335+ <tal:language replace="view/language_name">
336+ Espa&ntilde;ol
337+ </tal:language>
338+ is not registered as being spoken in any country. If you know
339+ about a country that officially speaks this language, please
340+ open a <a href="/rosetta/+addticket">ticket</a> with that
341+ information, so we can add it to Launchpad.
342+ </p>
343 </tal:has_not_countries>
344 </div>
345 </div>
346- <div class="section"
347- tal:content="structure context/@@+portlet-top-contributors" />
348+
349 </div>
350- </div>
351- </body>
352+
353+ </tal:main>
354+
355+
356+</body>
357 </html>
358
359=== modified file 'lib/lp/translations/templates/language-portlet-top-contributors.pt'
360--- lib/lp/translations/templates/language-portlet-top-contributors.pt 2009-07-17 17:59:07 +0000
361+++ lib/lp/translations/templates/language-portlet-top-contributors.pt 2009-08-28 15:40:27 +0000
362@@ -13,10 +13,9 @@
363 Espa&ntilde;ol
364 </tal:language_name>:
365 </p>
366- <ul class="person">
367+ <ul>
368 <li tal:repeat="contributor view/getTopContributors">
369- <a tal:content="contributor/displayname"
370- tal:attributes="href contributor/fmt:url">Guilherme Salgado</a>
371+ <a tal:replace="structure contributor/fmt:link">Guilherme Salgado</a>
372 </li>
373 </ul>
374 </div>