Skip to content
This repository was archived by the owner on Nov 5, 2023. It is now read-only.

Commit fe75671

Browse files
committed
Add initial i18n work
1 parent 624ced9 commit fe75671

File tree

11 files changed

+211
-57
lines changed

11 files changed

+211
-57
lines changed

app/components/CastReceiver.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
<transcript></transcript>
44
<nav class="navbar fixed-bottom navbar-expand" style="padding:0.5vw 2vw;background:rgba(0,0,0,.2)">
55
<span class="navbar-brand mr-auto text-white" style="opacity:.6">
6-
<img src="/static/img/logo.svg" width="17" height="17" class="d-inline-block" style="position:relative;top:-1px;margin-right:10px" alt="Web Captioner" />
7-
<span class="d-none d-md-inline">Web Captioner</span>
6+
<img src="/static/img/logo.svg" width="17" height="17" class="d-inline-block" style="position:relative;top:-1px;margin-right:10px" />
7+
<span class="d-none d-md-inline">{{$t('app.webCaptioner')}}</span>
88
</span>
99
</nav>
1010
</div>

app/components/Navbar.vue

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,17 @@
1414
</button>
1515
<div class="navbar-brand mr-auto" :class="{'mt-3' : largerLayout}">
1616
<a href="/">
17-
<img src="/static/img/logo.svg" width="20" height="20" class="d-inline-block align-top mr-2" alt="Web Captioner" />
18-
<span class="d-none d-md-inline">Web Captioner</span>
17+
<img src="/static/img/logo.svg" width="20" height="20" class="d-inline-block align-top mr-2" :alt="$t('app.webCaptioner')" />
18+
<span class="d-none d-md-inline">{{$t('app.webCaptioner')}}</span>
1919
</a>
2020
</div>
2121

2222
<!-- Do not remove this from the DOM with v-if. Currently the volume meter needs to exist in order to populate microphoneName. -->
2323
<volume-meter v-bind:hidden="!captioningOn || waitingForInitialTranscript"></volume-meter>
2424

