{"action":"created","issue":{"url":"https://api.github.com/repos/freedomofpress/securedrop/issues/1103","repository_url":"https://api.github.com/repos/freedomofpress/securedrop","labels_url":"https://api.github.com/repos/freedomofpress/securedrop/issues/1103/labels{/name}","comments_url":"https://api.github.com/repos/freedomofpress/securedrop/issues/1103/comments","events_url":"https://api.github.com/repos/freedomofpress/securedrop/issues/1103/events","html_url":"https://github.com/freedomofpress/securedrop/pull/1103","id":104782226,"number":1103,"title":"Pybabel and German translations","user":{"login":"heartsucker","id":3998464,"avatar_url":"https://avatars.githubusercontent.com/u/3998464?v=3","gravatar_id":"","url":"https://api.github.com/users/heartsucker","html_url":"https://github.com/heartsucker","followers_url":"https://api.github.com/users/heartsucker/followers","following_url":"https://api.github.com/users/heartsucker/following{/other_user}","gists_url":"https://api.github.com/users/heartsucker/gists{/gist_id}","starred_url":"https://api.github.com/users/heartsucker/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/heartsucker/subscriptions","organizations_url":"https://api.github.com/users/heartsucker/orgs","repos_url":"https://api.github.com/users/heartsucker/repos","events_url":"https://api.github.com/users/heartsucker/events{/privacy}","received_events_url":"https://api.github.com/users/heartsucker/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":10,"created_at":"2015-09-03T21:07:07Z","updated_at":"2016-06-23T17:14:01Z","closed_at":null,"pull_request":{"url":"https://api.github.com/repos/freedomofpress/securedrop/pulls/1103","html_url":"https://github.com/freedomofpress/securedrop/pull/1103","diff_url":"https://github.com/freedomofpress/securedrop/pull/1103.diff","patch_url":"https://github.com/freedomofpress/securedrop/pull/1103.patch"},"body":"#### Added\r\n- `pybabel` integration\r\n- German translations\r\n- Updated `manage.py` to take care of all translation related operations\r\n- Updated build scripts to compile translations on `postinst`\r\n- Updated AppArmor profile\r\n\r\n#### Notes\r\n- Intentionally left out internationalization of user names, passwords, and code names because:\r\n  - Python 2 is a sad panda w.r.t. unicode\r\n  - Multiple unicode characters represent the same glyph in some languages ([#1](https://en.wikipedia.org/wiki/Unicode_equivalence#Character_duplication), [#2](https://en.wikipedia.org/wiki/Homoglyph#Unicode_homoglyphs)) and this is a security / usability issue\r\n- Writing tests to automatically check translations for HTML compliance was an endless hell, so I left it out since a human eye can catch most errors\r\n\r\n#### Outstanding\r\n- Not a regression, but \"Select All\" and \"Select None\" do nothing even with JavaScript enabled in Firefox 40.0.3 on OSX 10.10.5.\r\n- Transifex doesn't actually link to anything since that seems like something y'all would want to set up instead of me\r\n\r\n#### Related\r\n- Issue #127\r\n- PR #753\r\n- Issue #999\r\n- Issue #1000\r\n- Issue #1001\r\n\r\n#### Kudos\r\nSome html came from @edwincheese when I branched. Translations edited by @jaseg."},"comment":{"url":"https://api.github.com/repos/freedomofpress/securedrop/issues/comments/228118320","html_url":"https://github.com/freedomofpress/securedrop/pull/1103#issuecomment-228118320","issue_url":"https://api.github.com/repos/freedomofpress/securedrop/issues/1103","id":228118320,"user":{"login":"heartsucker","id":3998464,"avatar_url":"https://avatars.githubusercontent.com/u/3998464?v=3","gravatar_id":"","url":"https://api.github.com/users/heartsucker","html_url":"https://github.com/heartsucker","followers_url":"https://api.github.com/users/heartsucker/followers","following_url":"https://api.github.com/users/heartsucker/following{/other_user}","gists_url":"https://api.github.com/users/heartsucker/gists{/gist_id}","starred_url":"https://api.github.com/users/heartsucker/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/heartsucker/subscriptions","organizations_url":"https://api.github.com/users/heartsucker/orgs","repos_url":"https://api.github.com/users/heartsucker/repos","events_url":"https://api.github.com/users/heartsucker/events{/privacy}","received_events_url":"https://api.github.com/users/heartsucker/received_events","type":"User","site_admin":false},"created_at":"2016-06-23T17:14:01Z","updated_at":"2016-06-23T17:14:01Z","body":"@garrettr Hello again. I know this needs a rebase, but before I do that, how does this look for a merge? Is this (loosely) the way you'd want the code structured? Does this need to have documentation added so developers in the future know to use the translation functions on strings? Etc. etc."}}
{"actor":{"display_login":"heartsucker"}}