= Bug #427486 = Migrate product-translations.pt and project-translations.pt pages to 3.0 layout with mostly mechanical changes. Xmllint reports problem in a page I have touched just so it doesn't OOPS, which is not migrated yet (next step), so that's where I'll fix xmllint issues as well. == Proposed fix == 1. https://translations.launchpad.dev/gnome (project page) * Move permissions display and settings inline * Add untranslated applications next to translated applications (this is just a very minor step, which is why changes are considered 'mechanical': in the future, this page should aggregate statistics over all translatable projects) 2. https://translations.launchpad.dev/evolution https://translations.launchpad.dev/firefox (not using translations, strictly mechanical changes) * Move 'translation focus' (direct link, and upload and download links for those who can see them) inline. * Move 'import queue' link inline. * Move permissions display and settings inline (reuse the same portlet) * Use two column layout and list all translatable series on the top of the page (people had trouble to find these when they were at the bottom) * For those who manage translations for this project, also show a list of all series which do not have translations with direct links on how they can set them up == Tests == Strictly relevant tests: bin/test -vvt xx-productseries-translation-export.txt -t xx-product-export.txt -t xx-project-translations.txt -t xx-product-translations.txt -t xx-translation-import-queue-targets.txt -t stories.translationgroups But basically, all translations tests cover this: bin/test -vvt 'translations.*stories' == Demo and Q/A == https://translations.launchpad.dev/gnome https://translations.launchpad.dev/evolution https://translations.launchpad.dev/firefox = 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/project.py lib/lp/translations/browser/configure.zcml lib/lp/translations/stories/standalone/xx-product-translations.txt lib/lp/translations/stories/translationgroups/20-project-translationgroup.txt lib/lp/translations/stories/standalone/xx-product-export.txt lib/lp/translations/templates/hastranslationgroup-portlet-translation-groups-and-permission.pt lib/lp/translations/templates/productseries-translations.pt lib/lp/translations/templates/product-translations.pt lib/lp/translations/browser/product.py lib/lp/translations/templates/project-translations.pt lib/lp/translations/stories/productseries/xx-productseries-translation-export.txt lib/lp/translations/stories/importqueue/xx-translation-import-queue-targets.txt lib/lp/translations/stories/translationgroups/46-test-distro-structured-permissions.txt lib/lp/translations/templates/product-portlet-translatables.pt lib/lp/translations/templates/productseries-translations-languages.pt lib/lp/translations/stories/translationgroups/15-product-translation-group.txt lib/lp/translations/stories/project/xx-project-translations.txt == XmlLint notices == lib/lp/translations/templates/productseries-translations.pt 89: parser error : Opening and ending tag mismatch: p line 60 and tal:languages ^ 90: parser error : Opening and ending tag mismatch: languages line 59 and div ^ 91: parser error : Opening and ending tag mismatch: div line 13 and body ^ 92: parser error : Opening and ending tag mismatch: body line 12 and html ^ 93: parser error : Premature end of data in tag html line 1 ^