2525
<div v-if="waitingForInitialTranscript" class="navbar-text small text-primary mr-3">
26-
Listening<span v-if="microphoneName"> to "{{microphoneName}}"</span>
26+
<span v-if="microphoneName">{{$t('navbar.captioner.listeningToMicrophone', {microphoneName})}}</span>
27+
<span v-else>{{$t('navbar.captioner.listening')}}</span>
2728
</div>
2829
<transition name="fade">
2930
<cast-button></cast-button>
@@ -74,9 +75,9 @@
7475
<b-button id="startCaptioningDropdown" :class="incompatibleBrowser ? 'button-only-disabled' : ''" :variant="captioningToggleButtonVariant" @click="captioningToggleButtonClick">
7576
<div :class="{'px-4 py-2' : largerLayout}">
7677
<span v-if="!this.captioningOn">
77-
<fa icon="microphone" /> <span v-show="!typingModeOn"> Start Captioning</span>
78+
<fa icon="microphone" /> <span v-show="!typingModeOn"> {{$t('navbar.captioner.startCaptioning')}}</span>
7879
</span>
79-
<span v-else>Stop Captioning</span> <kbd v-show="largerLayout" class="small ml-3">c</kbd>
80+
<span v-else>{{$t('navbar.captioner.stopCaptioning')}}</span> <kbd v-show="largerLayout" class="small ml-3">c</kbd>
8081
</div>
8182
</b-button>
8283
<b-button v-show="experiments.includes('typingMode') && !typingModeOn" variant="primary" v-b-tooltip.top title="Start Typing (t)" @click="startTypingMode">
@@ -86,20 +87,20 @@
8687
<fa icon="keyboard"/> Done Typing <kbd>ESC</kbd>
8788
</b-btn>
8889
<b-dropdown dropup right :variant="captioningToggleButtonVariant">
89-
<b-dropdown-item href="/" target="_blank">About</b-dropdown-item>
90-
<b-dropdown-item href="/blog" target="_blank">Blog</b-dropdown-item>
91-
<b-dropdown-item href="/help" target="_blank">Help Center</b-dropdown-item>
92-
<b-dropdown-item href="/community" target="_blank">Community</b-dropdown-item>
93-
<b-dropdown-item href="/donate" target="_blank">Donate</b-dropdown-item>
90+
<b-dropdown-item href="/" target="_blank">{{$t('navbar.menu.about')}}</b-dropdown-item>
91+
<b-dropdown-item href="/blog" target="_blank">{{$t('navbar.menu.blog')}}</b-dropdown-item>
92+
<b-dropdown-item href="/help" target="_blank">{{$t('navbar.menu.helpCenter')}}</b-dropdown-item>
93+
<b-dropdown-item href="/community" target="_blank">{{$t('navbar.menu.community')}}</b-dropdown-item>
94+
<b-dropdown-item href="/donate" target="_blank">{{$t('navbar.menu.donate')}}</b-dropdown-item>
9495
<div class="dropdown-divider"></div>
95-
<b-dropdown-item href="/feedback" target="_blank">Feedback</b-dropdown-item>
96+
<b-dropdown-item href="/feedback" target="_blank">{{$t('navbar.menu.feedback')}}</b-dropdown-item>
9697
<div class="dropdown-divider"></div>
97-
<b-dropdown-item @click="startDetachedMode" class="dropdown-item" v-b-tooltip.left title="Show captions in a new window"><fa icon="external-link-alt" fixed-width class="mr-1" /> New Window</b-dropdown-item>
98+
<b-dropdown-item @click="startDetachedMode" class="dropdown-item" v-b-tooltip.left title="Show captions in a new window"><fa icon="external-link-alt" fixed-width class="mr-1" /> {{$t('navbar.menu.newWindow')}}</b-dropdown-item>
9899
<div class="dropdown-divider"></div>
99-
<b-dropdown-item to="/captioner/save-to-file" replace><fa icon="save" class="mr-1" fixed-width /> Save to File</b-dropdown-item>
100-
<b-dropdown-item to="/captioner/clear" replace><fa icon="trash-alt" class="mr-1" fixed-width /> Clear...</b-dropdown-item>
100+
<b-dropdown-item to="/captioner/save-to-file" replace><fa icon="save" class="mr-1" fixed-width /> {{$t('navbar.menu.saveToFile')}}</b-dropdown-item>
101+
<b-dropdown-item to="/captioner/clear" replace><fa icon="trash-alt" class="mr-1" fixed-width /> {{$t('navbar.menu.clear')}}</b-dropdown-item>
101102
<div class="dropdown-divider"></div>
102-
<b-dropdown-item to="/captioner/settings" class="dropdown-item"><fa icon="cog" class="mr-1" fixed-width /> Settings</b-dropdown-item>
103+
<b-dropdown-item to="/captioner/settings" class="dropdown-item"><fa icon="cog" class="mr-1" fixed-width /> {{$t('navbar.menu.settings')}}</b-dropdown-item>
103104
</b-dropdown>
104105
</b-button-group>
105106
</div> <!-- bottom row in big UI mode -->

app/components/ReceiverSplash.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
</div>
2020
<div class="h-25 d-flex align-items-center " style="position:absolute;left:7vw;right:0;bottom:0">
2121
<div class="h2 logo-container">
22-
<img src="/static/img/logo-wordmark-inverse.svg" class="d-inline-block" alt="Web Captioner" />
22+
<img src="/static/img/logo-wordmark-inverse.svg" class="d-inline-block" :alt="$t('app.webCaptioner')" />
2323
</div>
2424
</div>
2525
</div>

