From a78659b206a4ea60dea06a5a818ceab636eb3c26 Mon Sep 17 00:00:00 2001 From: N-Pex Date: Thu, 20 May 2021 12:33:59 +0200 Subject: [PATCH] Externalize strings Also some cleanup. Work on issue #41. --- package-lock.json | 11 ++ package.json | 1 + src/App.vue | 2 +- src/assets/translations/en.js | 173 ++++++++++++++++++ src/components/Chat.vue | 58 ++---- src/components/ChatHeader.vue | 4 +- src/components/CreateRoom.vue | 40 ++-- src/components/CreatedRoomWelcomeHeader.vue | 12 +- src/components/DeviceList.vue | 8 +- src/components/Home.vue | 2 +- src/components/Invite.vue | 10 +- src/components/Join.vue | 18 +- src/components/LeaveRoomDialog.vue | 27 +-- src/components/Login.vue | 12 +- src/components/Profile.vue | 30 ++- src/components/PurgeRoomDialog.vue | 9 +- src/components/RoomInfo.vue | 85 +++++---- src/components/RoomInfoBottomSheet.vue | 6 +- src/components/VoiceRecorder.vue | 8 +- src/components/messages/AudioPlayer.vue | 68 ------- src/components/messages/AvatarOperations.vue | 2 +- src/components/messages/ContactChanged.vue | 6 +- src/components/messages/ContactInvited.vue | 2 +- src/components/messages/ContactJoin.vue | 2 +- src/components/messages/ContactLeave.vue | 2 +- .../messages/MessageIncomingAudio.vue | 2 +- .../messages/MessageIncomingFile.vue | 6 +- .../messages/MessageIncomingText.vue | 4 +- .../messages/MessageIncomingVideo.vue | 4 +- .../messages/MessageOperationsPicker.vue | 8 +- src/components/messages/MessageOutgoing.vue | 2 +- .../messages/MessageOutgoingAudio.vue | 2 +- .../messages/MessageOutgoingFile.vue | 4 +- .../messages/MessageOutgoingText.vue | 4 +- .../messages/MessageOutgoingVideo.vue | 2 +- src/components/messages/RoomAvatarChanged.vue | 2 +- .../messages/RoomHistoryVisibility.vue | 10 +- src/components/messages/RoomJoinRules.vue | 6 +- src/components/messages/RoomNameChanged.vue | 3 +- src/components/messages/RoomTopicChanged.vue | 3 +- src/components/messages/messageMixin.js | 4 +- src/main.js | 2 + src/plugins/lang.js | 24 +++ 43 files changed, 402 insertions(+), 288 deletions(-) create mode 100644 src/assets/translations/en.js create mode 100644 src/plugins/lang.js diff --git a/package-lock.json b/package-lock.json index 2752242..01f44dc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,6 +32,7 @@ "v-emoji-picker": "^2.3.1", "vue": "^2.6.11", "vue-clipboard2": "^0.3.1", + "vue-i18n": "^8.24.4", "vue-resize": "^0.5.0", "vue-router": "^3.2.0", "vue-sanitize": "^0.2.1", @@ -13997,6 +13998,11 @@ "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", "dev": true }, + "node_modules/vue-i18n": { + "version": "8.24.4", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-8.24.4.tgz", + "integrity": "sha512-RZE94WUAGxEiBAANxQ0pptbRwDkNKNSXl3fnJslpFOxVMF6UkUtMDSuYGuW2blDrVgweIXVpethOVkYoNNT9xw==" + }, "node_modules/vue-loader": { "version": "15.9.6", "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.6.tgz", @@ -26866,6 +26872,11 @@ "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", "dev": true }, + "vue-i18n": { + "version": "8.24.4", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-8.24.4.tgz", + "integrity": "sha512-RZE94WUAGxEiBAANxQ0pptbRwDkNKNSXl3fnJslpFOxVMF6UkUtMDSuYGuW2blDrVgweIXVpethOVkYoNNT9xw==" + }, "vue-loader": { "version": "15.9.6", "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.6.tgz", diff --git a/package.json b/package.json index 4b2e756..70f54f9 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "v-emoji-picker": "^2.3.1", "vue": "^2.6.11", "vue-clipboard2": "^0.3.1", + "vue-i18n": "^8.24.4", "vue-resize": "^0.5.0", "vue-router": "^3.2.0", "vue-sanitize": "^0.2.1", diff --git a/src/App.vue b/src/App.vue index 0e1d17e..244e055 100644 --- a/src/App.vue +++ b/src/App.vue @@ -33,7 +33,7 @@ export default { return this.$store.state.auth.user; }, title() { - var title = config.appName; + var title = this.$t(config.appName); if (this.$matrix.notificationCount > 0) { title += " [" + this.$matrix.notificationCount + "]"; } diff --git a/src/assets/translations/en.js b/src/assets/translations/en.js new file mode 100644 index 0000000..ecbb986 --- /dev/null +++ b/src/assets/translations/en.js @@ -0,0 +1,173 @@ +export default { + "Keanu Weblite": "Keanu Weblite", + menu: { + start_private_chat: "Private chat with this user", + reply: "Reply", + edit: "Edit", + delete: "Delete", + download: "Download", + ok: "Ok", + cancel: "Cancel", + send: "Send", + back: "BACK", + login: "Login", + logout: "Logout", + }, + message: { + you: "You", + user_changed_display_name: "{user} changed display name to {displayName}", + user_changed_avatar: "{user} changed the avatar", + user_changed_room_avatar: "{user} changed the room avatar", + user_was_invited: "{user} was invited to the chat...", + user_joined: "{user} joined the chat", + user_left: "{user} left the chat", + user_said: "{user} said:", + file_prefix: "File: ", + edited: "(edited)", + download_progress: "{percentage}% downloaded", + upload_progress: "Uploaded {count}", + upload_progress_with_total: "Uploaded {count} of {total}", + user_changed_room_history: "{user} made room history {type}", + room_history_world_readable: "readable by anyone", + room_history_shared: "readable to all members in the room", + room_history_invited: "readable to members from when they were invited", + room_history_joined: "readable to members from when they joined", + user_changed_join_rules: "{user} made the room {type}", + room_joinrule_invite: "invite only", + room_joinrule_public: "public", + user_changed_room_name: "{user} changed room name to {name}", + user_changed_room_topic: "{user} changed room topic to {topic}", + unread_messages: "Unread messages", + replying_to_event: "REPLYING TO EVENT: {message}", + your_message: "Your message...", + scale_image: "Scale image", + user_is_typing: "{user} is typing", + users_are_typing: "{count} members are typing", + }, + room: { + members: "no members | 1 member | {count} members", + leave: "Leave" + }, + room_welcome: { + welcome: "Welcome!", + info: "Here are a few things to know about your group:", + join_public: "Anyone can join by opening this link: {link}", + join_invite: "Only people you invite can join.", + info_permissions: "You can change 'join permissions' and 'message history' at any time in the group settings.", + got_it: "Got it", + }, + new_room: { + new_room: "New Group", + done: "Done", + next: "Next", + name_room: "Name group", + join_permissions: "Join permissions", + set_join_permissions: "Set Join Permissions", + join_permissions_info: "These permissions determine how people can join the group and how easily others can be invited. They can be changed anytime.", + get_link: "Get link", + add_people: "Add people", + link_copied: "Link copied!", + public_info: "Anyone with a link", + public_description: "Get a link to share", + invite_info: "Only people added", + invite_description: "Choose from a list or search by account ID", + status_creating: "Creating room", + status_avatar_total: "Uploading avatar: {count} of {total}", + status_avatar: "Uploading avatar: {count}", + }, + device_list: { + title: "DEVICES", + blocked: "Blocked", + verified: "Verified", + not_verified: "Not verified", + }, + login: { + title: "Login", + username: "Username", + password: "Password", + username_required: "Username is required", + password_required: "Password is required", + login: "Login" + }, + profile: { + title: "My Profile", + temporary_identity: "This identity is temporary. Set a password to use it again", + set_password: "Set password", + change_name: "Change name", + change_password: "Change password", + password_old: "Old password", + password_new: "New password", + password_repeat: "Repeat new password", + display_name: "Display name", + + }, + join: { + title: "Welcome to {roomName}", + user_name_label: "User name", + shared_computer: "Using a shared computer", + joining_as: "You are joining as:", + join: "Join room", + join_guest: "Join as guest", + status_logging_in: "Logging in...", + status_joining: "Joining room...", + }, + invite: { + title: "Add Friends", + done: "Done", + send_invites_to: "Send invites to", + status_inviting: "Inviting friend {index} of {count}", + status_error: "Failed to invite one or or more friends!", + }, + leave: { + title_public: "Goodbye, {user}", + text_public: "You can always join this room again if you know the link.", + text_public_lastroom: "If you want to join this group again, you can join under a new identity. To keep {user}, {action}.", + title_invite: "Are you sure you want to leave?", + text_invite: "This group is locked. You cannot rejoin without a special permission.", + create_account: "create an account", + go_back: "Go back", + leave: "Leave" + }, + purge_room: { + title: "Purge room?", + info: "This operation will close the room for all members. It cannot be undone.", + button: "Purge room" + }, + room_info: { + title: "Info", + created_by: "Created by {user}", + permissions: "Permissions", + join_invite: "Room can be joined by invitation only", + join_public: "Anyone with the link can join", + link_copied: "Link copied!", + purge: "Purge room", + members: "Members", + user: "{user}", + user_you: "{user} (you)", + hide_all: "Hide", + show_all: "Show all", + my_profile: "My Profile", + identity: "You are logged in as {displayName}.", + identity_temporary: "Your identity {displayName} is temporary. You can change your name or set a password to keep it.", + view_profile: "View", + leave_room: "Leave group", + leave_room_info: "Note: This step cannot be undone. Make sure you want to logout and delete the chat forever.", + version_info: "Powered by Guardian Project. Version: {version}", + }, + room_info_sheet: { + this_room: "This group", + view_details: "View details", + create_room: "Create group" + }, + voice_recorder: { + swipe_to_cancel: "Swipe to cancel", + release_to_cancel: "Release to cancel", + failed_to_record: "Failed to record audio" + }, + fallbacks: { + audio_file: "Audio file", + video_file: "Video file", + original_text: "", + download_name: "Download", + } +} \ No newline at end of file diff --git a/src/components/Chat.vue b/src/components/Chat.vue index d388390..8844ce8 100644 --- a/src/components/Chat.vue +++ b/src/components/Chat.vue @@ -111,7 +111,7 @@
@@ -135,7 +135,7 @@
- REPLYING TO EVENT: {{ replyToEvent.getContent().body }} + {{$t('message.replying_to_event',{message: replyToEvent.getContent().body}) }}
@@ -154,7 +154,7 @@ v-model="currentInput" no-resize class="input-area-text" - placeholder="Your message..." + :placeholder="$t('message.your_message')" hide-details background-color="white" v-on:keydown.enter.prevent=" @@ -308,7 +308,7 @@ > @@ -319,7 +319,7 @@ Cancel{{$t('menu.cancel')}} Send{{$t('menu.send')}} @@ -336,7 +336,6 @@ - - - - You are logged in as a guest - -
Unfortunately guests are not allowed to upload files.
-
- - - - Ok - -
-
- 1) { - return "" + count + " members are typing"; + return this.$t('message.users_are_typing',{count: count}); } else if (count > 0) { - return this.typingMembers[0].name + " is typing"; + return this.$t('message.user_is_typing',{user: this.typingMembers[0].name}); } else { return ""; } @@ -776,7 +755,6 @@ export default { this.timelineWindow .load(initialEventId, 20) .then(() => { - console.log("This is", self); self.events = self.timelineWindow.getEvents(); const getMoreIfNeeded = function _getMoreIfNeeded() { @@ -1046,7 +1024,7 @@ export default { this.restartRRTimer(); }, onEvent(event) { - console.log("OnEvent", JSON.stringify(event)); + //console.log("OnEvent", JSON.stringify(event)); if (event.getRoomId() !== this.roomId) { return; // Not for this room } @@ -1083,7 +1061,7 @@ export default { this.typingMembers.splice(index, 1); } } - console.log("Typing: ", this.typingMembers); + //console.log("Typing: ", this.typingMembers); }, sendCurrentTextMessage() { @@ -1119,12 +1097,6 @@ export default { * Show attachment picker to select file */ showAttachmentPicker() { - // Guests not currently allowed to send attachments (=actually upload them) - // See https://matrix.org/docs/spec/client_server/r0.2.0#guest-access - // if (this.$matrix.currentUser && this.$matrix.currentUser.is_guest) { - // this.showNotAllowedForGuests = true; - // return; - // } this.$refs.attachment.click(); }, @@ -1202,9 +1174,9 @@ export default { onUploadProgress(p) { if (p.total) { this.currentSendProgress = - "Uploaded " + (p.loaded || 0) + " of " + p.total; + this.$t('message.upload_progress_with_total',{count: (p.loaded || 0), total: p.total}); } else { - this.currentSendProgress = "Uploaded " + (p.loaded || 0); + this.currentSendProgress = this.$t('message.upload_progress',{count: (p.loaded || 0)}); } }, @@ -1390,7 +1362,7 @@ export default { const link = document.createElement("a"); link.href = url; link.target = "_blank"; - link.download = event.getContent().body || "Download"; + link.download = event.getContent().body || this.$t('fallbacks.download_name'); link.click(); URL.revokeObjectURL(url); }) @@ -1436,10 +1408,6 @@ export default { showContextMenuForEvent(e) { const event = e.event; - const ref = this.$refs[event.getId()]; - if (ref) { - console.log("Got the ref", ref); - } this.selectedEvent = event; this.updateRecentEmojis(); this.showContextMenu = true; diff --git a/src/components/ChatHeader.vue b/src/components/ChatHeader.vue index 781ca1c..f8c6e9e 100644 --- a/src/components/ChatHeader.vue +++ b/src/components/ChatHeader.vue @@ -13,10 +13,10 @@
{{ room.summary.info.title }}
-
{{ memberCount }}{{ memberCount > 1 ? " members" : " member" }}
+
{{ $tc('room.members', memberCount) }}
- Leave + {{$t('room.leave')}}
diff --git a/src/components/CreateRoom.vue b/src/components/CreateRoom.vue index d1a392d..c58370b 100644 --- a/src/components/CreateRoom.vue +++ b/src/components/CreateRoom.vue @@ -2,7 +2,7 @@
-
New Group
+
{{$t('new_room.new_room')}}
arrow_back - BACK + {{$t('menu.back')}} - {{ step == steps.CREATED ? "Done" : "Next" }} + {{ step == steps.CREATED ? $t('new_room.done') : $t('new_room.next') }}
@@ -37,7 +37,7 @@
-
Join permissions
-
Set Join Permissions
-
- These permissions determine how people can join the group and how - easily others can be invited. They can be changed anytime. -
+
{{$t('new_room.join_permissions')}}
+
{{$t('new_room.set_join_permissions')}}
+
{{$t('new_room.join_permissions_info')}}
{{ item.text }} -