Skip to content

Commit a3098a1

Browse files
committed
feat translate general, business hours, sla.
translate user login , forgot password & set password.
1 parent 76a2446 commit a3098a1

24 files changed

+534
-274
lines changed

frontend/src/App.vue

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ import Sidebar from '@/components/sidebar/Sidebar.vue'
9797
import Command from '@/features/command/CommandBox.vue'
9898
import CreateConversation from '@/features/conversation/CreateConversation.vue'
9999
import { Inbox, Shield, FileLineChart } from 'lucide-vue-next'
100+
import { useI18n } from 'vue-i18n'
100101
import { useRoute } from 'vue-router'
101102
import {
102103
Sidebar as ShadcnSidebar,
@@ -125,6 +126,7 @@ const userViews = ref([])
125126
const view = ref({})
126127
const openCreateViewForm = ref(false)
127128
const openCreateConversationDialog = ref(false)
129+
const { t } = useI18n()
128130
129131
initWS()
130132
useIdleDetection()
@@ -163,8 +165,9 @@ const deleteView = async (view) => {
163165
await api.deleteView(view.id)
164166
emitter.emit(EMITTER_EVENTS.REFRESH_LIST, { model: 'view' })
165167
emitter.emit(EMITTER_EVENTS.SHOW_TOAST, {
166-
title: 'Success',
167-
description: 'View deleted successfully'
168+
description: t('globals.messages.deletedSuccessfully', {
169+
name: t('globals.entities.view')
170+
})
168171
})
169172
} catch (err) {
170173
emitter.emit(EMITTER_EVENTS.SHOW_TOAST, {
@@ -181,7 +184,6 @@ const getUserViews = async () => {
181184
userViews.value = response.data.data
182185
} catch (err) {
183186
emitter.emit(EMITTER_EVENTS.SHOW_TOAST, {
184-
title: 'Error',
185187
variant: 'destructive',
186188
description: handleHTTPError(err).message
187189
})

frontend/src/components/datatable/DataTable.vue

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,22 @@
55
<TableHeader>
66
<TableRow v-for="headerGroup in table.getHeaderGroups()" :key="headerGroup.id">
77
<TableHead v-for="header in headerGroup.headers" :key="header.id" class="font-semibold">
8-
<FlexRender v-if="!header.isPlaceholder" :render="header.column.columnDef.header"
9-
:props="header.getContext()" />
8+
<FlexRender
9+
v-if="!header.isPlaceholder"
10+
:render="header.column.columnDef.header"
11+
:props="header.getContext()"
12+
/>
1013
</TableHead>
1114
</TableRow>
1215
</TableHeader>
1316
<TableBody>
1417
<template v-if="table.getRowModel().rows?.length">
15-
<TableRow v-for="row in table.getRowModel().rows" :key="row.id"
16-
:data-state="row.getIsSelected() ? 'selected' : undefined" class="hover:bg-muted/50">
18+
<TableRow
19+
v-for="row in table.getRowModel().rows"
20+
:key="row.id"
21+
:data-state="row.getIsSelected() ? 'selected' : undefined"
22+
class="hover:bg-muted/50"
23+
>
1724
<TableCell v-for="cell in row.getVisibleCells()" :key="cell.id">
1825
<FlexRender :render="cell.column.columnDef.cell" :props="cell.getContext()" />
1926
</TableCell>
@@ -35,6 +42,8 @@
3542

3643
<script setup>
3744
import { FlexRender, getCoreRowModel, useVueTable } from '@tanstack/vue-table'
45+
import { useI18n } from 'vue-i18n'
46+
import { computed } from 'vue'
3847
3948
import {
4049
Table,
@@ -45,15 +54,19 @@ import {
4554
TableRow
4655
} from '@/components/ui/table'
4756
57+
const { t } = useI18n()
4858
const props = defineProps({
4959
columns: Array,
5060
data: Array,
5161
emptyText: {
5262
type: String,
53-
default: 'No results.'
63+
default: ''
5464
}
5565
})
5666
67+
// Set the default value for emptyText if it's empty
68+
const emptyText = computed(() => props.emptyText || t('globals.messages.noResultsFound'))
69+
5770
const table = useVueTable({
5871
get data () {
5972
return props.data

frontend/src/components/sidebar/Sidebar.vue

Lines changed: 38 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import {
3737
import { filterNavItems } from '@/utils/nav-permissions'
3838
import { useStorage } from '@vueuse/core'
3939
import { computed } from 'vue'
40+
import { useI18n } from 'vue-i18n'
4041
import { useUserStore } from '@/stores/user'
4142
4243
defineProps({
@@ -46,6 +47,7 @@ defineProps({
4647
const userStore = useUserStore()
4748
const settingsStore = useAppSettingsStore()
4849
const route = useRoute()
50+
const { t } = useI18n()
4951
const emit = defineEmits(['createView', 'editView', 'deleteView', 'createConversation'])
5052
5153
const openCreateViewDialog = () => {
@@ -95,7 +97,9 @@ const viewInboxOpen = useStorage('viewInboxOpen', true)
9597
<SidebarMenuItem>
9698
<SidebarMenuButton :isActive="isActiveParent('/reports/overview')" asChild>
9799
<div>
98-
<span class="font-semibold text-xl">Reports</span>
100+
<span class="font-semibold text-xl">
101+
{{ t('navigation.reports') }}
102+
</span>
99103
</div>
100104
</SidebarMenuButton>
101105
</SidebarMenuItem>
@@ -105,10 +109,10 @@ const viewInboxOpen = useStorage('viewInboxOpen', true)
105109
<SidebarContent>
106110
<SidebarGroup>
107111
<SidebarMenu>
108-
<SidebarMenuItem v-for="item in filteredReportsNavItems" :key="item.title">
112+
<SidebarMenuItem v-for="item in filteredReportsNavItems" :key="item.titleKey">
109113
<SidebarMenuButton :isActive="isActiveParent(item.href)" asChild>
110114
<router-link :to="item.href">
111-
<span>{{ item.title }}</span>
115+
<span>{{ t(item.titleKey) }}</span>
112116
</router-link>
113117
</SidebarMenuButton>
114118
</SidebarMenuItem>
@@ -127,7 +131,9 @@ const viewInboxOpen = useStorage('viewInboxOpen', true)
127131
<SidebarMenuItem>
128132
<SidebarMenuButton :isActive="isActiveParent('/admin')" asChild>
129133
<div class="flex items-center justify-between w-full">
130-
<span class="font-semibold text-xl">Admin</span>
134+
<span class="font-semibold text-xl">
135+
{{ t('navigation.admin') }}
136+
</span>
131137
</div>
132138
<!-- App version -->
133139
<div class="text-xs text-muted-foreground ml-2">
@@ -141,14 +147,14 @@ const viewInboxOpen = useStorage('viewInboxOpen', true)
141147
<SidebarContent>
142148
<SidebarGroup>
143149
<SidebarMenu>
144-
<SidebarMenuItem v-for="item in filteredAdminNavItems" :key="item.title">
150+
<SidebarMenuItem v-for="item in filteredAdminNavItems" :key="item.titleKey">
145151
<SidebarMenuButton
146152
v-if="!item.children"
147153
:isActive="isActiveParent(item.href)"
148154
asChild
149155
>
150156
<router-link :to="item.href">
151-
<span>{{ item.title }}</span>
157+
<span>{{ t(item.titleKey) }}</span>
152158
</router-link>
153159
</SidebarMenuButton>
154160

@@ -159,18 +165,18 @@ const viewInboxOpen = useStorage('viewInboxOpen', true)
159165
>
160166
<CollapsibleTrigger as-child>
161167
<SidebarMenuButton :isActive="isActiveParent(item.href)">
162-
<span>{{ item.title }}</span>
168+
<span>{{ t(item.titleKey) }}</span>
163169
<ChevronRight
164170
class="ml-auto transition-transform duration-200 group-data-[state=open]/collapsible:rotate-90"
165171
/>
166172
</SidebarMenuButton>
167173
</CollapsibleTrigger>
168174
<CollapsibleContent>
169175
<SidebarMenuSub>
170-
<SidebarMenuSubItem v-for="child in item.children" :key="child.title">
176+
<SidebarMenuSubItem v-for="child in item.children" :key="child.titleKey">
171177
<SidebarMenuButton size="sm" :isActive="isActiveParent(child.href)" asChild>
172178
<router-link :to="child.href">
173-
<span>{{ child.title }}</span>
179+
<span>{{ t(child.titleKey) }}</span>
174180
</router-link>
175181
</SidebarMenuButton>
176182
</SidebarMenuSubItem>
@@ -193,7 +199,9 @@ const viewInboxOpen = useStorage('viewInboxOpen', true)
193199
<SidebarMenuItem>
194200
<SidebarMenuButton :isActive="isActiveParent('/account/profile')" asChild>
195201
<div>
196-
<span class="font-semibold text-xl">Account</span>
202+
<span class="font-semibold text-xl">
203+
{{ t('navigation.account') }}
204+
</span>
197205
</div>
198206
</SidebarMenuButton>
199207
</SidebarMenuItem>
@@ -203,10 +211,10 @@ const viewInboxOpen = useStorage('viewInboxOpen', true)
203211
<SidebarContent>
204212
<SidebarGroup>
205213
<SidebarMenu>
206-
<SidebarMenuItem v-for="item in accountNavItems" :key="item.title">
214+
<SidebarMenuItem v-for="item in accountNavItems" :key="item.titleKey">
207215
<SidebarMenuButton :isActive="isActiveParent(item.href)" asChild>
208216
<router-link :to="item.href">
209-
<span>{{ item.title }}</span>
217+
<span>{{ t(item.titleKey) }}</span>
210218
</router-link>
211219
</SidebarMenuButton>
212220
<SidebarMenuAction>
@@ -228,7 +236,9 @@ const viewInboxOpen = useStorage('viewInboxOpen', true)
228236
<SidebarMenuItem>
229237
<SidebarMenuButton asChild>
230238
<div class="flex items-center justify-between w-full">
231-
<div class="font-semibold text-xl">Inbox</div>
239+
<div class="font-semibold text-xl">
240+
<span>{{ t('navigation.inbox') }}</span>
241+
</div>
232242
<div class="ml-auto">
233243
<div class="flex items-center space-x-2">
234244
<div
@@ -265,7 +275,7 @@ const viewInboxOpen = useStorage('viewInboxOpen', true)
265275
<SidebarMenuButton asChild :isActive="isActiveParent('/inboxes/assigned')">
266276
<router-link :to="{ name: 'inbox', params: { type: 'assigned' } }">
267277
<CircleUserRound />
268-
<span>My inbox</span>
278+
<span>{{ t('navigation.myInbox') }}</span>
269279
</router-link>
270280
</SidebarMenuButton>
271281
</SidebarMenuItem>
@@ -274,7 +284,9 @@ const viewInboxOpen = useStorage('viewInboxOpen', true)
274284
<SidebarMenuButton asChild :isActive="isActiveParent('/inboxes/unassigned')">
275285
<router-link :to="{ name: 'inbox', params: { type: 'unassigned' } }">
276286
<UserSearch />
277-
<span>Unassigned</span>
287+
<span>
288+
{{ t('navigation.unassigned') }}
289+
</span>
278290
</router-link>
279291
</SidebarMenuButton>
280292
</SidebarMenuItem>
@@ -283,7 +295,9 @@ const viewInboxOpen = useStorage('viewInboxOpen', true)
283295
<SidebarMenuButton asChild :isActive="isActiveParent('/inboxes/all')">
284296
<router-link :to="{ name: 'inbox', params: { type: 'all' } }">
285297
<UsersRound />
286-
<span>All</span>
298+
<span>
299+
{{ t('navigation.all') }}
300+
</span>
287301
</router-link>
288302
</SidebarMenuButton>
289303
</SidebarMenuItem>
@@ -300,7 +314,9 @@ const viewInboxOpen = useStorage('viewInboxOpen', true)
300314
<SidebarMenuButton asChild>
301315
<router-link to="#">
302316
<!-- <Users /> -->
303-
<span>Team inboxes</span>
317+
<span>
318+
{{ t('navigation.teamInboxes') }}
319+
</span>
304320
<ChevronRight
305321
class="ml-auto transition-transform duration-200 group-data-[state=open]/collapsible:rotate-90"
306322
/>
@@ -332,7 +348,9 @@ const viewInboxOpen = useStorage('viewInboxOpen', true)
332348
<SidebarMenuButton asChild>
333349
<router-link to="#">
334350
<!-- <SlidersHorizontal /> -->
335-
<span>Views</span>
351+
<span>
352+
{{ t('navigation.views') }}
353+
</span>
336354
<div>
337355
<Plus
338356
size="18"
@@ -365,10 +383,10 @@ const viewInboxOpen = useStorage('viewInboxOpen', true)
365383
</DropdownMenuTrigger>
366384
<DropdownMenuContent>
367385
<DropdownMenuItem @click="() => editView(view)">
368-
<span>Edit</span>
386+
<span>{{ t('globals.buttons.edit') }}</span>
369387
</DropdownMenuItem>
370388
<DropdownMenuItem @click="() => deleteView(view)">
371-
<span>Delete</span>
389+
<span>{{ t('globals.buttons.delete') }}</span>
372390
</DropdownMenuItem>
373391
</DropdownMenuContent>
374392
</DropdownMenu>

frontend/src/components/sidebar/SidebarNavUser.vue

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
<DropdownMenuLabel class="p-0 font-normal space-y-1">
3737
<div class="flex items-center gap-2 px-1 py-1.5 text-left text-sm">
3838
<Avatar class="h-8 w-8 rounded-lg">
39-
<AvatarImage :src="userStore.avatar" alt="Abhinav" />
39+
<AvatarImage :src="userStore.avatar" alt="U" />
4040
<AvatarFallback class="rounded-lg">
4141
{{ userStore.getInitials }}
4242
</AvatarFallback>
@@ -47,7 +47,9 @@
4747
</div>
4848
</div>
4949
<div class="flex items-center gap-2 px-1 py-1.5 text-left text-sm justify-between">
50-
<span class="text-muted-foreground">Away</span>
50+
<span class="text-muted-foreground">
51+
{{ t('navigation.away') }}
52+
</span>
5153
<Switch
5254
:checked="
5355
userStore.user.availability_status === 'away' ||
@@ -61,19 +63,20 @@
6163
<DropdownMenuGroup>
6264
<DropdownMenuItem @click.prevent="router.push({ name: 'account' })">
6365
<CircleUserRound size="18" class="mr-2" />
64-
Account
66+
{{ t('navigation.account') }}
6567
</DropdownMenuItem>
6668
</DropdownMenuGroup>
6769
<DropdownMenuSeparator />
6870
<DropdownMenuItem @click="logout">
6971
<LogOut size="18" class="mr-2" />
70-
Log out
72+
{{ t('navigation.logout') }}
7173
</DropdownMenuItem>
7274
</DropdownMenuContent>
7375
</DropdownMenu>
7476
</template>
7577

7678
<script setup>
79+
import { useI18n } from 'vue-i18n'
7780
import {
7881
DropdownMenu,
7982
DropdownMenuContent,
@@ -92,6 +95,7 @@ import { useRouter } from 'vue-router'
9295
9396
const userStore = useUserStore()
9497
const router = useRouter()
98+
const { t } = useI18n()
9599
96100
const logout = () => {
97101
window.location.href = '/logout'

0 commit comments

Comments
 (0)