app/lang/en-US.js

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
export default {
2+
common: {
3+
ok: 'Ok',
4+
cancel: 'Cancel',
5+
},
6+
app: {
7+
webCaptioner: 'Web Captioner',
8+
description: 'Real-time captioning for your event, speech, classroom lecture, or church service.',
9+
},
10+
navbar: {
11+
captioner: {
12+
startCaptioning: 'Start Captioning',
13+
stopCaptioning: 'Stop Captioning',
14+
listeningToMicrophone: 'Listening to "{microphoneName}"',
15+
},
16+
menu: {
17+
about: '@:settings.about.about',
18+
blog: 'Blog',
19+
helpCenter: 'Help Center',
20+
community: 'Community',
21+
donate: 'Donate',
22+
feedback: 'Feedback',
23+
newWindow: 'New Window',
24+
saveToFile: 'Save to File',
25+
clear: 'Clear...',
26+
settings: 'Settings',
27+
},
28+
},
29+
settings: {
30+
settings: 'settings',
31+
about: {
32+
about: 'About',
33+
learnMore: 'Learn More',
34+
whatsNew: "What's New",
35+
},
36+
eventLog: {
37+
eventLog: 'Event Log',
38+
},
39+
experiments: {
40+
experiments: 'Experiments',
41+
},
42+
appearance: {
43+
appearance: 'Appearance',
44+
},
45+
censor: {
46+
censor: 'Censor',
47+
},
48+
controls: {
49+
controls: 'Controls',
50+
},
51+
language: {
52+
language: 'Language',
53+
},
54+
remoteDisplays: {
55+
remoteDisplays: 'Remote Displays',
56+
},
57+
wordReplacements: {
58+
wordReplacements: 'Word Replacements',
59+
},
60+
vmix: {
61+
vmix: 'vMix',
62+
},
63+
webhooks: {
64+
webhooks: 'Webhooks',
65+
},
66+
exportRestore: {
67+
exportRestoreSettings: 'Export/Restore Settings',
68+
69+
restore: 'Restore',
70+
restoreDescription: 'Restore settings (appearance, censor settings, word replacements, vMix settings, etc.) from a settings file you previously exported.',
71+
restoreSettingsQuestion: 'Restore settings from this file?',
72+
somethingWrongWithFile: "It looks like something's wrong with that file.",
73+
restoredSettings: 'Settings Restored',
74+
75+
reset: 'Reset',
76+
resetDescription: 'Reset all of your settings.',
77+
resetSettingsQuestion: 'Reset all your settings?',
78+
settingsWillBeLost: 'All of your current settings will be lost.',
79+
settingsReset: 'Settings Reset',
80+
81+
export: 'Export',
82+
exportDescription: 'Your settings will be saved locally as a JSON file.',
83+
},
84+
}
85+
}

