{"action":"closed","number":1725,"pull_request":{"url":"https://api.github.com/repos/keepassxreboot/keepassxc/pulls/1725","id":174805889,"html_url":"https://github.com/keepassxreboot/keepassxc/pull/1725","diff_url":"https://github.com/keepassxreboot/keepassxc/pull/1725.diff","patch_url":"https://github.com/keepassxreboot/keepassxc/pull/1725.patch","issue_url":"https://api.github.com/repos/keepassxreboot/keepassxc/issues/1725","number":1725,"state":"closed","locked":false,"title":"Improve translation base strings","user":{"login":"Throne3d","id":577128,"avatar_url":"https://avatars1.githubusercontent.com/u/577128?v=4","gravatar_id":"","url":"https://api.github.com/users/Throne3d","html_url":"https://github.com/Throne3d","followers_url":"https://api.github.com/users/Throne3d/followers","following_url":"https://api.github.com/users/Throne3d/following{/other_user}","gists_url":"https://api.github.com/users/Throne3d/gists{/gist_id}","starred_url":"https://api.github.com/users/Throne3d/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Throne3d/subscriptions","organizations_url":"https://api.github.com/users/Throne3d/orgs","repos_url":"https://api.github.com/users/Throne3d/repos","events_url":"https://api.github.com/users/Throne3d/events{/privacy}","received_events_url":"https://api.github.com/users/Throne3d/received_events","type":"User","site_admin":false},"body":"## Description\r\nThis contains multiple different changes to (hopefully) improve translation base strings.\r\n\r\n- In file dialog filters, only translate the text describing the filter, not the whole filter setup (e.g. only `\"Executable Files\"` and `\"All Files\"` in `\"Executable Files (*.exe);;All Files (*.*)\"`)\r\n- Fix the capitalization of some base strings to be more consistent with other base strings, as the capitalization difference doesn't seem to be semantically important\r\n- Where trailing whitespace isn't relevant to the translation, remove it from the base strings; where it _is_, instead use positional arguments and request the whole fragment be translated (e.g. `\"Unable to create key file: %1\"`, not `\"Unable to create key file: \".append(…)`)\r\n- Reduce other concatenation of strings (e.g. now `\"Expires in <b>%n</b> second(s)\"`, as sentence structure varies a lot by language)\r\n- Make a few more strings translatable\r\n- Allow translators to position modifier text (like `\"entry name - Clone\"`, which could be useful in the case of eg RTL languages)\r\n- Fix pluralization of confirmation prompts (some languages have further plurals, such as a _dual_ plural for \"2 items\", so it's important we still permit plural translations)\r\n\r\n## Motivation and context\r\nFixes #1647. This will make it easier on translators to provide relevant strings, as they can translate more strings, and can translate whole strings accurately instead of guessing how to translate fragments which were previously stitched together. It also removes some of the clutter when they translate these strings. (Other motivation is described above.)\r\n\r\n## How has this been tested?\r\nI'm not sure how to thoroughly test this, except to release it into the wild, or to spend a very long time trying to comb over the codebase. The changes seem to make sense, the code compiles, and I've manually checked some of the strings by looking through the application (as listed below). Both regular and GUI tests pass.\r\n\r\nI'm unsure about the locations I've added `tr`s. The code didn't previously use `tr` in all of these locations, and there might be a reason for this that I don't know. Some code might also rely on fixed strings or fixed string lengths – an example of this is the `*` modifier to the window title bar, which I _didn't_ mark as translatable, even though the UI feature might vary by language.\r\n\r\nOf these changes, I've manually tested:\r\n- Filters\r\n- About dialog\r\n- \"Attributes\" tab of details widget\r\n- Search menu\r\n- Cloning attribute\r\n- Locked database window title\r\n- Deleting entries & recycle bin\r\n\r\n## Types of changes\r\n- ✅ Bug fix (non-breaking change which fixes an issue)\r\n- ✅ Breaking change (fix or feature that would cause existing functionality to change)\r\n\r\n## Checklist:\r\n- ✅ I have read the **CONTRIBUTING** document. **[REQUIRED]**\r\n- ✅ My code follows the code style of this project. **[REQUIRED]**\r\n- ✅ All new and existing tests passed. **[REQUIRED]**\r\n- ❌ I have compiled and verified my code with `-DWITH_ASAN=ON`. **[REQUIRED]**\r\n  I'm testing on Windows, which doesn't have support for the `-DWITH_ASAN` flag, and these changes don't seem to modify memory-related things so I don't expect this to be a problem.","created_at":"2018-03-13T22:19:11Z","updated_at":"2018-03-17T23:01:28Z","closed_at":"2018-03-17T23:01:28Z","merged_at":"2018-03-17T23:01:27Z","merge_commit_sha":"ed2da34d7a904b05612c9c37254f908bad1b30e1","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":810451676,"url":"https://api.github.com/repos/keepassxreboot/keepassxc/labels/i18n","name":"i18n","color":"c18bf9","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/keepassxreboot/keepassxc/pulls/1725/commits","review_comments_url":"https://api.github.com/repos/keepassxreboot/keepassxc/pulls/1725/comments","review_comment_url":"https://api.github.com/repos/keepassxreboot/keepassxc/pulls/comments{/number}","comments_url":"https://api.github.com/repos/keepassxreboot/keepassxc/issues/1725/comments","statuses_url":"https://api.github.com/repos/keepassxreboot/keepassxc/statuses/963a7802d13996bc3e1d396ce4b8172f123db2bc","head":{"label":"Throne3d:fix/1647-translations","ref":"fix/1647-translations","sha":"963a7802d13996bc3e1d396ce4b8172f123db2bc","user":{"login":"Throne3d","id":577128,"avatar_url":"https://avatars1.githubusercontent.com/u/577128?v=4","gravatar_id":"","url":"https://api.github.com/users/Throne3d","html_url":"https://github.com/Throne3d","followers_url":"https://api.github.com/users/Throne3d/followers","following_url":"https://api.github.com/users/Throne3d/following{/other_user}","gists_url":"https://api.github.com/users/Throne3d/gists{/gist_id}","starred_url":"https://api.github.com/users/Throne3d/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Throne3d/subscriptions","organizations_url":"https://api.github.com/users/Throne3d/orgs","repos_url":"https://api.github.com/users/Throne3d/repos","events_url":"https://api.github.com/users/Throne3d/events{/privacy}","received_events_url":"https://api.github.com/users/Throne3d/received_events","type":"User","site_admin":false},"repo":{"id":74772470,"name":"keepassxc","full_name":"Throne3d/keepassxc","owner":{"login":"Throne3d","id":577128,"avatar_url":"https://avatars1.githubusercontent.com/u/577128?v=4","gravatar_id":"","url":"https://api.github.com/users/Throne3d","html_url":"https://github.com/Throne3d","followers_url":"https://api.github.com/users/Throne3d/followers","following_url":"https://api.github.com/users/Throne3d/following{/other_user}","gists_url":"https://api.github.com/users/Throne3d/gists{/gist_id}","starred_url":"https://api.github.com/users/Throne3d/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Throne3d/subscriptions","organizations_url":"https://api.github.com/users/Throne3d/orgs","repos_url":"https://api.github.com/users/Throne3d/repos","events_url":"https://api.github.com/users/Throne3d/events{/privacy}","received_events_url":"https://api.github.com/users/Throne3d/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/Throne3d/keepassxc","description":"KeePassXC is a cross platform community driven port of the windows application “Keepass Password Safe”.","fork":true,"url":"https://api.github.com/repos/Throne3d/keepassxc","forks_url":"https://api.github.com/repos/Throne3d/keepassxc/forks","keys_url":"https://api.github.com/repos/Throne3d/keepassxc/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Throne3d/keepassxc/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Throne3d/keepassxc/teams","hooks_url":"https://api.github.com/repos/Throne3d/keepassxc/hooks","issue_events_url":"https://api.github.com/repos/Throne3d/keepassxc/issues/events{/number}","events_url":"https://api.github.com/repos/Throne3d/keepassxc/events","assignees_url":"https://api.github.com/repos/Throne3d/keepassxc/assignees{/user}","branches_url":"https://api.github.com/repos/Throne3d/keepassxc/branches{/branch}","tags_url":"https://api.github.com/repos/Throne3d/keepassxc/tags","blobs_url":"https://api.github.com/repos/Throne3d/keepassxc/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Throne3d/keepassxc/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Throne3d/keepassxc/git/refs{/sha}","trees_url":"https://api.github.com/repos/Throne3d/keepassxc/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Throne3d/keepassxc/statuses/{sha}","languages_url":"https://api.github.com/repos/Throne3d/keepassxc/languages","stargazers_url":"https://api.github.com/repos/Throne3d/keepassxc/stargazers","contributors_url":"https://api.github.com/repos/Throne3d/keepassxc/contributors","subscribers_url":"https://api.github.com/repos/Throne3d/keepassxc/subscribers","subscription_url":"https://api.github.com/repos/Throne3d/keepassxc/subscription","commits_url":"https://api.github.com/repos/Throne3d/keepassxc/commits{/sha}","git_commits_url":"https://api.github.com/repos/Throne3d/keepassxc/git/commits{/sha}","comments_url":"https://api.github.com/repos/Throne3d/keepassxc/comments{/number}","issue_comment_url":"https://api.github.com/repos/Throne3d/keepassxc/issues/comments{/number}","contents_url":"https://api.github.com/repos/Throne3d/keepassxc/contents/{+path}","compare_url":"https://api.github.com/repos/Throne3d/keepassxc/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Throne3d/keepassxc/merges","archive_url":"https://api.github.com/repos/Throne3d/keepassxc/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Throne3d/keepassxc/downloads","issues_url":"https://api.github.com/repos/Throne3d/keepassxc/issues{/number}","pulls_url":"https://api.github.com/repos/Throne3d/keepassxc/pulls{/number}","milestones_url":"https://api.github.com/repos/Throne3d/keepassxc/milestones{/number}","notifications_url":"https://api.github.com/repos/Throne3d/keepassxc/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Throne3d/keepassxc/labels{/name}","releases_url":"https://api.github.com/repos/Throne3d/keepassxc/releases{/id}","deployments_url":"https://api.github.com/repos/Throne3d/keepassxc/deployments","created_at":"2016-11-25T16:12:58Z","updated_at":"2018-03-12T21:54:17Z","pushed_at":"2018-03-13T22:15:31Z","git_url":"git://github.com/Throne3d/keepassxc.git","ssh_url":"git@github.com:Throne3d/keepassxc.git","clone_url":"https://github.com/Throne3d/keepassxc.git","svn_url":"https://github.com/Throne3d/keepassxc","homepage":"","size":12245,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":0,"open_issues":0,"watchers":0,"default_branch":"develop"}},"base":{"label":"keepassxreboot:develop","ref":"develop","sha":"46e8e3dbbce6e1a52bdbc8dcec20e60e766dfc2a","user":{"login":"keepassxreboot","id":22534815,"avatar_url":"https://avatars3.githubusercontent.com/u/22534815?v=4","gravatar_id":"","url":"https://api.github.com/users/keepassxreboot","html_url":"https://github.com/keepassxreboot","followers_url":"https://api.github.com/users/keepassxreboot/followers","following_url":"https://api.github.com/users/keepassxreboot/following{/other_user}","gists_url":"https://api.github.com/users/keepassxreboot/gists{/gist_id}","starred_url":"https://api.github.com/users/keepassxreboot/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/keepassxreboot/subscriptions","organizations_url":"https://api.github.com/users/keepassxreboot/orgs","repos_url":"https://api.github.com/users/keepassxreboot/repos","events_url":"https://api.github.com/users/keepassxreboot/events{/privacy}","received_events_url":"https://api.github.com/users/keepassxreboot/received_events","type":"Organization","site_admin":false},"repo":{"id":52729242,"name":"keepassxc","full_name":"keepassxreboot/keepassxc","owner":{"login":"keepassxreboot","id":22534815,"avatar_url":"https://avatars3.githubusercontent.com/u/22534815?v=4","gravatar_id":"","url":"https://api.github.com/users/keepassxreboot","html_url":"https://github.com/keepassxreboot","followers_url":"https://api.github.com/users/keepassxreboot/followers","following_url":"https://api.github.com/users/keepassxreboot/following{/other_user}","gists_url":"https://api.github.com/users/keepassxreboot/gists{/gist_id}","starred_url":"https://api.github.com/users/keepassxreboot/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/keepassxreboot/subscriptions","organizations_url":"https://api.github.com/users/keepassxreboot/orgs","repos_url":"https://api.github.com/users/keepassxreboot/repos","events_url":"https://api.github.com/users/keepassxreboot/events{/privacy}","received_events_url":"https://api.github.com/users/keepassxreboot/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/keepassxreboot/keepassxc","description":"KeePassXC is a cross-platform community-driven port of the Windows application “Keepass Password Safe”.","fork":false,"url":"https://api.github.com/repos/keepassxreboot/keepassxc","forks_url":"https://api.github.com/repos/keepassxreboot/keepassxc/forks","keys_url":"https://api.github.com/repos/keepassxreboot/keepassxc/keys{/key_id}","collaborators_url":"https://api.github.com/repos/keepassxreboot/keepassxc/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/keepassxreboot/keepassxc/teams","hooks_url":"https://api.github.com/repos/keepassxreboot/keepassxc/hooks","issue_events_url":"https://api.github.com/repos/keepassxreboot/keepassxc/issues/events{/number}","events_url":"https://api.github.com/repos/keepassxreboot/keepassxc/events","assignees_url":"https://api.github.com/repos/keepassxreboot/keepassxc/assignees{/user}","branches_url":"https://api.github.com/repos/keepassxreboot/keepassxc/branches{/branch}","tags_url":"https://api.github.com/repos/keepassxreboot/keepassxc/tags","blobs_url":"https://api.github.com/repos/keepassxreboot/keepassxc/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/keepassxreboot/keepassxc/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/keepassxreboot/keepassxc/git/refs{/sha}","trees_url":"https://api.github.com/repos/keepassxreboot/keepassxc/git/trees{/sha}","statuses_url":"https://api.github.com/repos/keepassxreboot/keepassxc/statuses/{sha}","languages_url":"https://api.github.com/repos/keepassxreboot/keepassxc/languages","stargazers_url":"https://api.github.com/repos/keepassxreboot/keepassxc/stargazers","contributors_url":"https://api.github.com/repos/keepassxreboot/keepassxc/contributors","subscribers_url":"https://api.github.com/repos/keepassxreboot/keepassxc/subscribers","subscription_url":"https://api.github.com/repos/keepassxreboot/keepassxc/subscription","commits_url":"https://api.github.com/repos/keepassxreboot/keepassxc/commits{/sha}","git_commits_url":"https://api.github.com/repos/keepassxreboot/keepassxc/git/commits{/sha}","comments_url":"https://api.github.com/repos/keepassxreboot/keepassxc/comments{/number}","issue_comment_url":"https://api.github.com/repos/keepassxreboot/keepassxc/issues/comments{/number}","contents_url":"https://api.github.com/repos/keepassxreboot/keepassxc/contents/{+path}","compare_url":"https://api.github.com/repos/keepassxreboot/keepassxc/compare/{base}...{head}","merges_url":"https://api.github.com/repos/keepassxreboot/keepassxc/merges","archive_url":"https://api.github.com/repos/keepassxreboot/keepassxc/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/keepassxreboot/keepassxc/downloads","issues_url":"https://api.github.com/repos/keepassxreboot/keepassxc/issues{/number}","pulls_url":"https://api.github.com/repos/keepassxreboot/keepassxc/pulls{/number}","milestones_url":"https://api.github.com/repos/keepassxreboot/keepassxc/milestones{/number}","notifications_url":"https://api.github.com/repos/keepassxreboot/keepassxc/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/keepassxreboot/keepassxc/labels{/name}","releases_url":"https://api.github.com/repos/keepassxreboot/keepassxc/releases{/id}","deployments_url":"https://api.github.com/repos/keepassxreboot/keepassxc/deployments","created_at":"2016-02-28T15:52:40Z","updated_at":"2018-03-17T21:18:55Z","pushed_at":"2018-03-17T23:01:27Z","git_url":"git://github.com/keepassxreboot/keepassxc.git","ssh_url":"git@github.com:keepassxreboot/keepassxc.git","clone_url":"https://github.com/keepassxreboot/keepassxc.git","svn_url":"https://github.com/keepassxreboot/keepassxc","homepage":"https://keepassxc.org/","size":12262,"stargazers_count":3367,"watchers_count":3367,"language":"C++","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":249,"mirror_url":null,"archived":false,"open_issues_count":326,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":249,"open_issues":326,"watchers":3367,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/keepassxreboot/keepassxc/pulls/1725"},"html":{"href":"https://github.com/keepassxreboot/keepassxc/pull/1725"},"issue":{"href":"https://api.github.com/repos/keepassxreboot/keepassxc/issues/1725"},"comments":{"href":"https://api.github.com/repos/keepassxreboot/keepassxc/issues/1725/comments"},"review_comments":{"href":"https://api.github.com/repos/keepassxreboot/keepassxc/pulls/1725/comments"},"review_comment":{"href":"https://api.github.com/repos/keepassxreboot/keepassxc/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/keepassxreboot/keepassxc/pulls/1725/commits"},"statuses":{"href":"https://api.github.com/repos/keepassxreboot/keepassxc/statuses/963a7802d13996bc3e1d396ce4b8172f123db2bc"}},"author_association":"CONTRIBUTOR","merged":true,"mergeable":null,"rebaseable":null,"mergeable_state":"unknown","merged_by":{"login":"phoerious","id":911270,"avatar_url":"https://avatars1.githubusercontent.com/u/911270?v=4","gravatar_id":"","url":"https://api.github.com/users/phoerious","html_url":"https://github.com/phoerious","followers_url":"https://api.github.com/users/phoerious/followers","following_url":"https://api.github.com/users/phoerious/following{/other_user}","gists_url":"https://api.github.com/users/phoerious/gists{/gist_id}","starred_url":"https://api.github.com/users/phoerious/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/phoerious/subscriptions","organizations_url":"https://api.github.com/users/phoerious/orgs","repos_url":"https://api.github.com/users/phoerious/repos","events_url":"https://api.github.com/users/phoerious/events{/privacy}","received_events_url":"https://api.github.com/users/phoerious/received_events","type":"User","site_admin":false},"comments":0,"review_comments":0,"maintainer_can_modify":false,"commits":4,"additions":81,"deletions":82,"changed_files":24}}
{"actor":{"display_login":"phoerious"}}