Merge branch '662-libraries' into 'develop'

#662: Resolve "Add contexts to translatable strings"

See merge request funkwhale/funkwhale!610
This commit is contained in:
Eliot Berriot 2019-02-13 08:15:44 +01:00
commit bb30a9cbb4
8 changed files with 104 additions and 104 deletions

View File

@ -37,15 +37,15 @@
{{ library.size | humanSize }}
</span>
<i class="music icon"></i>
<translate :translate-params="{count: library.uploads_count}" :translate-n="library.uploads_count" translate-plural="%{ count } tracks">%{ count } track</translate>
<translate :translate-context="'Content/Library/Card.List item'" :translate-params="{count: library.uploads_count}" :translate-n="library.uploads_count" translate-plural="%{ count } tracks">%{ count } track</translate>
</div>
</div>
<div class="ui bottom basic attached buttons">
<router-link :to="{name: 'content.libraries.detail.upload', params: {id: library.uuid}}" class="ui button">
<translate>Upload</translate>
<translate :translate-context="'Content/Library/Card.Button.Label/Verb'">Upload</translate>
</router-link>
<router-link :to="{name: 'content.libraries.detail', params: {id: library.uuid}}" exact class="ui button">
<translate>Detail</translate>
<translate :translate-context="'Content/Library/Card.Button.Label/Noun'">Details</translate>
</router-link>
</div>
</div>
@ -55,10 +55,10 @@ export default {
props: ['library'],
computed: {
labels () {
let me = this.$gettext('Visibility: nobody except me')
let instance = this.$gettext('Visibility: everyone on this instance')
let everyone = this.$gettext('Visibility: everyone, including other instances')
let size = this.$gettext('Total size of the files in this library')
let me = this.$pgettext('Content/Library/Card.Help text', 'Visibility: nobody except me')
let instance = this.$pgettext('Content/Library/Card.Help text', 'Visibility: everyone on this instance')
let everyone = this.$pgettext('Content/Library/Card.Help text', 'Visibility: everyone, including other instances')
let size = this.$pgettext('Content/Library/Card.Help text', 'Total size of the files in this library')
return {
tooltips: {

View File

@ -1,33 +1,33 @@
<template>
<section class="ui vertical aligned stripe segment">
<div v-if="isLoadingLibrary" :class="['ui', {'active': isLoadingLibrary}, 'inverted', 'dimmer']">
<div class="ui text loader"><translate>Loading library data</translate></div>
<div class="ui text loader"><translate :translate-context="'Content/Library/Paragraph'">Loading library data</translate></div>
</div>
<detail-area v-else :library="library">
<div class="ui top attached tabular menu">
<a :class="['item', {active: currentTab === 'follows'}]" @click="currentTab = 'follows'"><translate>Followers</translate></a>
<a :class="['item', {active: currentTab === 'tracks'}]" @click="currentTab = 'tracks'"><translate>Tracks</translate></a>
<a :class="['item', {active: currentTab === 'edit'}]" @click="currentTab = 'edit'"><translate>Edit</translate></a>
<a :class="['item', {active: currentTab === 'follows'}]" @click="currentTab = 'follows'"><translate :translate-context="'Content/Library/Tab.Title'">Followers</translate></a>
<a :class="['item', {active: currentTab === 'tracks'}]" @click="currentTab = 'tracks'"><translate :translate-context="'*/*/*'">Tracks</translate></a>
<a :class="['item', {active: currentTab === 'edit'}]" @click="currentTab = 'edit'"><translate :translate-context="'*/*/*/Verb'">Edit</translate></a>
</div>
<div :class="['ui', 'bottom', 'attached', 'segment', {hidden: currentTab != 'follows'}]">
<div class="ui form">
<div class="field">
<label><translate>Sharing link</translate></label>
<p><translate>Share this link with other users so they can request access to your library.</translate></p>
<label><translate :translate-context="'Content/Library/Title'">Sharing link</translate></label>
<p><translate :translate-context="'Content/Library/Paragraph'">Share this link with other users so they can request access to your library.</translate></p>
<copy-input :value="library.fid" />
</div>
</div>
<div class="ui hidden divider"></div>
<div v-if="isLoadingFollows" :class="['ui', {'active': isLoadingFollows}, 'inverted', 'dimmer']">
<div class="ui text loader"><translate>Loading followers</translate></div>
<div class="ui text loader"><translate :translate-context="'Content/Library/Paragraph'">Loading followers</translate></div>
</div>
<table v-else-if="follows && follows.count > 0" class="ui table">
<thead>
<tr>
<th><translate>User</translate></th>
<th><translate>Date</translate></th>
<th><translate>Status</translate></th>
<th><translate>Action</translate></th>
<th><translate :translate-context="'Content/Library/Table.Label'">User</translate></th>
<th><translate :translate-context="'Content/Library/Table.Label'">Date</translate></th>
<th><translate :translate-context="'Content/Library/Table.Label'">Status</translate></th>
<th><translate :translate-context="'Content/Library/Table.Label'">Action</translate></th>
</tr>
</thead>
<tr v-for="follow in follows.results" :key="follow.fid">
@ -35,27 +35,27 @@
<td><human-date :date="follow.creation_date" /></td>
<td>
<span :class="['ui', 'yellow', 'basic', 'label']" v-if="follow.approved === null">
<translate>Pending approval</translate>
<translate :translate-context="'Content/Library/Table/Short'">Pending approval</translate>
</span>
<span :class="['ui', 'green', 'basic', 'label']" v-else-if="follow.approved === true">
<translate>Accepted</translate>
<translate :translate-context="'Content/Library/Table/Short'">Accepted</translate>
</span>
<span :class="['ui', 'red', 'basic', 'label']" v-else-if="follow.approved === false">
<translate>Rejected</translate>
<translate :translate-context="'Content/Library/Table/Short'">Rejected</translate>
</span>
</td>
<td>
<div @click="updateApproved(follow, true)" :class="['ui', 'mini', 'icon', 'labeled', 'green', 'button']" v-if="follow.approved === null || follow.approved === false">
<i class="ui check icon"></i> <translate>Accept</translate>
<i class="ui check icon"></i> <translate :translate-context="'Content/Library/Button.Label'">Accept</translate>
</div>
<div @click="updateApproved(follow, false)" :class="['ui', 'mini', 'icon', 'labeled', 'red', 'button']" v-if="follow.approved === null || follow.approved === true">
<i class="ui x icon"></i> <translate>Reject</translate>
<i class="ui x icon"></i> <translate :translate-context="'Content/Library/Button.Label'">Reject</translate>
</div>
</td>
</tr>
</table>
<p v-else><translate>Nobody is following this library</translate></p>
<p v-else><translate :translate-context="'Content/Library/Paragraph'">Nobody is following this library</translate></p>
</div>
<div :class="['ui', 'bottom', 'attached', 'segment', {hidden: currentTab != 'tracks'}]">
<library-files-table :filters="{library: library.uuid}"></library-files-table>

View File

@ -2,7 +2,7 @@
<div>
<div class="ui stackable grid">
<div class="five wide column">
<h3 class="ui header"><translate>Current library</translate></h3>
<h3 class="ui header"><translate :translate-context="'Content/Library/Title'">Current library</translate></h3>
<library-card :library="library" />
</div>
</div>
@ -21,7 +21,7 @@ export default {
},
computed: {
links () {
let upload = this.$gettext('Upload')
let upload = this.$pgettext('Content/Library/Card.Button.Label/Verb', 'Upload')
return [
{
name: 'libraries.detail.upload',

View File

@ -3,23 +3,23 @@
<div class="ui inline form">
<div class="fields">
<div class="ui six wide field">
<label><translate>Search</translate></label>
<label><translate :translate-context="'Content/Library/Input.Label/Verb'">Search</translate></label>
<form @submit.prevent="search.query = $refs.search.value">
<input name="search" ref="search" type="text" :value="search.query" :placeholder="labels.searchPlaceholder" />
</form>
</div>
<div class="field">
<label><translate>Import status</translate></label>
<label><translate :translate-context="'Content/Library/Dropdown.Label/Noun'">Import status</translate></label>
<select class="ui dropdown" @change="addSearchToken('status', $event.target.value)" :value="getTokenValue('status', '')">
<option value=""><translate>All</translate></option>
<option value="pending"><translate>Pending</translate></option>
<option value="skipped"><translate>Skipped</translate></option>
<option value="errored"><translate>Failed</translate></option>
<option value="finished"><translate>Finished</translate></option>
<option value=""><translate :translate-context="'Content/Library/Dropdown'">All</translate></option>
<option value="pending"><translate :translate-context="'Content/Library/Dropdown'">Pending</translate></option>
<option value="skipped"><translate :translate-context="'Content/Library/Dropdown'">Skipped</translate></option>
<option value="errored"><translate :translate-context="'Content/Library/Dropdown'">Failed</translate></option>
<option value="finished"><translate :translate-context="'Content/Library/Dropdown'">Finished</translate></option>
</select>
</div>
<div class="field">
<label><translate>Ordering</translate></label>
<label><translate :translate-context="'Content/Library/Dropdown.Label/Noun'">Ordering</translate></label>
<select class="ui dropdown" v-model="ordering">
<option v-for="option in orderingOptions" :value="option[0]">
{{ sharedLabels.filters[option[1]] }}
@ -27,10 +27,10 @@
</select>
</div>
<div class="field">
<label><translate>Ordering direction</translate></label>
<label><translate :translate-context="'Content/Library/Dropdown.Label/Noun'">Ordering direction</translate></label>
<select class="ui dropdown" v-model="orderingDirection">
<option value="+"><translate>Ascending</translate></option>
<option value="-"><translate>Descending</translate></option>
<option value="+"><translate :translate-context="'Content/Library/Dropdown'">Ascending</translate></option>
<option value="-"><translate :translate-context="'Content/Library/Dropdown'">Descending</translate></option>
</select>
</div>
</div>
@ -52,13 +52,13 @@
@refresh="fetchData"
:filters="actionFilters">
<template slot="header-cells">
<th><translate>Title</translate></th>
<th><translate>Artist</translate></th>
<th><translate>Album</translate></th>
<th><translate>Upload date</translate></th>
<th><translate>Import status</translate></th>
<th><translate>Duration</translate></th>
<th><translate>Size</translate></th>
<th><translate :translate-context="'*/*/*'">Title</translate></th>
<th><translate :translate-context="'*/*/*'">Artist</translate></th>
<th><translate :translate-context="'*/*/*'">Album</translate></th>
<th><translate :translate-context="'*/*/*/Noun'">Upload date</translate></th>
<th><translate :translate-context="'*/*/*/Noun'">Import status</translate></th>
<th><translate :translate-context="'*/*/*'">Duration</translate></th>
<th><translate :translate-context="'*/*/*'">Size</translate></th>
</template>
<template slot="row-cells" slot-scope="scope">
<template v-if="scope.obj.track">
@ -90,13 +90,13 @@
{{ time.parse(scope.obj.duration) }}
</td>
<td v-else>
<translate>N/A</translate>
<translate :translate-context="'*/*/*'">N/A</translate>
</td>
<td v-if="scope.obj.size">
{{ scope.obj.size | humanSize }}
</td>
<td v-else>
<translate>N/A</translate>
<translate :translate-context="'*/*/*'">N/A</translate>
</td>
</template>
</action-table>
@ -112,7 +112,7 @@
></pagination>
<span v-if="result && result.results.length > 0">
<translate
<translate :translate-context="'Content/Library/Paragraph'"
:translate-params="{start: ((page-1) * paginateBy) + 1, end: ((page-1) * paginateBy) + result.results.length, total: result.count}">
Showing results %{ start }-%{ end } on %{ total }
</translate>
@ -198,23 +198,23 @@ export default {
computed: {
labels () {
return {
searchPlaceholder: this.$gettext('Search by title, artist, album…'),
searchPlaceholder: this.$pgettext('Content/Library/Input.Placeholder', 'Search by title, artist, album…'),
importStatuses: {
skipped: {
label: this.$gettext('Skipped'),
help: this.$gettext('Track already present in one of your libraries'),
label: this.$pgettext('Content/Library/Table/Short', 'Skipped'),
help: this.$pgettext('Content/Library/Help text', 'This track is already present in one of your libraries'),
},
pending: {
label: this.$gettext('Pending'),
help: this.$gettext('Track uploaded, but not processed by the server yet'),
label: this.$pgettext('Content/Library/Table/Short', 'Pending'),
help: this.$pgettext('Content/Library/Help text', 'This track has been uploaded, but hasn\'t been processed by the server yet'),
},
errored: {
label: this.$gettext('Errored'),
help: this.$gettext('Could not process this track, ensure it is tagged correctly'),
label: this.$pgettext('Content/Library/Table/Short', 'Errored'),
help: this.$pgettext('Content/Library/Help text', 'This track could not be processed, please it is tagged correctly'),
},
finished: {
label: this.$gettext('Finished'),
help: this.$gettext('Imported'),
label: this.$pgettext('Content/Library/Table/Short', 'Finished'),
help: this.$pgettext('Content/Library/Help text', 'Imported'),
},
}
}
@ -230,8 +230,8 @@ export default {
}
},
actions () {
let deleteMsg = this.$gettext('Delete')
let relaunchMsg = this.$gettext('Relaunch import')
let deleteMsg = this.$pgettext('Content/Library/Dropdown/Verb', 'Delete')
let relaunchMsg = this.$pgettext('Content/Library/Dropdown/Verb', 'Restart import')
return [
{
name: 'delete',

View File

@ -1,43 +1,43 @@
<template>
<form class="ui form" @submit.prevent="submit">
<p v-if="!library"><translate>Libraries help you organize and share your music collections. You can upload your own music collection to Funkwhale and share it with your friends and family.</translate></p>
<p v-if="!library"><translate :translate-context="'Content/Library/Paragraph'">Libraries help you organize and share your music collections. You can upload your own music collection to Funkwhale and share it with your friends and family.</translate></p>
<div v-if="errors.length > 0" class="ui negative message">
<div class="header"><translate>Error</translate></div>
<div class="header"><translate :translate-context="'Content/Library/Error message.Title'">Error</translate></div>
<ul class="list">
<li v-for="error in errors">{{ error }}</li>
</ul>
</div>
<div class="required field">
<label><translate>Name</translate></label>
<label><translate :translate-context="'Content/Library/Input.Label'">Name</translate></label>
<input name="name" v-model="currentName" :placeholder="labels.namePlaceholder" required maxlength="100">
</div>
<div class="field">
<label><translate>Description</translate></label>
<label><translate :translate-context="'Content/Library/Input.Label'">Description</translate></label>
<textarea v-model="currentDescription" :placeholder="labels.descriptionPlaceholder" maxlength="2000"></textarea>
</div>
<div class="field">
<label><translate>Visibility</translate></label>
<p><translate>You are able to share your library with other people, regardless of its visibility.</translate></p>
<label><translate :translate-context="'Content/Library/Dropdown.Label'">Visibility</translate></label>
<p><translate :translate-context="'Content/Library/Paragraph'">You are able to share your library with other people, regardless of its visibility.</translate></p>
<select class="ui dropdown" v-model="currentVisibilityLevel">
<option :value="c" v-for="c in ['me', 'instance', 'everyone']">{{ labels.visibility[c] }}</option>
</select>
</div>
<button class="ui submit button" type="submit">
<translate v-if="library">Update library</translate>
<translate v-else>Create library</translate>
<translate :translate-context="'Content/Library/Button.Label/Verb'" v-if="library">Update library</translate>
<translate :translate-context="'Content/Library/Button.Label/Verb'" v-else>Create library</translate>
</button>
<dangerous-button v-if="library" class="right floated basic button" color='red' @confirm="remove()">
<translate>Delete</translate>
<translate :translate-context="'Content/Library/Button.Label/Verb'">Delete</translate>
<p slot="modal-header">
<translate>Delete this library?</translate>
<translate :translate-context="'Popup/Library/Title'">Delete this library?</translate>
</p>
<p slot="modal-content">
<translate>
<translate :translate-context="'Popup/Library/Paragraph'">
The library and all its tracks will be deleted. This can not be undone.
</translate>
</p>
<p slot="modal-confirm">
<translate>Delete library</translate>
<translate :translate-context="'Popup/Library/Button.Label/Verb'">Delete library</translate>
</p>
</dangerous-button>
</form>
@ -67,11 +67,11 @@ export default {
},
computed: {
labels () {
let namePlaceholder = this.$gettext('My awesome library')
let descriptionPlaceholder = this.$gettext('This library contains my personal music, I hope you like it.')
let me = this.$gettext('Nobody except me')
let instance = this.$gettext('Everyone on this instance')
let everyone = this.$gettext('Everyone, across all instances')
let namePlaceholder = this.$pgettext('Content/Library/Input.Placeholder', 'My awesome library')
let descriptionPlaceholder = this.$pgettext('Content/Library/Input.Placeholder', 'This library contains my personal music, I hope you like it.')
let me = this.$pgettext('Content/Library/Dropdown', 'Nobody except me')
let instance = this.$pgettext('Content/Library/Dropdown', 'Everyone on this instance')
let everyone = this.$pgettext('Content/Library/Dropdown', 'Everyone, across all instances')
return {
namePlaceholder,
descriptionPlaceholder,
@ -103,10 +103,10 @@ export default {
let msg
if (self.library) {
self.$emit('updated', response.data)
msg = this.$gettext('Library updated')
msg = this.$pgettext('Content/Library/Message', 'Library updated')
} else {
self.$emit('created', response.data)
msg = this.$gettext('Library created')
msg = this.$pgettext('Content/Library/Message', 'Library created')
}
self.$store.commit('ui/addMessage', {
content: msg,
@ -126,7 +126,7 @@ export default {
let self = this
axios.delete(`libraries/${this.library.uuid}/`).then((response) => {
self.isLoading = false
let msg = this.$gettext('Library deleted')
let msg = this.$pgettext('Content/Library/Message', 'Library deleted')
self.$emit('deleted', {})
self.$store.commit('ui/addMessage', {
content: msg,

View File

@ -1,18 +1,18 @@
<template>
<section class="ui vertical aligned stripe segment">
<div v-if="isLoading" :class="['ui', {'active': isLoading}, 'inverted', 'dimmer']">
<div class="ui text loader"><translate>Loading Libraries</translate></div>
<div class="ui text loader"><translate :translate-context="'Content/Library/Paragraph'">Loading Libraries</translate></div>
</div>
<div v-else class="ui text container">
<h1 class="ui header"><translate>My libraries</translate></h1>
<h1 class="ui header"><translate :translate-context="'Content/Library/Title'">My libraries</translate></h1>
<p v-if="libraries.length == 0">
<translate>Looks like you don't have a library, it's time to create one.</translate>
<translate :translate-context="'Content/Library/Paragraph'">Looks like you don't have a library, it's time to create one.</translate>
</p>
<a @click="hiddenForm = !hiddenForm">
<i class="plus icon" v-if="hiddenForm" />
<i class="minus icon" v-else />
<translate>Create a new library</translate>
<translate :translate-context="'Content/Library/Link/Verb'">Create a new library</translate>
</a>
<library-form :library="null" v-if="!hiddenForm" @created="libraryCreated" />
<div class="ui hidden divider"></div>

View File

@ -1,15 +1,15 @@
<template>
<div class="ui segment">
<h3 class="ui header"><translate>Current usage</translate></h3>
<h3 class="ui header"><translate :translate-context="'Content/Library/Title'">Current usage</translate></h3>
<div v-if="isLoading" :class="['ui', {'active': isLoading}, 'inverted', 'dimmer']">
<div class="ui text loader"><translate>Loading usage data</translate></div>
<div class="ui text loader"><translate :translate-context="'Content/Library/Paragraph'">Loading usage data</translate></div>
</div>
<div :class="['ui', {'success': progress < 60}, {'yellow': progress >= 60 && progress < 96}, {'error': progress >= 95}, 'progress']">
<div class="bar" :style="{width: `${progress}%`}">
<div class="progress">{{ progress }}%</div>
</div>
<div class="label" v-if="quotaStatus">
<translate :translate-params="{max: humanSize(quotaStatus.max * 1000 * 1000), current: humanSize(quotaStatus.current * 1000 * 1000)}">%{ current } used on %{ max } allowed</translate>
<translate :translate-context="'Content/Library/Paragraph'" :translate-params="{max: humanSize(quotaStatus.max * 1000 * 1000), current: humanSize(quotaStatus.current * 1000 * 1000)}">%{ current } used on %{ max } allowed</translate>
</div>
</div>
<div class="ui hidden divider"></div>
@ -20,24 +20,24 @@
{{ humanSize(quotaStatus.pending * 1000 * 1000) }}
</div>
<div class="label">
<translate>Pending files</translate>
<translate :translate-context="'Content/Library/Label'">Pending files</translate>
</div>
</div>
<div>
<router-link
class="ui basic blue tiny button"
:to="{name: 'content.libraries.files', query: {q: compileTokens([{field: 'status', value: 'pending'}])}}">
<translate>View files</translate>
<translate :translate-context="'Content/Library/Link/Verb'">View files</translate>
</router-link>
<dangerous-button
color="grey"
class="basic tiny"
:action="purgePendingFiles">
<translate>Purge</translate>
<p slot="modal-header"><translate>Purge pending files?</translate></p>
<p slot="modal-content"><translate>Removes uploaded but yet to be processed tracks completely, adding the corresponding data to your quota.</translate></p>
<p slot="modal-confirm"><translate>Purge</translate></p>
<translate :translate-context="'Content/Library/Button.Label/Verb'">Purge</translate>
<p slot="modal-header"><translate :translate-context="'Popup/Library/Title'">Purge pending files?</translate></p>
<p slot="modal-content"><translate :translate-context="'Popup/Library/Paragraph'">Removes uploaded but yet to be processed tracks completely, adding the corresponding data to your quota.</translate></p>
<p slot="modal-confirm"><translate :translate-context="'Popup/Library/Button.Label'">Purge</translate></p>
</dangerous-button>
</div>
</div>
@ -47,23 +47,23 @@
{{ humanSize(quotaStatus.skipped * 1000 * 1000) }}
</div>
<div class="label">
<translate>Skipped files</translate>
<translate :translate-context="'Content/Library/Label'">Skipped files</translate>
</div>
</div>
<div>
<router-link
class="ui basic blue tiny button"
:to="{name: 'content.libraries.files', query: {q: compileTokens([{field: 'status', value: 'skipped'}])}}">
<translate>View files</translate>
<translate :translate-context="'Content/Library/Link/Verb'">View files</translate>
</router-link>
<dangerous-button
color="grey"
class="basic tiny"
:action="purgeSkippedFiles">
<translate>Purge</translate>
<p slot="modal-header"><translate>Purge skipped files?</translate></p>
<p slot="modal-content"><translate>Removes uploaded tracks skipped during the import processes completely, adding the corresponding data to your quota.</translate></p>
<p slot="modal-confirm"><translate>Purge</translate></p>
<translate :translate-context="'Content/Library/Button.Label/Verb'">Purge</translate>
<p slot="modal-header"><translate :translate-context="'Popup/Library/Title'">Purge skipped files?</translate></p>
<p slot="modal-content"><translate :translate-context="'Popup/Library/Paragraph'">Removes uploaded tracks skipped during the import processes completely, adding the corresponding data to your quota.</translate></p>
<p slot="modal-confirm"><translate :translate-context="'Popup/Library/Button.Label'">Purge</translate></p>
</dangerous-button>
</div>
</div>
@ -73,23 +73,23 @@
{{ humanSize(quotaStatus.errored * 1000 * 1000) }}
</div>
<div class="label">
<translate>Errored files</translate>
<translate :translate-context="'Content/Library/Label'">Errored files</translate>
</div>
</div>
<div>
<router-link
class="ui basic blue tiny button"
:to="{name: 'content.libraries.files', query: {q: compileTokens([{field: 'status', value: 'errored'}])}}">
<translate>View files</translate>
<translate :translate-context="'Content/Library/Link/Verb'">View files</translate>
</router-link>
<dangerous-button
color="grey"
class="basic tiny"
:action="purgeErroredFiles">
<translate>Purge</translate>
<p slot="modal-header"><translate>Purge errored files?</translate></p>
<p slot="modal-content"><translate>Removes uploaded tracks that could not be processed by the server completely, adding the corresponding data to your quota.</translate></p>
<p slot="modal-confirm"><translate>Purge</translate></p>
<translate :translate-context="'Content/Library/Button.Label/Verb'">Purge</translate>
<p slot="modal-header"><translate :translate-context="'Popup/Library/Title'">Purge errored files?</translate></p>
<p slot="modal-content"><translate :translate-context="'Popup/Library/Paragraph'">Removes uploaded tracks that could not be processed by the server completely, adding the corresponding data to your quota.</translate></p>
<p slot="modal-confirm"><translate :translate-context="'Popup/Library/Button.Label'">Purge</translate></p>
</dangerous-button>
</div>
</div>

View File

@ -1,7 +1,7 @@
<template>
<div class="ui vertical aligned stripe segment">
<div v-if="isLoadingLibrary" :class="['ui', {'active': isLoadingLibrary}, 'inverted', 'dimmer']">
<div class="ui text loader"><translate>Loading library data</translate></div>
<div class="ui text loader"><translate :translate-context="'Content/Library/Paragraph'">Loading library data</translate></div>
</div>
<detail-area v-else :library="library">
<file-upload :default-import-reference="defaultImportReference" :library="library" />