app/nuxt.config.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,18 @@ module.exports = {
3535
],
3636
}],
3737
['bootstrap-vue/nuxt', { css: false }],
38+
['nuxt-i18n', {
39+
defaultLocale: 'en',
40+
locales: [
41+
{
42+
code: 'en',
43+
file: 'en-US.js',
44+
iso: 'en-US',
45+
},
46+
],
47+
lazy: true,
48+
langDir: 'lang/'
49+
}],
3850
['@nuxtjs/sentry'],
3951
['@nuxtjs/google-analytics', {
4052
id: 'REMOVED',

app/package-lock.json

Lines changed: 55 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
"normalize-strings": "^1.1.0",
5454
"nuxt-env": "0.0.3",
5555
"nuxt-fontawesome": "^0.3.0",
56+
"nuxt-i18n": "^5.3.0",
5657
"promise-polyfill": "^8.1.0",
5758
"sass-loader": "^7.1.0",
5859
"screenfull": "^3.3.2",

app/pages/captioner/settings.vue

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -50,36 +50,36 @@
5050
<div class="row h-100">
5151
<div class="col-lg-9 col-xl-7 ml-auto mb-5">
5252
<div class="position-sticky" style="top:20px">
53-
<h2 class="d-none d-sm-block lead pl-3 text-dark" style="padding-top:.6rem">Settings</h2>
53+
<h2 class="d-none d-sm-block lead pl-3 text-dark" style="padding-top:.6rem">{{$t('settings.settings')}}</h2>
5454
<nav>
5555
<b-nav vertical pills>
56-
<b-nav-item to="/captioner/settings/about">About</b-nav-item>
56+
<b-nav-item to="/captioner/settings/about">{{$t('settings.about.about')}}</b-nav-item>
5757
<b-nav-item v-if="eventLog" to="/captioner/settings/event-log">
58-
Event Log <span v-if="eventLogStopTime">({{logTimeRemainingMinutes}}:{{logTimeRemainingSeconds}})</span>
58+
{{$t('settings.eventLog.eventLog')}} <span v-if="eventLogStopTime">({{logTimeRemainingMinutes}}:{{logTimeRemainingSeconds}})</span>
5959
<b-badge variant="light" class="nav-badge">
6060
{{eventLogCount}} <span class="sr-only">events</span>
6161
</b-badge>
6262
</b-nav-item>
63-
<b-nav-item class="nav-item-rainbow" v-if="experiments.length || currentlyOnExperiments" to="/captioner/settings/experiments"><fa icon="flask" /> Experiments</b-nav-item>
63+
<b-nav-item class="nav-item-rainbow" v-if="experiments.length || currentlyOnExperiments" to="/captioner/settings/experiments"><fa icon="flask" /> {{$t('settings.experiments.experiments')}}</b-nav-item>
6464
</b-nav>
6565
<hr/>
6666
<b-nav vertical pills>
67-
<b-nav-item to="/captioner/settings/appearance">Appearance</b-nav-item>
68-
<b-nav-item to="/captioner/settings/censor">Censor</b-nav-item>
69-
<b-nav-item to="/captioner/settings/controls">Controls</b-nav-item>
70-
<b-nav-item to="/captioner/settings/language">Language</b-nav-item>
71-
<b-nav-item v-if="experiments.includes('remoteDisplays')" to="/captioner/settings/remote-displays">Remote Displays</b-nav-item>
72-
<b-nav-item to="/captioner/settings/word-replacements">Word Replacements</b-nav-item>
67+
<b-nav-item to="/captioner/settings/appearance">{{$t('settings.appearance.appearance')}}</b-nav-item>
68+
<b-nav-item to="/captioner/settings/censor">{{$t('settings.censor.censor')}}</b-nav-item>
69+
<b-nav-item to="/captioner/settings/controls">{{$t('settings.controls.controls')}}</b-nav-item>
70+
<b-nav-item to="/captioner/settings/language">{{$t('settings.language.language')}}</b-nav-item>
71+
<b-nav-item v-if="experiments.includes('remoteDisplays')" to="/captioner/settings/remote-displays">{{$t('settings.remoteDisplays.remoteDisplays')}}</b-nav-item>
72+
<b-nav-item to="/captioner/settings/word-replacements">{{$t('settings.wordReplacements.wordReplacements')}}</b-nav-item>
7373
<!-- <b-nav-item to="/captioner/settings/title-cards">Title Cards</b-nav-item> -->
7474
</b-nav>
7575
<hr/>
7676
<b-nav vertical pills>
77-
<b-nav-item to="/captioner/settings/vmix">vMix</b-nav-item>
78-
<b-nav-item v-if="experiments.includes('webhooks')" to="/captioner/settings/webhooks">Webhooks</b-nav-item>
77+
<b-nav-item to="/captioner/settings/vmix">{{$t('settings.vmix.vmix')}}</b-nav-item>
78+
<b-nav-item v-if="experiments.includes('webhooks')" to="/captioner/settings/webhooks">{{$t('settings.webhooks.webhooks')}}</b-nav-item>
7979
</b-nav>
8080
<hr/>
8181
<b-nav vertical pills>
82-
<b-nav-item class="small" to="/captioner/settings/export-restore">Export/Restore Settings</b-nav-item>
82+
<b-nav-item class="small" to="/captioner/settings/export-restore">{{$t('settings.exportRestore.exportRestoreSettings')}}</b-nav-item>
8383
</b-nav>
8484
</nav>
8585
</div>

app/pages/captioner/settings/about/index.vue

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
<div class="col-sm-8 col-md-9">
1010
<div class="d-flex align-items-center h-100">
1111
<div>
12-
<h3>Web Captioner</h3>
13-
<p class="lead mb-2">Real-time captioning for your event, speech, classroom lecture, or church service.</p>
14-
<p class="mb-0 small"><a href="/">Learn More</a> &middot; <a href="/help">Help Center</a><span class="d-none d-md-inline"> &middot; </span><br class="d-md-none"/> <a href="/blog">Blog</a> &middot; <a href="/donate">Donate</a></p>
12+
<h3>{{$t('app.webCaptioner')}}</h3>
13+
<p class="lead mb-2">{{$t('app.description')}}</p>
14+
<p class="mb-0 small"><a href="/">{{$t('settings.about.learnMore')}}</a> &middot; <a href="/help">{{$t('navbar.menu.helpCenter')}}</a><span class="d-none d-md-inline"> &middot; </span><br class="d-md-none"/> <a href="/blog">{{$t('navbar.menu.blog')}}</a> &middot; <a href="/donate">{{$t('navbar.menu.donate')}}</a></p>
1515
</div>
1616
</div>
1717
</div>
@@ -20,7 +20,7 @@
2020
</div>
2121
<hr class="my-4" />
2222

23-
<h2>What's New</h2>
23+
<h2>{{$t('settings.about.whatsNew')}}</h2>
2424
<whats-new/>
2525

2626
</div>

app/pages/captioner/settings/controls/index.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
<b-button variant="info" disabled>Save to File</b-button>
2727
</div>
2828
<div class="d-flex w-100 align-items-center">
29-
<img src="/static/img/logo.svg" width="8" height="8" alt="Web Captioner" class="align-middle mr-auto" />
29+
<img src="/static/img/logo.svg" width="8" height="8" class="align-middle mr-auto" />
3030
<b-dropdown variant="primary" split text="Start Captioning" disabled></b-dropdown>
3131
</div>
3232
</b-navbar>

0 commit comments

Comments
 (0)