mirror of
https://github.com/unraid/api.git
synced 2026-01-02 22:50:02 -06:00
feat: i18n web components
This commit is contained in:
25
.vscode/i18n-ally-reviews.yml
vendored
Normal file
25
.vscode/i18n-ally-reviews.yml
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
# Review comments generated by i18n-ally. Please commit this file.
|
||||
|
||||
reviews:
|
||||
A Trial key provides all the functionality of a Pro Registration key.__i18n_ally_root__:
|
||||
locales:
|
||||
en:
|
||||
comments:
|
||||
- user:
|
||||
name: Zack Spear
|
||||
email: hi@zackspear.com
|
||||
id: fQUUi06la1A14pi2N_NaC
|
||||
comment: ''
|
||||
suggestion: ''
|
||||
type: approve
|
||||
time: '2023-08-01T19:50:10.287Z'
|
||||
ja:
|
||||
comments:
|
||||
- user:
|
||||
name: Zack Spear
|
||||
email: hi@zackspear.com
|
||||
id: sql4zp9G9ouToZg6V9_Eb
|
||||
comment: ''
|
||||
suggestion: ''
|
||||
type: approve
|
||||
time: '2023-08-01T19:50:23.907Z'
|
||||
6
.vscode/settings.json
vendored
6
.vscode/settings.json
vendored
@@ -22,5 +22,9 @@
|
||||
"titleBar.inactiveBackground": "#5f606399",
|
||||
"titleBar.inactiveForeground": "#e7e7e799"
|
||||
},
|
||||
"peacock.color": "#5f6063"
|
||||
"peacock.color": "#5f6063",
|
||||
"i18n-ally.localesPaths": [
|
||||
"locales"
|
||||
],
|
||||
"i18n-ally.keystyle": "flat"
|
||||
}
|
||||
@@ -29,7 +29,7 @@ const randomGuid = `1111-1111-${makeid(4)}-123412341234`; // this guid is regist
|
||||
// EBLACKLISTED1
|
||||
// EBLACKLISTED2
|
||||
// ENOCONN
|
||||
const state: ServerState = 'BASIC';
|
||||
const state: ServerState = 'EGUID';
|
||||
|
||||
const uptime = Date.now() - 60 * 60 * 1000; // 1 hour ago
|
||||
let expireTime = 0;
|
||||
@@ -54,10 +54,10 @@ export const serverState: Server = {
|
||||
// keyfile: 'DUMMY_KEYFILE',
|
||||
lanIp: '192.168.254.36',
|
||||
license: '',
|
||||
locale: 'en_US',
|
||||
locale: 'en_US', // en_US, ja
|
||||
name: 'fuji',
|
||||
connectPluginInstalled: 'dynamix.unraid.net.staging.plg',
|
||||
// connectPluginInstalled: '',
|
||||
// connectPluginInstalled: 'dynamix.unraid.net.staging.plg',
|
||||
connectPluginInstalled: '',
|
||||
registered: false,
|
||||
regGen: 0,
|
||||
// "regGuid": "0781-5583-8355-81071A2B0211",
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
<script lang="ts" setup>
|
||||
import { storeToRefs } from 'pinia';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
|
||||
import { useServerStore } from '~/store/server';
|
||||
import 'tailwindcss/tailwind.css';
|
||||
import '~/assets/main.css';
|
||||
|
||||
const { t } = useI18n();
|
||||
|
||||
const serverStore = useServerStore();
|
||||
const { authAction, stateData } = storeToRefs(serverStore);
|
||||
</script>
|
||||
@@ -12,14 +15,14 @@ const { authAction, stateData } = storeToRefs(serverStore);
|
||||
<template>
|
||||
<div class="whitespace-normal flex flex-col gap-y-16px max-w-3xl">
|
||||
<span v-if="stateData.error" class="text-unraid-red font-semibold leading-8">
|
||||
<h3 class="text-14px mb-8px">{{ stateData.heading }}</h3>
|
||||
<h3 class="text-14px mb-8px">{{ t(stateData.heading) }}</h3>
|
||||
<span v-html="stateData.message" />
|
||||
</span>
|
||||
<span>
|
||||
<BrandButton
|
||||
v-if="authAction"
|
||||
:icon="authAction.icon"
|
||||
:text="authAction.text"
|
||||
:text="t(authAction.text)"
|
||||
@click="authAction.click()"
|
||||
/>
|
||||
</span>
|
||||
|
||||
@@ -1,11 +1,15 @@
|
||||
<script setup lang="ts">
|
||||
import { storeToRefs } from 'pinia';
|
||||
import { ArrowDownTrayIcon, ArrowTopRightOnSquareIcon } from '@heroicons/vue/24/solid';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
|
||||
import { DEV_GRAPH_URL, CONNECT_FORUMS, CONTACT, DISCORD } from '~/helpers/urls';
|
||||
import { useServerStore } from '~/store/server';
|
||||
import 'tailwindcss/tailwind.css';
|
||||
import '~/assets/main.css';
|
||||
|
||||
const { t } = useI18n();
|
||||
|
||||
const { apiKey } = storeToRefs(useServerStore());
|
||||
|
||||
const downloadUrl = computed(() => new URL(`/graphql/api/logs?apiKey=${apiKey.value}`, DEV_GRAPH_URL || window.location.origin));
|
||||
@@ -14,7 +18,9 @@ const downloadUrl = computed(() => new URL(`/graphql/api/logs?apiKey=${apiKey.va
|
||||
<template>
|
||||
<div class="whitespace-normal flex flex-col gap-y-16px max-w-3xl">
|
||||
<span class="leading-8">
|
||||
The primary method of support for Unraid Connect is through our forums and Discord. If you are asked to supply logs, please open a support request on our Contact Page and reply to the email message you receive with your logs attached. The logs may contain sensitive information so do not post them publicly.
|
||||
{{ t('The primary method of support for Unraid Connect is through our forums and Discord.') }}
|
||||
{{ t('If you are asked to supply logs, please open a support request on our Contact Page and reply to the email message you receive with your logs attached.') }}
|
||||
{{ t('The logs may contain sensitive information so do not post them publicly.') }}
|
||||
</span>
|
||||
<span class="flex flex-col gap-y-16px">
|
||||
<div class="flex">
|
||||
@@ -24,21 +30,21 @@ const downloadUrl = computed(() => new URL(`/graphql/api/logs?apiKey=${apiKey.va
|
||||
:external="true"
|
||||
:href="downloadUrl.toString()"
|
||||
:icon="ArrowDownTrayIcon"
|
||||
:text="'Download unraid-api Logs'"
|
||||
:text="t('Download unraid-api Logs')"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="flex flex-row items-baseline gap-8px">
|
||||
<a :href="CONNECT_FORUMS" target="_blank" rel="noopener noreferrer" class="text-[#486dba] hover:text-[#3b5ea9] focus:text-[#3b5ea9] hover:underline focus:underline inline-flex flex-row items-center justify-start gap-8px">
|
||||
Unraid Connect Forums
|
||||
{{ t('Unraid Connect Forums') }}
|
||||
<ArrowTopRightOnSquareIcon class="w-16px" />
|
||||
</a>
|
||||
<a :href="DISCORD" target="_blank" rel="noopener noreferrer" class="text-[#486dba] hover:text-[#3b5ea9] focus:text-[#3b5ea9] hover:underline focus:underline inline-flex flex-row items-center justify-start gap-8px">
|
||||
Unraid Discord
|
||||
{{ t('Unraid Discord') }}
|
||||
<ArrowTopRightOnSquareIcon class="w-16px" />
|
||||
</a>
|
||||
<a :href="CONTACT" target="_blank" rel="noopener noreferrer" class="text-[#486dba] hover:text-[#3b5ea9] focus:text-[#3b5ea9] hover:underline focus:underline inline-flex flex-row items-center justify-start gap-8px">
|
||||
Unraid Contact Page
|
||||
{{ t('Unraid Contact Page') }}
|
||||
<ArrowTopRightOnSquareIcon class="w-16px" />
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@@ -2,38 +2,31 @@
|
||||
import { provide } from 'vue';
|
||||
import { createI18n, I18nInjectionKey } from 'vue-i18n';
|
||||
|
||||
/**
|
||||
* Define the web components that host the i18n instance.
|
||||
*
|
||||
* Because the web components environment isn't hosted in a Vue apps by `createApp`, but is provided by itself.
|
||||
* The i18n instance created by `createI18n` will be installed with `app.use` in Vue apps,
|
||||
* so that you can use i18n features with `useI18n` in Vue components.
|
||||
* In order to use `useI18n` in web components, you need to have web components hosted as root to use it.
|
||||
*/
|
||||
import en_US from '~/locales/en_US.json'; // eslint-disable-line camelcase
|
||||
import ja from '~/locales/ja.json';
|
||||
|
||||
/**
|
||||
* create an i18n instance to host for other web components
|
||||
*/
|
||||
const defaultLocale = 'ja'; // ja, en_US
|
||||
const i18n = createI18n<false>({
|
||||
legacy: false, // must set to `false`
|
||||
locale: 'en',
|
||||
locale: defaultLocale,
|
||||
messages: {
|
||||
en: {
|
||||
hello: 'Hello!'
|
||||
},
|
||||
ja: {
|
||||
hello: 'こんにちは!'
|
||||
}
|
||||
en_US, // eslint-disable-line camelcase
|
||||
ja,
|
||||
}
|
||||
});
|
||||
/**
|
||||
* provide i18n instance with `I18nInjectionKey` for other web components
|
||||
*/
|
||||
|
||||
provide(I18nInjectionKey, i18n);
|
||||
|
||||
// watchEffect(() => {
|
||||
// i18n.global.locale.value = props.locale;
|
||||
// });
|
||||
export interface Props {
|
||||
locale?: string;
|
||||
}
|
||||
const props = withDefaults(defineProps<Props>(), {
|
||||
locale: defaultLocale,
|
||||
});
|
||||
|
||||
watchEffect(() => {
|
||||
i18n.global.locale.value = props.locale;
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
<script lang="ts" setup>
|
||||
import { storeToRefs } from 'pinia';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
|
||||
import { useServerStore } from '~/store/server';
|
||||
import 'tailwindcss/tailwind.css';
|
||||
import '~/assets/main.css';
|
||||
|
||||
const { t } = useI18n();
|
||||
const { keyActions } = storeToRefs(useServerStore());
|
||||
</script>
|
||||
|
||||
@@ -12,11 +15,11 @@ const { keyActions } = storeToRefs(useServerStore());
|
||||
<li v-for="action in keyActions" :key="action.name">
|
||||
<BrandButton
|
||||
class="w-full max-w-300px"
|
||||
@click="action.click()"
|
||||
:external="action?.external"
|
||||
:href="action?.href"
|
||||
:icon="action.icon"
|
||||
:text="action.text"
|
||||
:text="t(action.text)"
|
||||
@click="action.click()"
|
||||
/>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
@@ -10,14 +10,17 @@ export interface Props {
|
||||
open?: boolean;
|
||||
showCloseX?: boolean;
|
||||
success?: boolean;
|
||||
t: any;
|
||||
title?: string;
|
||||
}
|
||||
const props = withDefaults(defineProps<Props>(), {
|
||||
description: '',
|
||||
error: false,
|
||||
maxWidth: 'sm:max-w-lg',
|
||||
open: false,
|
||||
showCloseX: false,
|
||||
success: false,
|
||||
title: '',
|
||||
});
|
||||
watchEffect(() => {
|
||||
// toggle body scrollability
|
||||
@@ -63,7 +66,7 @@ const ariaLablledById = computed((): string|undefined => props.title ? `ModalTit
|
||||
>
|
||||
<div
|
||||
class="fixed inset-0 z-0 bg-black bg-opacity-80 transition-opacity"
|
||||
title="Click to close modal"
|
||||
:title="t('Click to close modal')"
|
||||
@click="closeModal"
|
||||
/>
|
||||
</TransitionChild>
|
||||
@@ -89,7 +92,7 @@ const ariaLablledById = computed((): string|undefined => props.title ? `ModalTit
|
||||
>
|
||||
<div v-if="showCloseX" class="absolute z-20 right-0 top-0 hidden pt-2 pr-2 sm:block">
|
||||
<button type="button" class="rounded-md text-beta bg-alpha p-2 hover:text-white focus:text-white hover:bg-unraid-red focus:bg-unraid-red focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2" @click="closeModal">
|
||||
<span class="sr-only">Close</span>
|
||||
<span class="sr-only">{{ t('Close') }}</span>
|
||||
<XMarkIcon class="h-6 w-6" aria-hidden="true" />
|
||||
</button>
|
||||
</div>
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<script setup lang="ts">
|
||||
import { storeToRefs } from 'pinia';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
|
||||
import 'tailwindcss/tailwind.css';
|
||||
import '~/assets/main.css';
|
||||
|
||||
@@ -7,6 +9,8 @@ import { useCallbackActionsStore } from '~/store/callbackActions';
|
||||
import { usePromoStore } from '~/store/promo';
|
||||
import { useTrialStore } from '~/store/trial';
|
||||
|
||||
const { t } = useI18n();
|
||||
|
||||
const { callbackStatus } = storeToRefs(useCallbackActionsStore());
|
||||
const { promoVisible } = storeToRefs(usePromoStore());
|
||||
const { trialModalVisible } = storeToRefs(useTrialStore());
|
||||
@@ -14,9 +18,9 @@ const { trialModalVisible } = storeToRefs(useTrialStore());
|
||||
|
||||
<template>
|
||||
<div class="relative z-[99999]">
|
||||
<UpcCallbackFeedback :open="callbackStatus !== 'ready'" />
|
||||
<UpcPromo :open="promoVisible" />
|
||||
<UpcTrial :open="trialModalVisible" />
|
||||
<UpcCallbackFeedback :t="t" :open="callbackStatus !== 'ready'" />
|
||||
<UpcPromo :t="t" :open="promoVisible" />
|
||||
<UpcTrial :t="t" :open="trialModalVisible" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -24,69 +28,4 @@ const { trialModalVisible } = storeToRefs(useTrialStore());
|
||||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
|
||||
.DropdownWrapper_blip {
|
||||
box-shadow: var(--ring-offset-shadow), var(--ring-shadow), var(--shadow-beta);
|
||||
|
||||
&::before {
|
||||
@apply absolute z-20 block;
|
||||
|
||||
content: '';
|
||||
width: 0;
|
||||
height: 0;
|
||||
top: -10px;
|
||||
right: 42px;
|
||||
border-right: 11px solid transparent;
|
||||
border-bottom: 11px solid var(--color-alpha);
|
||||
border-left: 11px solid transparent;
|
||||
}
|
||||
}
|
||||
|
||||
.unraid_mark_2,
|
||||
.unraid_mark_4 {
|
||||
animation: mark_2 1.5s ease infinite;
|
||||
}
|
||||
.unraid_mark_3 {
|
||||
animation: mark_3 1.5s ease infinite;
|
||||
}
|
||||
.unraid_mark_6,
|
||||
.unraid_mark_8 {
|
||||
animation: mark_6 1.5s ease infinite;
|
||||
}
|
||||
.unraid_mark_7 {
|
||||
animation: mark_7 1.5s ease infinite;
|
||||
}
|
||||
|
||||
@keyframes mark_2 {
|
||||
50% {
|
||||
transform: translateY(-40px);
|
||||
}
|
||||
100% {
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
@keyframes mark_3 {
|
||||
50% {
|
||||
transform: translateY(-62px);
|
||||
}
|
||||
100% {
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
@keyframes mark_6 {
|
||||
50% {
|
||||
transform: translateY(40px);
|
||||
}
|
||||
100% {
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
@keyframes mark_7 {
|
||||
50% {
|
||||
transform: translateY(62px);
|
||||
}
|
||||
100% {
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -12,7 +12,7 @@ import 'tailwindcss/tailwind.css';
|
||||
import '~/assets/main.css';
|
||||
|
||||
export interface Props {
|
||||
server?: Server;
|
||||
server?: Server | string;
|
||||
}
|
||||
const props = defineProps<Props>();
|
||||
|
||||
@@ -95,19 +95,18 @@ const { t } = useI18n();
|
||||
<div class="relative z-10 flex flex-row items-center justify-end gap-x-16px h-full">
|
||||
<h1 class="text-alpha text-14px sm:text-18px relative flex flex-col-reverse items-end md:flex-row border-t-0 border-r-0 border-l-0 border-b-2 border-transparent">
|
||||
<template v-if="description && theme?.descriptionShow">
|
||||
<!-- <span class="text-right text-12px sm:text-18px hidden 2xs:block">{{ description }}</span> -->
|
||||
<span class="text-right text-12px sm:text-18px hidden 2xs:block">{{ t('hello') }}</span>
|
||||
<span class="text-right text-12px sm:text-18px hidden 2xs:block">{{ description }}</span>
|
||||
<span class="text-gamma hidden md:inline-block px-8px">•</span>
|
||||
</template>
|
||||
<button :title="`Click to Copy LAN IP ${lanIp}`" @click="copyLanIp()">
|
||||
<button :title="t('Click to Copy LAN IP %{ip}', { ip: lanIp })" @click="copyLanIp()">
|
||||
{{ name }}
|
||||
</button>
|
||||
<span
|
||||
v-show="copied || showCopyNotSupported"
|
||||
class="text-white text-12px leading-none py-4px px-8px absolute right-0 bg-gradient-to-r from-unraid-red to-orange text-center block rounded"
|
||||
>
|
||||
<template v-if="copied">{{ 'LAN IP Copied' }}</template>
|
||||
<template v-else>LAN IP: <span class="select-all">{{ lanIp }}</span></template>
|
||||
<template v-if="copied">{{ t('LAN IP Copied') }}</template>
|
||||
<template v-else>{{ t('LAN IP %{ip}', { ip: lanIp }) }}</template>
|
||||
</span>
|
||||
</h1>
|
||||
|
||||
|
||||
@@ -13,9 +13,10 @@ import { useServerStore } from '~/store/server';
|
||||
|
||||
export interface Props {
|
||||
open?: boolean;
|
||||
t: any;
|
||||
}
|
||||
|
||||
withDefaults(defineProps<Props>(), {
|
||||
const props = withDefaults(defineProps<Props>(), {
|
||||
open: false,
|
||||
});
|
||||
|
||||
@@ -64,33 +65,33 @@ const showSignInCta = computed(() => connectPluginInstalled.value && !registered
|
||||
const heading = computed(() => {
|
||||
switch (callbackStatus.value) {
|
||||
case 'error':
|
||||
return 'Error';
|
||||
return props.t('Error');
|
||||
case 'loading':
|
||||
return 'Performing actions';
|
||||
return props.t('Performing actions');
|
||||
case 'success':
|
||||
return 'Success!';
|
||||
return props.t('Success!');
|
||||
}
|
||||
});
|
||||
const subheading = computed(() => {
|
||||
if (callbackStatus.value === 'error') {
|
||||
return 'Something went wrong'; /** @todo show actual error messages */
|
||||
return props.t('Something went wrong'); /** @todo show actual error messages */
|
||||
}
|
||||
if (callbackStatus.value === 'loading') { return 'Please keep this window open while we perform some actions'; }
|
||||
if (callbackStatus.value === 'loading') { return props.t('Please keep this window open while we perform some actions'); }
|
||||
if (callbackStatus.value === 'success') {
|
||||
if (accountActionType.value === 'signIn') { return 'You\'re one step closer to enhancing your Unraid experience'; }
|
||||
if (keyActionType.value === 'purchase') { return `Thank you for purchasing an Unraid ${keyType.value} Key!`; }
|
||||
if (keyActionType.value === 'replace') { return `Your ${keyType.value} Key has been replaced!`; }
|
||||
if (keyActionType.value === 'trialExtend') { return 'Your Trial key has been extended!'; }
|
||||
if (keyActionType.value === 'trialStart') { return 'Your free Trial key provides all the functionality of a Pro Registration key'; }
|
||||
if (keyActionType.value === 'upgrade') { return `Thank you for upgrading to an Unraid ${keyType.value} Key!`; }
|
||||
if (accountActionType.value === 'signIn') { return props.t('You\'re one step closer to enhancing your Unraid experience'); }
|
||||
if (keyActionType.value === 'purchase') { return props.t('Thank you for purchasing an Unraid %{keyType} Key!', { keyType: keyType.value }); }
|
||||
if (keyActionType.value === 'replace') { return props.t('Your %{keyType} Key has been replaced!', { keyType: keyType.value }); }
|
||||
if (keyActionType.value === 'trialExtend') { return props.t('Your Trial key has been extended!'); }
|
||||
if (keyActionType.value === 'trialStart') { return props.t('Your free Trial key provides all the functionality of a Pro Registration key'); }
|
||||
if (keyActionType.value === 'upgrade') { return props.t('Thank you for upgrading to an Unraid %{keyType} Key!', { keyType: keyType.value }); }
|
||||
return '';
|
||||
}
|
||||
return '';
|
||||
});
|
||||
|
||||
const closeText = computed(() => {
|
||||
const txt = !connectPluginInstalled.value ? 'No Thanks' : 'Close';
|
||||
return refreshServerStateStatus.value === 'done' ? txt : 'Reload';
|
||||
const txt = !connectPluginInstalled.value ? props.t('No thanks') : props.t('Close');
|
||||
return refreshServerStateStatus.value === 'done' ? txt : props.t('Reload');
|
||||
});
|
||||
const close = () => {
|
||||
if (callbackStatus.value === 'loading') { return console.debug('[close] not allowed'); }
|
||||
@@ -104,11 +105,12 @@ const promoClick = () => {
|
||||
close();
|
||||
};
|
||||
|
||||
const { text, copy, copied, isSupported } = useClipboard({ source: keyUrl.value });
|
||||
const { copy, copied, isSupported } = useClipboard({ source: keyUrl.value });
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<Modal
|
||||
:t="t"
|
||||
:title="heading"
|
||||
:description="subheading"
|
||||
:open="open"
|
||||
@@ -137,14 +139,14 @@ const { text, copy, copied, isSupported } = useClipboard({ source: keyUrl.value
|
||||
<div v-if="isSupported" class="flex justify-center">
|
||||
<BrandButton
|
||||
:icon="ClipboardIcon"
|
||||
:text="copied ? 'Copied' : 'Copy Key URL'"
|
||||
:text="copied ? t('Copied') : t('Copy Key URL')"
|
||||
@click="copy(keyUrl)"
|
||||
/>
|
||||
</div>
|
||||
<p v-else>
|
||||
{{ 'Copy your Key URL' }}: {{ keyUrl }}
|
||||
{{ t('Copy your Key URL: %{keyUrl}', { keyUrl }) }}
|
||||
</p>
|
||||
<p><a href="/Tools/Registration" class="opacity-75 hover:opacity-100 focus:opacity-100 underline transition">{{ 'Then go to Tools > Registration to manually install it' }}</a></p>
|
||||
<p><a href="/Tools/Registration" class="opacity-75 hover:opacity-100 focus:opacity-100 underline transition">{{ t('Then go to Tools > Registration to manually install it') }}</a></p>
|
||||
</template>
|
||||
</UpcCallbackFeedbackStatus>
|
||||
|
||||
@@ -158,13 +160,13 @@ const { text, copy, copied, isSupported } = useClipboard({ source: keyUrl.value
|
||||
<UpcCallbackFeedbackStatus
|
||||
v-if="showPromoCta"
|
||||
:icon="InformationCircleIcon"
|
||||
:text="'Enhance your experience with Unraid Connect'"
|
||||
:text="t('Enhance your experience with Unraid Connect')"
|
||||
/>
|
||||
|
||||
<UpcCallbackFeedbackStatus
|
||||
v-if="showSignInCta"
|
||||
:icon="InformationCircleIcon"
|
||||
:text="'Sign In to utilize Unraid Connect'"
|
||||
:text="t('Sign In to utilize Unraid Connect')"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
@@ -175,7 +177,7 @@ const { text, copy, copied, isSupported } = useClipboard({ source: keyUrl.value
|
||||
<BrandButton
|
||||
v-if="isSettingsPage"
|
||||
:icon="CogIcon"
|
||||
:text="'Configure Connect Features'"
|
||||
:text="t('Configure Connect Features')"
|
||||
class="grow-0"
|
||||
@click="close"
|
||||
/>
|
||||
@@ -183,14 +185,14 @@ const { text, copy, copied, isSupported } = useClipboard({ source: keyUrl.value
|
||||
v-else
|
||||
:href="PLUGIN_SETTINGS"
|
||||
:icon="CogIcon"
|
||||
:text="'Configure Connect Features'"
|
||||
:text="t('Configure Connect Features')"
|
||||
class="grow-0"
|
||||
/>
|
||||
</template>
|
||||
|
||||
<BrandButton
|
||||
v-if="showPromoCta"
|
||||
:text="'Learn More'"
|
||||
:text="t('Learn More')"
|
||||
@click="promoClick"
|
||||
/>
|
||||
|
||||
@@ -198,7 +200,7 @@ const { text, copy, copied, isSupported } = useClipboard({ source: keyUrl.value
|
||||
v-if="showSignInCta"
|
||||
:external="authAction?.external"
|
||||
:icon="authAction?.icon"
|
||||
:text="authAction?.text"
|
||||
:text="t(authAction?.text)"
|
||||
@click="authAction?.click"
|
||||
/>
|
||||
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
* @todo future idea – turn this into a carousel. each feature could have a short video if we ever them
|
||||
*/
|
||||
import { Switch, SwitchGroup, SwitchLabel } from '@headlessui/vue';
|
||||
import { ArrowTopRightOnSquareIcon } from '@heroicons/vue/24/solid';
|
||||
|
||||
import useInstallPlugin from '~/composables/installPlugin';
|
||||
import { usePromoStore } from '~/store/promo';
|
||||
import type { UserProfilePromoFeature } from '~/types/userProfile';
|
||||
@@ -11,6 +13,7 @@ import '~/assets/main.css';
|
||||
|
||||
export interface Props {
|
||||
open?: boolean;
|
||||
t: any;
|
||||
}
|
||||
|
||||
withDefaults(defineProps<Props>(), {
|
||||
@@ -56,18 +59,17 @@ const features = ref<UserProfilePromoFeature[]>([
|
||||
|
||||
const staging = ref(false);
|
||||
const { install } = useInstallPlugin();
|
||||
|
||||
const installButtonClasses = 'text-white text-14px text-center w-full flex flex-row items-center justify-center gap-x-8px px-8px py-8px cursor-pointer rounded-md bg-gradient-to-r from-unraid-red to-orange hover:from-unraid-red/60 hover:to-orange/60 focus:from-unraid-red/60 focus:to-orange/60';
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<Modal
|
||||
title="Introducing Unraid Connect"
|
||||
description="Enhance your Unraid experience"
|
||||
:t="t"
|
||||
:title="t('Introducing Unraid Connect')"
|
||||
:description="t('Enhance your Unraid experience')"
|
||||
:open="open"
|
||||
@close="promoStore.promoHide()"
|
||||
:show-close-x="true"
|
||||
max-width="max-w-800px"
|
||||
@close="promoStore.promoHide()"
|
||||
>
|
||||
<template #headerTitle>
|
||||
<span><UpcBeta class="relative -top-1" /></span>
|
||||
@@ -79,8 +81,8 @@ const installButtonClasses = 'text-white text-14px text-center w-full flex flex-
|
||||
<UpcPromoFeature
|
||||
v-for="(feature, index) in features"
|
||||
:key="index"
|
||||
:title="feature.title"
|
||||
:copy="feature.copy"
|
||||
:title="t(feature.title)"
|
||||
:copy="t(feature.copy)"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -91,27 +93,35 @@ const installButtonClasses = 'text-white text-14px text-center w-full flex flex-
|
||||
<!-- v-if="devEnv" -->
|
||||
<SwitchGroup as="div" class="flex items-center justify-center">
|
||||
<Switch v-model="staging" :class="[staging ? 'bg-indigo-600' : 'bg-gray-200', 'relative inline-flex h-6 w-11 flex-shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2']">
|
||||
<span aria-hidden="true" :class="[staging ? 'translate-x-5' : 'translate-x-0', 'pointer-events-none inline-block h-5 w-5 transform rounded-full bg-white shadow ring-0 transition duration-200 ease-in-out']" />
|
||||
<span aria-hidden="true" :class="[staging ? 't-x-5' : 't-x-0', 'pointer-events-none inline-block h-5 w-5 transform rounded-full bg-white shadow ring-0 transition duration-200 ease-in-out']" />
|
||||
</Switch>
|
||||
<SwitchLabel as="span" class="ml-3 text-12px">
|
||||
<span class="font-semibold">Install Staging</span>
|
||||
</SwitchLabel>
|
||||
</SwitchGroup>
|
||||
<button @click="install({ staging, update: false })" :class="installButtonClasses">{{ staging ? 'Install Connect Staging' : 'Install Connect' }}</button>
|
||||
<button
|
||||
class="text-white text-14px text-center w-full flex flex-row items-center justify-center gap-x-8px px-8px py-8px cursor-pointer rounded-md bg-gradient-to-r from-unraid-red to-orange hover:from-unraid-red/60 hover:to-orange/60 focus:from-unraid-red/60 focus:to-orange/60"
|
||||
@click="install({ staging, update: false })"
|
||||
>
|
||||
{{ staging ? 'Install Connect Staging' : t('Install Connect') }}
|
||||
</button>
|
||||
<div>
|
||||
<a
|
||||
href="https://docs.unraid.net/category/unraid-connect"
|
||||
class="text-12px tracking-wide inline-block mx-8px opacity-60 hover:opacity-100 focus:opacity-100 underline transition"
|
||||
class="text-12px tracking-wide inline-flex flex-row items-center justify-start gap-8px mx-8px opacity-60 hover:opacity-100 focus:opacity-100 underline transition"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
:title="'Checkout the Connect Documentation'"
|
||||
>{{ 'Learn More' }}</a>
|
||||
<button
|
||||
@click="promoStore.promoHide()"
|
||||
class="text-12px tracking-wide inline-block mx-8px opacity-60 hover:opacity-100 focus:opacity-100 underline transition"
|
||||
:title="'Close Promo'"
|
||||
:title="t('Checkout the Connect Documentation')"
|
||||
>
|
||||
{{ 'No thanks' }}
|
||||
{{ t('Learn More') }}
|
||||
<ArrowTopRightOnSquareIcon class="w-16px" />
|
||||
</a>
|
||||
<button
|
||||
class="text-12px tracking-wide inline-block mx-8px opacity-60 hover:opacity-100 focus:opacity-100 underline transition"
|
||||
:title="t('Close')"
|
||||
@click="promoStore.promoHide()"
|
||||
>
|
||||
{{ t('No thanks') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
<script lang="ts" setup>
|
||||
import { storeToRefs } from "pinia";
|
||||
import { useTrialStore } from "~/store/trial";
|
||||
import { storeToRefs } from 'pinia';
|
||||
import { useTrialStore } from '~/store/trial';
|
||||
|
||||
export interface Props {
|
||||
open?: boolean;
|
||||
t: any;
|
||||
}
|
||||
|
||||
withDefaults(defineProps<Props>(), {
|
||||
@@ -14,19 +15,20 @@ const trialStore = useTrialStore();
|
||||
const { trialModalLoading, trialStatus, trialStatusCopy } = storeToRefs(trialStore);
|
||||
|
||||
const close = () => {
|
||||
if (trialStatus.value === 'trialStart') return console.debug("[close] not allowed");
|
||||
if (trialStatus.value === 'trialStart') { return console.debug('[close] not allowed'); }
|
||||
trialStore.setTrialStatus('ready');
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<Modal
|
||||
@close="close"
|
||||
:t="t"
|
||||
:open="open"
|
||||
:title="trialStatusCopy?.heading"
|
||||
:description="trialStatusCopy?.subheading"
|
||||
:show-close-x="!trialModalLoading"
|
||||
max-width="max-w-640px"
|
||||
@close="close"
|
||||
>
|
||||
<template #main>
|
||||
<BrandLoading v-if="trialModalLoading" class="w-[150px] mx-auto my-24px" />
|
||||
@@ -36,11 +38,11 @@ const close = () => {
|
||||
<div class="w-full max-w-xs flex flex-col items-center gap-y-16px mx-auto">
|
||||
<div>
|
||||
<button
|
||||
@click="close"
|
||||
class="text-12px tracking-wide inline-block mx-8px opacity-60 hover:opacity-100 focus:opacity-100 underline transition"
|
||||
:title="'Close Modal'"
|
||||
:title="t('Close Modal')"
|
||||
@click="close"
|
||||
>
|
||||
{{ "Close" }}
|
||||
{{ t('Close') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<script lang="ts" setup>
|
||||
import { storeToRefs } from 'pinia';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
|
||||
import { request } from '~/composables/services/request';
|
||||
import { useServerStore } from '~/store/server';
|
||||
import 'tailwindcss/tailwind.css';
|
||||
@@ -11,6 +13,8 @@ export interface Props {
|
||||
|
||||
const props = defineProps<Props>();
|
||||
|
||||
const { t } = useI18n();
|
||||
|
||||
const { isRemoteAccess } = storeToRefs(useServerStore());
|
||||
|
||||
const wanIp = ref<string | null>();
|
||||
@@ -18,19 +22,18 @@ const fetchError = ref<any>();
|
||||
const loading = ref(false);
|
||||
|
||||
const computedError = computed(() => {
|
||||
if (!props.phpWanIp) return 'DNS issue, unable to resolve wanip4.unraid.net';
|
||||
if (fetchError.value) return fetchError.value;
|
||||
return;
|
||||
if (!props.phpWanIp) { return t('DNS issue, unable to resolve wanip4.unraid.net'); }
|
||||
if (fetchError.value) { return fetchError.value; }
|
||||
});
|
||||
|
||||
onBeforeMount(() => {
|
||||
wanIp.value = sessionStorage.getItem('unraidConnect_wanIp');
|
||||
});
|
||||
|
||||
watch(wanIp, async () => {
|
||||
console.debug('[watch] wanIp');
|
||||
watchEffect(async () => {
|
||||
// if we don't have a client WAN IP AND we have the server WAN IP then we fetch
|
||||
if (!wanIp.value && props.phpWanIp) {
|
||||
console.debug('[watch] wanIp');
|
||||
loading.value = true;
|
||||
|
||||
const response = await request.url('https://wanip4.unraid.net/')
|
||||
@@ -38,26 +41,30 @@ watch(wanIp, async () => {
|
||||
.text();
|
||||
|
||||
if (response) {
|
||||
console.debug('[watch] wanIp response', response);
|
||||
loading.value = false;
|
||||
wanIp.value = response as string; // response returns text nothing to traverse
|
||||
// save in sessionStorage so we only make this request once per webGUI session
|
||||
sessionStorage.setItem('unraidConnect_wanIp', wanIp.value);
|
||||
} else {
|
||||
loading.value = false;
|
||||
fetchError.value = 'Unable to fetch client WAN IPv4';
|
||||
fetchError.value = t('Unable to fetch client WAN IPv4');
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<span v-if="loading" class="italic">{{ 'Checking WAN IPs…' }}</span>
|
||||
<span v-if="loading" class="italic">{{ t('Checking WAN IPs…') }}</span>
|
||||
<template v-else>
|
||||
<span v-if="computedError" class="text-unraid-red font-semibold">{{ computedError }}</span>
|
||||
<template v-else>
|
||||
<span v-if="isRemoteAccess">{{ `Remark: your WAN IPv4 is ${wanIp}` }}</span>
|
||||
<span v-else-if="phpWanIp === wanIp && !isRemoteAccess">{{ `Remark: your WAN IPv4 is ${wanIp}` }}</span>
|
||||
<span v-else class="inline-block w-1/2 whitespace-normal">Remark: Unraid's WAN IPv4 <strong>{{ phpWanIp }}</strong> does not match your client's WAN IPv4 <strong>{{ wanIp }}</strong>. This may indicate a complex network that will not work with this Remote Access solution. Ignore this message if you are currently connected via Remote Access or VPN.</span>
|
||||
<span v-if="isRemoteAccess || phpWanIp === wanIp && !isRemoteAccess">{{ t('Remark: your WAN IPv4 is %{ip}', { ip: wanIp }) }}</span>
|
||||
<span v-else class="inline-block w-1/2 whitespace-normal">
|
||||
{{ t("Remark: Unraid's WAN IPv4 %{phpWanIp} does not match your client's WAN IPv4 %{wanIp}.", { phpWanIp, wanIp }) }}
|
||||
{{ t('This may indicate a complex network that will not work with this Remote Access solution.') }}
|
||||
{{ t('Ignore this message if you are currently connected via Remote Access or VPN.') }}
|
||||
</span>
|
||||
</template>
|
||||
</template>
|
||||
</template>
|
||||
|
||||
217
locales/_template.json
Normal file
217
locales/_template.json
Normal file
@@ -0,0 +1,217 @@
|
||||
{
|
||||
"LAN IP": "",
|
||||
"LAN IP %{ip}": "",
|
||||
"LAN IP Copied": "",
|
||||
"Click to Copy LAN IP %{ip}": "",
|
||||
"Trial Key Expired at %{time}": "",
|
||||
"Trial Key Expires at %{time}": "",
|
||||
"Trial Key Expired %{time}": "",
|
||||
"Trial Key Expires in %{time}": "",
|
||||
"Server Up Since %{time}": "",
|
||||
"Uptime %{time}": "",
|
||||
"year": "",
|
||||
"month": "",
|
||||
"day": "",
|
||||
"hour": "",
|
||||
"minute": "",
|
||||
"second": "",
|
||||
"ago": "",
|
||||
"Purchase": "",
|
||||
"Upgrade": "",
|
||||
"Fix Error": "",
|
||||
"Get Started": "",
|
||||
"Trial Expired, see options below": "",
|
||||
"Learn more about the error": "",
|
||||
"Close Dropdown": "",
|
||||
"Open Dropdown": "",
|
||||
"Thank you for installing Connect!": "",
|
||||
"Sign In to your Unraid.net account to get started": "",
|
||||
"Go to Connect": "",
|
||||
"Opens Connect in new tab": "",
|
||||
"Manage Unraid.net Account": "",
|
||||
"Manage Unraid.net Account in new tab": "",
|
||||
"Settings": "",
|
||||
"Go to Connect plugin settings": "",
|
||||
"Enhance your Unraid experience with Connect": "",
|
||||
"Beta": "",
|
||||
"Loading": "",
|
||||
"Restarting unraid-api…": "",
|
||||
"unraid-api is offline": "",
|
||||
"Introducing Unraid Connect": "",
|
||||
"Enhance your Unraid experience": "",
|
||||
"Connected": "",
|
||||
"Dynamic Remote Access": "",
|
||||
"Toggle on/off server accessibility with dynamic remote access.": "",
|
||||
"Automatically turn on UPnP and open a random WAN port on your router at the click of a button and close off access in seconds.": "",
|
||||
"Manage Your Server Within Connect": "",
|
||||
"Servers equipped with a myunraid.net certificate can be managed directly from within the Connect web UI.": "",
|
||||
"Manage multiple servers from your phone, tablet, laptop, or PC in the same browser window.": "",
|
||||
"Deep Linking": "",
|
||||
"The Connect dashboard links to relevant sections of the webgui, allowing quick access to those settings and server sections.": "",
|
||||
"Online Flash Backup": "",
|
||||
"Never ever be left without a backup of your config.": "",
|
||||
"If you need to change flash drives, generate a backup from Connect and be up and running in minutes.": "",
|
||||
"Real-time Monitoring": "",
|
||||
"Get an overview of your server's state, storage space, apps and VMs status, and more.": "",
|
||||
"Customizable Dashboard Tiles": "",
|
||||
"Set custom server tiles how you like and automatically display your server's banner image on your Connect Dashboard.": "",
|
||||
"License Management": "",
|
||||
"Manage your license keys at any time via the My Keys section.": "",
|
||||
"Plus more on the way": "",
|
||||
"All you need is an active internet connection, an Unraid.net account, and the Connect plugin.": "",
|
||||
"Get started by installing the plugin.": "",
|
||||
"Checkout the Connect Documentation": "",
|
||||
"No thanks": "",
|
||||
"Learn more": "",
|
||||
"Install Connect": "",
|
||||
"Close Modal": "",
|
||||
"Close": "",
|
||||
"Reload": "",
|
||||
"Unraid logo animating with a wave like effect": "",
|
||||
"Click to close modal": "",
|
||||
"Error": "",
|
||||
"Performing actions": "",
|
||||
"Success!": "",
|
||||
"Something went wrong": "",
|
||||
"Please keep this window open while we perform some actions": "",
|
||||
"You're one step closer to enhancing your Unraid experience": "",
|
||||
"Thank you for purchasing an Unraid %{keyType} Key!": "",
|
||||
"Your %{keyType} Key has been replaced!": "",
|
||||
"Your Trial key has been extended!": "",
|
||||
"Copied": "",
|
||||
"Copy Key URL": "",
|
||||
"Copy your Key URL": "",
|
||||
"Then go to Tools > Registration to manually install it": "",
|
||||
"Enhance your experience with Unraid Connect": "",
|
||||
"Configure Connect Features": "",
|
||||
"The primary method of support for Unraid Connect is through our forums and Discord.": "",
|
||||
"If you are asked to supply logs, please open a support request on our Contact Page and reply to the email message you receive with your logs attached.": "",
|
||||
"The logs may contain sensitive information so do not post them publicly.": "",
|
||||
"Download unraid-api Logs": "",
|
||||
"Unraid Connect Forums": "",
|
||||
"Unraid Discord": "",
|
||||
"Unraid Contact Page": "",
|
||||
"DNS issue, unable to resolve wanip4.unraid.net": "",
|
||||
"Unable to fetch client WAN IPv4": "",
|
||||
"Checking WAN IPs…": "",
|
||||
"Remark: your WAN IPv4 is %{wanIp}": "",
|
||||
"Remark: Unraid's WAN IPv4 %{phpWanIp} does not match your client's WAN IPv4 %{wanIp}.": "",
|
||||
"This may indicate a complex network that will not work with this Remote Access solution.": "",
|
||||
"Ignore this message if you are currently connected via Remote Access or VPN.": "",
|
||||
"Ready to update Connect account configuration": "",
|
||||
"Signing in %{username}…": "",
|
||||
"Signing out %{username}…": "",
|
||||
"%{username} Signed In Successfully": "",
|
||||
"%{username} Signed Out Successfully": "",
|
||||
"Sign In Failed": "",
|
||||
"Sign Out Failed": "",
|
||||
"Failed to update Connect account configuration": "",
|
||||
"Callback redirect type not present or incorrect": "",
|
||||
"Failed to install key": "",
|
||||
"Ready to Install Key": "",
|
||||
"Installing Extended Trial": "",
|
||||
"Installing Recovered": "",
|
||||
"Installing Replaced": "",
|
||||
"%{txt1} %{keyType} Key…": "",
|
||||
"%{keyType.value} Key %{txt2} Successfully": "",
|
||||
"Failed to %{txt3} %{keyType.value} Key": "",
|
||||
"Purchase Key": "",
|
||||
"Upgrade Key": "",
|
||||
"Recover Key": "",
|
||||
"Redeem Activation Code": "",
|
||||
"Replace Key": "",
|
||||
"Sign In with Unraid.net Account": "",
|
||||
"Sign Out of Unraid.net": "",
|
||||
"Extend Trial": "",
|
||||
"Start Free 30 Day Trial": "",
|
||||
"Go to Management Access Now": "",
|
||||
"Contact Support": "",
|
||||
"Learn More": "",
|
||||
"No Keyfile": "",
|
||||
"Let's Unleash your Hardware!": "",
|
||||
"Your server will not be usable until you purchase a Registration key or install a free 30-day Trial key.": "",
|
||||
"A Trial key provides all the functionality of a Pro Registration key.": "",
|
||||
"Registration keys are bound to your USB Flash boot device serial number (GUID).": "",
|
||||
"Please use a high quality name brand device at least 1GB in size.": "",
|
||||
"Note: USB memory card readers are generally not supported because most do not present unique serial numbers.": "",
|
||||
"Important": "",
|
||||
"Please make sure your server time is accurate to within 5 minutes": "",
|
||||
"Please make sure there is a DNS server specified": "",
|
||||
"Trial": "",
|
||||
"Thank you for choosing Unraid OS!": "",
|
||||
"Your Trial key includes all the functionality and device support of a Pro key.": "",
|
||||
"After your Trial has reached expiration, your server still functions normally until the next time you Stop the array or reboot your server.": "",
|
||||
"At that point you may either purchase a license key or request a Trial extension.": "",
|
||||
"Trial Expired": "",
|
||||
"Your Trial has expired": "",
|
||||
"To continue using Unraid OS you may purchase a license key.": "",
|
||||
"Alternately, you may request a Trial extension.": "",
|
||||
"You have used all your Trial extensions.": "",
|
||||
"Basic": "",
|
||||
"Register for Connect by signing in to your Unraid.net account": "",
|
||||
"To support more storage devices as your server grows, click Upgrade Key.": "",
|
||||
"Plus": "",
|
||||
"Pro": "",
|
||||
"Flash GUID Error": "",
|
||||
"Registration key / USB Flash GUID mismatch": "",
|
||||
"Your Unraid registration key is ineligible for replacement as it has been replaced within the last 12 months.": "",
|
||||
"The license key file does not correspond to the USB Flash boot device.": "",
|
||||
"Please copy the correct key file to the /config directory on your USB Flash boot device or choose Purchase Key.": "",
|
||||
"Your Unraid registration key is ineligible for replacement as it is blacklisted.": "",
|
||||
"You may also attempt to Purchase or Replace your key.": "",
|
||||
"Multiple License Keys Present": "",
|
||||
"There are multiple license key files present on your USB flash device and none of them correspond to the USB Flash boot device.": "",
|
||||
"Please remove all key files, except the one you want to replace, from the /config directory on your USB Flash boot device.": "",
|
||||
"Alternately you may purchase a license key for this USB flash device.": "",
|
||||
"If you want to replace one of your license keys with a new key bound to this USB Flash device, please first remove all other key files first.": "",
|
||||
"Missing key file": "",
|
||||
"It appears that your license key file is corrupted or missing.": "",
|
||||
"The key file should be located in the /config directory on your USB Flash boot device.": "",
|
||||
"With Unraid Connect (beta) installed you may attempt to recover your key with your Unraid.net account.": "",
|
||||
"If this was an expired Trial installation, you may purchase a license key.": "",
|
||||
"If you do not have a backup copy of your license key file you may install the Unraid Connect (beta) plugin to attempt to recover your key": "",
|
||||
"Invalid installation": "",
|
||||
"It is not possible to use a Trial key with an existing Unraid OS installation.": "",
|
||||
"You may purchase a license key corresponding to this USB Flash device to continue using this installation.": "",
|
||||
"No USB flash configuration data": "",
|
||||
"There is a problem with your USB Flash device": "",
|
||||
"No Flash": "",
|
||||
"Cannot access your USB Flash boot device": "",
|
||||
"There is a physical problem accessing your USB Flash boot device": "",
|
||||
"BLACKLISTED": "",
|
||||
"Blacklisted USB Flash GUID": "",
|
||||
"This USB Flash boot device has been blacklisted.": "",
|
||||
"This can occur as a result of transferring your license key to a replacement USB Flash device, and you are currently booted from your old USB Flash device.": "",
|
||||
"A USB Flash device may also be blacklisted if we discover the serial number is not unique – this is common with USB card readers.": "",
|
||||
"USB Flash device error": "",
|
||||
"This USB Flash device has an invalid GUID.": "",
|
||||
"Please try a different USB Flash device": "",
|
||||
"USB Flash has no serial number": "",
|
||||
"Trial Requires Internet Connection": "",
|
||||
"Cannot validate Unraid Trial key": "",
|
||||
"Your Trial key requires an internet connection.": "",
|
||||
"Please check Settings > Network": "",
|
||||
"Stale": "",
|
||||
"Stale Server": "",
|
||||
"Please refresh the page to ensure you load your latest configuration": "",
|
||||
"Invalid API Key": "",
|
||||
"Please sign out then sign back in to refresh your API key.": "",
|
||||
"Invalid API Key Format": "",
|
||||
"Too Many Devices": "",
|
||||
"You have exceeded the number of devices allowed for your license.": "",
|
||||
"Please remove a device before adding another.": "",
|
||||
"Unraid Connect Install Failed": "",
|
||||
"Rebooting will likely solve this.": "",
|
||||
"SSL certificates for unraid.net deprecated": "",
|
||||
"On January 1st, 2023 SSL certificates for unraid.net were deprecated.": "",
|
||||
"You MUST provision a new SSL certificate to use our new myunraid.net domain.": "",
|
||||
"You can do this on the Settings > Management Access page.": "",
|
||||
"Unraid Connect Error": "",
|
||||
"Trial Key Creation Failed": "",
|
||||
"Key server did not return a trial key. Please try again later.": "",
|
||||
"Extending your free trial by 15 days": "",
|
||||
"Please keep this window open": "",
|
||||
"Starting your free 30 day trial": "",
|
||||
"Trial Key Created": "",
|
||||
"Please wait while the page reloads to install your trial key": ""
|
||||
}
|
||||
215
locales/en_US.json
Normal file
215
locales/en_US.json
Normal file
@@ -0,0 +1,215 @@
|
||||
{
|
||||
"LAN IP": "LAN IP",
|
||||
"LAN IP %{ip}": "LAN IP %{ip}",
|
||||
"LAN IP Copied": "LAN IP Copied",
|
||||
"Click to Copy LAN IP %{ip}": "Click to Copy LAN IP %{ip}",
|
||||
"Trial Key Expired at %{time}": "Trial Key Expired at %{time}",
|
||||
"Trial Key Expires at %{time}": "Trial Key Expires at %{time}",
|
||||
"Trial Key Expired %{time}": "Trial Key Expired %{time}",
|
||||
"Trial Key Expires in %{time}": "Trial Key Expires in %{time}",
|
||||
"Server Up Since %{time}": "Server Up Since %{time}",
|
||||
"Uptime %{time}": "Uptime %{time}",
|
||||
"year": "{n} year | {n} years",
|
||||
"month": "{n} month | {n} months",
|
||||
"day": "{n} day | {n} days",
|
||||
"hour": "{n} hour | {n} hours",
|
||||
"minute": "{n} minute | {n} minutes",
|
||||
"second": "{n} second | {n} seconds",
|
||||
"ago": "ago",
|
||||
"Purchase": "Purchase",
|
||||
"Upgrade": "Upgrade",
|
||||
"Fix Error": "Fix Error",
|
||||
"Get Started": "Get Started",
|
||||
"Trial Expired, see options below": "Trial Expired, see options below",
|
||||
"Learn more about the error": "Learn more about the error",
|
||||
"Close Dropdown": "Close Dropdown",
|
||||
"Open Dropdown": "Open Dropdown",
|
||||
"Thank you for installing Connect!": "Thank you for installing Connect!",
|
||||
"Sign In to your Unraid.net account to get started": "Sign In to your Unraid.net account to get started",
|
||||
"Go to Connect": "Go to Connect",
|
||||
"Opens Connect in new tab": "Opens Connect in new tab",
|
||||
"Manage Unraid.net Account": "Manage Unraid.net Account",
|
||||
"Manage Unraid.net Account in new tab": "Manage Unraid.net Account in new tab",
|
||||
"Settings": "Settings",
|
||||
"Go to Connect plugin settings": "Go to Connect plugin settings",
|
||||
"Enhance your Unraid experience with Connect": "Enhance your Unraid experience with Connect",
|
||||
"Beta": "Beta",
|
||||
"Loading": "Loading",
|
||||
"Restarting unraid-api…": "Restarting unraid-api…",
|
||||
"unraid-api is offline": "unraid-api is offline",
|
||||
"Introducing Unraid Connect": "Introducing Unraid Connect",
|
||||
"Enhance your Unraid experience": "Enhance your Unraid experience",
|
||||
"Connected": "Connected",
|
||||
"Dynamic Remote Access": "Dynamic Remote Access",
|
||||
"Toggle on/off server accessibility with dynamic remote access. Automatically turn on UPnP and open a random WAN port on your router at the click of a button and close off access in seconds.": "Toggle on/off server accessibility with dynamic remote access. Automatically turn on UPnP and open a random WAN port on your router at the click of a button and close off access in seconds.",
|
||||
"Manage Your Server Within Connect": "Manage Your Server Within Connect",
|
||||
"Servers equipped with a myunraid.net certificate can be managed directly from within the Connect web UI. Manage multiple servers from your phone, tablet, laptop, or PC in the same browser window.": "Servers equipped with a myunraid.net certificate can be managed directly from within the Connect web UI. Manage multiple servers from your phone, tablet, laptop, or PC in the same browser window.",
|
||||
"Deep Linking": "Deep Linking",
|
||||
"The Connect dashboard links to relevant sections of the webgui, allowing quick access to those settings and server sections.": "The Connect dashboard links to relevant sections of the webgui, allowing quick access to those settings and server sections.",
|
||||
"Online Flash Backup": "Online Flash Backup",
|
||||
"Never ever be left without a backup of your config. If you need to change flash drives, generate a backup from Connect and be up and running in minutes.": "Never ever be left without a backup of your config. If you need to change flash drives, generate a backup from Connect and be up and running in minutes.",
|
||||
"Real-time Monitoring": "Real-time Monitoring",
|
||||
"Get an overview of your server's state, storage space, apps and VMs status, and more.": "Get an overview of your server's state, storage space, apps and VMs status, and more.",
|
||||
"Customizable Dashboard Tiles": "Customizable Dashboard Tiles",
|
||||
"Set custom server tiles how you like and automatically display your server's banner image on your Connect Dashboard.": "Set custom server tiles how you like and automatically display your server's banner image on your Connect Dashboard.",
|
||||
"License Management": "License Management",
|
||||
"Manage your license keys at any time via the My Keys section.": "Manage your license keys at any time via the My Keys section.",
|
||||
"Plus more on the way": "Plus more on the way",
|
||||
"All you need is an active internet connection, an Unraid.net account, and the Connect plugin. Get started by installing the plugin.": "All you need is an active internet connection, an Unraid.net account, and the Connect plugin. Get started by installing the plugin.",
|
||||
"Checkout the Connect Documentation": "Checkout the Connect Documentation",
|
||||
"No thanks": "No thanks",
|
||||
"Learn more": "Learn more",
|
||||
"Install Connect": "Install Connect",
|
||||
"Close Modal": "Close Modal",
|
||||
"Close": "Close",
|
||||
"Reload": "Reload",
|
||||
"Unraid logo animating with a wave like effect": "Unraid logo animating with a wave like effect",
|
||||
"Click to close modal": "Click to close modal",
|
||||
"Error": "Error",
|
||||
"Performing actions": "Performing actions",
|
||||
"Success!": "Success!",
|
||||
"Something went wrong": "Something went wrong",
|
||||
"Please keep this window open while we perform some actions": "Please keep this window open while we perform some actions",
|
||||
"You're one step closer to enhancing your Unraid experience": "You're one step closer to enhancing your Unraid experience",
|
||||
"Thank you for purchasing an Unraid %{keyType} Key!": "Thank you for purchasing an Unraid %{keyType} Key!",
|
||||
"Your %{keyType} Key has been replaced!": "Your %{keyType} Key has been replaced!",
|
||||
"Your Trial key has been extended!": "Your Trial key has been extended!",
|
||||
"Copied": "Copied",
|
||||
"Copy Key URL": "Copy Key URL",
|
||||
"Copy your Key URL: %{keyUrl}": "Copy your Key URL: %{keyUrl}",
|
||||
"Then go to Tools > Registration to manually install it": "Then go to Tools > Registration to manually install it",
|
||||
"Enhance your experience with Unraid Connect": "Enhance your experience with Unraid Connect",
|
||||
"Sign In to utilize Unraid Connect": "Sign In to utilize Unraid Connect",
|
||||
"Configure Connect Features": "Configure Connect Features",
|
||||
"The primary method of support for Unraid Connect is through our forums and Discord.": "The primary method of support for Unraid Connect is through our forums and Discord.",
|
||||
"If you are asked to supply logs, please open a support request on our Contact Page and reply to the email message you receive with your logs attached.": "If you are asked to supply logs, please open a support request on our Contact Page and reply to the email message you receive with your logs attached.",
|
||||
"The logs may contain sensitive information so do not post them publicly.": "The logs may contain sensitive information so do not post them publicly.",
|
||||
"Download unraid-api Logs": "Download unraid-api Logs",
|
||||
"Unraid Connect Forums": "Unraid Connect Forums",
|
||||
"Unraid Discord": "Unraid Discord",
|
||||
"Unraid Contact Page": "Unraid Contact Page",
|
||||
"DNS issue, unable to resolve wanip4.unraid.net": "DNS issue, unable to resolve wanip4.unraid.net",
|
||||
"Unable to fetch client WAN IPv4": "Unable to fetch client WAN IPv4",
|
||||
"Checking WAN IPs…": "Checking WAN IPs…",
|
||||
"Remark: your WAN IPv4 is %{wanIp}": "Remark: your WAN IPv4 is %{wanIp}",
|
||||
"Remark: Unraid's WAN IPv4 %{phpWanIp} does not match your client's WAN IPv4 %{wanIp}.": "Remark: Unraid's WAN IPv4 %{phpWanIp} does not match your client's WAN IPv4 %{wanIp}.",
|
||||
"This may indicate a complex network that will not work with this Remote Access solution.": "This may indicate a complex network that will not work with this Remote Access solution.",
|
||||
"Ignore this message if you are currently connected via Remote Access or VPN.": "Ignore this message if you are currently connected via Remote Access or VPN.",
|
||||
"Ready to update Connect account configuration": "Ready to update Connect account configuration",
|
||||
"Signing in %{username}…": "Signing in %{username}…",
|
||||
"Signing out %{username}…": "Signing out %{username}…",
|
||||
"%{username} Signed In Successfully": "%{username} Signed In Successfully",
|
||||
"%{username} Signed Out Successfully": "%{username} Signed Out Successfully",
|
||||
"Sign In Failed": "Sign In Failed",
|
||||
"Sign Out Failed": "Sign Out Failed",
|
||||
"Failed to update Connect account configuration": "Failed to update Connect account configuration",
|
||||
"Callback redirect type not present or incorrect": "Callback redirect type not present or incorrect",
|
||||
"Failed to install key": "Failed to install key",
|
||||
"Ready to Install Key": "Ready to Install Key",
|
||||
"Installing Extended Trial": "Installing Extended Trial",
|
||||
"Installing Recovered": "Installing Recovered",
|
||||
"Installing Replaced": "Installing Replaced",
|
||||
"%{txt1} %{keyType} Key…": "%{txt1} %{keyType} Key…",
|
||||
"%{keyType.value} Key %{txt2} Successfully": "%{keyType.value} Key %{txt2} Successfully",
|
||||
"Failed to %{txt3} %{keyType.value} Key": "Failed to %{txt3} %{keyType.value} Key",
|
||||
"Purchase Key": "Purchase Key",
|
||||
"Upgrade Key": "Upgrade Key",
|
||||
"Recover Key": "Recover Key",
|
||||
"Redeem Activation Code": "Redeem Activation Code",
|
||||
"Replace Key": "Replace Key",
|
||||
"Sign In with Unraid.net Account": "Sign In with Unraid.net Account",
|
||||
"Sign Out of Unraid.net": "Sign Out of Unraid.net",
|
||||
"Extend Trial": "Extend Trial",
|
||||
"Start Free 30 Day Trial": "Start Free 30 Day Trial",
|
||||
"Go to Management Access Now": "Go to Management Access Now",
|
||||
"Contact Support": "Contact Support",
|
||||
"Learn More": "Learn More",
|
||||
"No Keyfile": "No Keyfile",
|
||||
"Let's Unleash your Hardware!": "Let's Unleash your Hardware!",
|
||||
"Your server will not be usable until you purchase a Registration key or install a free 30-day Trial key.": "Your server will not be usable until you purchase a Registration key or install a free 30-day Trial key.",
|
||||
"A Trial key provides all the functionality of a Pro Registration key.": "A Trial key provides all the functionality of a Pro Registration key.",
|
||||
"Registration keys are bound to your USB Flash boot device serial number (GUID).": "Registration keys are bound to your USB Flash boot device serial number (GUID).",
|
||||
"Please use a high quality name brand device at least 1GB in size.": "Please use a high quality name brand device at least 1GB in size.",
|
||||
"Note: USB memory card readers are generally not supported because most do not present unique serial numbers.": "Note: USB memory card readers are generally not supported because most do not present unique serial numbers.",
|
||||
"Important": "Important",
|
||||
"Please make sure your server time is accurate to within 5 minutes": "Please make sure your server time is accurate to within 5 minutes",
|
||||
"Please make sure there is a DNS server specified": "Please make sure there is a DNS server specified",
|
||||
"Trial": "Trial",
|
||||
"Thank you for choosing Unraid OS!": "Thank you for choosing Unraid OS!",
|
||||
"Your Trial key includes all the functionality and device support of a Pro key.": "Your Trial key includes all the functionality and device support of a Pro key.",
|
||||
"After your Trial has reached expiration, your server still functions normally until the next time you Stop the array or reboot your server.": "After your Trial has reached expiration, your server still functions normally until the next time you Stop the array or reboot your server.",
|
||||
"At that point you may either purchase a license key or request a Trial extension.": "At that point you may either purchase a license key or request a Trial extension.",
|
||||
"Trial Expired": "Trial Expired",
|
||||
"Your Trial has expired": "Your Trial has expired",
|
||||
"To continue using Unraid OS you may purchase a license key.": "To continue using Unraid OS you may purchase a license key.",
|
||||
"Alternately, you may request a Trial extension.": "Alternately, you may request a Trial extension.",
|
||||
"You have used all your Trial extensions.": "You have used all your Trial extensions.",
|
||||
"Basic": "Basic",
|
||||
"Register for Connect by signing in to your Unraid.net account": "Register for Connect by signing in to your Unraid.net account",
|
||||
"To support more storage devices as your server grows, click Upgrade Key.": "To support more storage devices as your server grows, click Upgrade Key.",
|
||||
"Plus": "Plus",
|
||||
"Pro": "Pro",
|
||||
"Flash GUID Error": "Flash GUID Error",
|
||||
"Registration key / USB Flash GUID mismatch": "Registration key / USB Flash GUID mismatch",
|
||||
"Your Unraid registration key is ineligible for replacement as it has been replaced within the last 12 months.": "Your Unraid registration key is ineligible for replacement as it has been replaced within the last 12 months.",
|
||||
"The license key file does not correspond to the USB Flash boot device.": "The license key file does not correspond to the USB Flash boot device.",
|
||||
"Please copy the correct key file to the /config directory on your USB Flash boot device or choose Purchase Key.": "Please copy the correct key file to the /config directory on your USB Flash boot device or choose Purchase Key.",
|
||||
"Your Unraid registration key is ineligible for replacement as it is blacklisted.": "Your Unraid registration key is ineligible for replacement as it is blacklisted.",
|
||||
"You may also attempt to Purchase or Replace your key.": "You may also attempt to Purchase or Replace your key.",
|
||||
"Multiple License Keys Present": "Multiple License Keys Present",
|
||||
"There are multiple license key files present on your USB flash device and none of them correspond to the USB Flash boot device.": "There are multiple license key files present on your USB flash device and none of them correspond to the USB Flash boot device.",
|
||||
"Please remove all key files, except the one you want to replace, from the /config directory on your USB Flash boot device.": "Please remove all key files, except the one you want to replace, from the /config directory on your USB Flash boot device.",
|
||||
"Alternately you may purchase a license key for this USB flash device.": "Alternately you may purchase a license key for this USB flash device.",
|
||||
"If you want to replace one of your license keys with a new key bound to this USB Flash device, please first remove all other key files first.": "If you want to replace one of your license keys with a new key bound to this USB Flash device, please first remove all other key files first.",
|
||||
"Missing key file": "Missing key file",
|
||||
"It appears that your license key file is corrupted or missing.": "It appears that your license key file is corrupted or missing.",
|
||||
"The key file should be located in the /config directory on your USB Flash boot device.": "The key file should be located in the /config directory on your USB Flash boot device.",
|
||||
"With Unraid Connect (beta) installed you may attempt to recover your key with your Unraid.net account.": "With Unraid Connect (beta) installed you may attempt to recover your key with your Unraid.net account.",
|
||||
"If this was an expired Trial installation, you may purchase a license key.": "If this was an expired Trial installation, you may purchase a license key.",
|
||||
"If you do not have a backup copy of your license key file you may install the Unraid Connect (beta) plugin to attempt to recover your key": "If you do not have a backup copy of your license key file you may install the Unraid Connect (beta) plugin to attempt to recover your key",
|
||||
"Invalid installation": "Invalid installation",
|
||||
"It is not possible to use a Trial key with an existing Unraid OS installation.": "It is not possible to use a Trial key with an existing Unraid OS installation.",
|
||||
"You may purchase a license key corresponding to this USB Flash device to continue using this installation.": "You may purchase a license key corresponding to this USB Flash device to continue using this installation.",
|
||||
"No USB flash configuration data": "No USB flash configuration data",
|
||||
"There is a problem with your USB Flash device": "There is a problem with your USB Flash device",
|
||||
"No Flash": "No Flash",
|
||||
"Cannot access your USB Flash boot device": "Cannot access your USB Flash boot device",
|
||||
"There is a physical problem accessing your USB Flash boot device": "There is a physical problem accessing your USB Flash boot device",
|
||||
"BLACKLISTED": "BLACKLISTED",
|
||||
"Blacklisted USB Flash GUID": "Blacklisted USB Flash GUID",
|
||||
"This USB Flash boot device has been blacklisted.": "This USB Flash boot device has been blacklisted.",
|
||||
"This can occur as a result of transferring your license key to a replacement USB Flash device, and you are currently booted from your old USB Flash device.": "This can occur as a result of transferring your license key to a replacement USB Flash device, and you are currently booted from your old USB Flash device.",
|
||||
"A USB Flash device may also be blacklisted if we discover the serial number is not unique – this is common with USB card readers.": "A USB Flash device may also be blacklisted if we discover the serial number is not unique – this is common with USB card readers.",
|
||||
"USB Flash device error": "USB Flash device error",
|
||||
"This USB Flash device has an invalid GUID.": "This USB Flash device has an invalid GUID.",
|
||||
"Please try a different USB Flash device": "Please try a different USB Flash device",
|
||||
"USB Flash has no serial number": "USB Flash has no serial number",
|
||||
"Trial Requires Internet Connection": "Trial Requires Internet Connection",
|
||||
"Cannot validate Unraid Trial key": "Cannot validate Unraid Trial key",
|
||||
"Your Trial key requires an internet connection.": "Your Trial key requires an internet connection.",
|
||||
"Please check Settings > Network": "Please check Settings > Network",
|
||||
"Stale": "Stale",
|
||||
"Stale Server": "Stale Server",
|
||||
"Please refresh the page to ensure you load your latest configuration": "Please refresh the page to ensure you load your latest configuration",
|
||||
"Invalid API Key": "Invalid API Key",
|
||||
"Please sign out then sign back in to refresh your API key.": "Please sign out then sign back in to refresh your API key.",
|
||||
"Invalid API Key Format": "Invalid API Key Format",
|
||||
"Too Many Devices": "Too Many Devices",
|
||||
"You have exceeded the number of devices allowed for your license.": "You have exceeded the number of devices allowed for your license.",
|
||||
"Please remove a device before adding another.": "Please remove a device before adding another.",
|
||||
"Unraid Connect Install Failed": "Unraid Connect Install Failed",
|
||||
"Rebooting will likely solve this.": "Rebooting will likely solve this.",
|
||||
"SSL certificates for unraid.net deprecated": "SSL certificates for unraid.net deprecated",
|
||||
"On January 1st, 2023 SSL certificates for unraid.net were deprecated.": "On January 1st, 2023 SSL certificates for unraid.net were deprecated.",
|
||||
"You MUST provision a new SSL certificate to use our new myunraid.net domain.": "You MUST provision a new SSL certificate to use our new myunraid.net domain.",
|
||||
"You can do this on the Settings > Management Access page.": "You can do this on the Settings > Management Access page.",
|
||||
"Unraid Connect Error": "Unraid Connect Error",
|
||||
"Trial Key Creation Failed": "Trial Key Creation Failed",
|
||||
"Key server did not return a trial key. Please try again later.": "Key server did not return a trial key. Please try again later.",
|
||||
"Extending your free trial by 15 days": "Extending your free trial by 15 days",
|
||||
"Please keep this window open": "Please keep this window open",
|
||||
"Starting your free 30 day trial": "Starting your free 30 day trial",
|
||||
"Trial Key Created": "Trial Key Created",
|
||||
"Please wait while the page reloads to install your trial key": "Please wait while the page reloads to install your trial key",
|
||||
"A Trial key provides all the functionality of a Pro Registration key": "A Trial key provides all the functionality of a Pro Registration key."
|
||||
}
|
||||
217
locales/ja.json
Normal file
217
locales/ja.json
Normal file
@@ -0,0 +1,217 @@
|
||||
{
|
||||
"LAN IP": "LAN IP",
|
||||
"LAN IP %{ip}": "LAN IP %{ip}",
|
||||
"LAN IP Copied": "LAN IPがコピーされました",
|
||||
"Click to Copy LAN IP %{ip}": "クリックして LAN IP %{ip} をコピーします",
|
||||
"Trial Key Expired at %{time}": "トライアルキーは %{time} に期限切れになりました",
|
||||
"Trial Key Expires at %{time}": "トライアルキーは %{time} に期限切れになります",
|
||||
"Trial Key Expired %{time}": "トライアルキーの有効期限が切れました %{time}",
|
||||
"Trial Key Expires in %{time}": "トライアル キーは %{time} 後に期限切れになります",
|
||||
"Server Up Since %{time}": "%{time}以降サーバー稼働中",
|
||||
"Uptime %{time}": "稼働時間 %{time}",
|
||||
"year": "{n} 年 | \n{n}年",
|
||||
"month": "{n} 月 | \n{n}か月",
|
||||
"day": "{n} 日 | \n{n}日",
|
||||
"hour": "{n} 時間 | \n{n}時間",
|
||||
"minute": "{n} 分 | \n{n}分",
|
||||
"second": "{n} 秒 | \n{n}秒",
|
||||
"ago": "前",
|
||||
"Purchase": "購入",
|
||||
"Upgrade": "アップグレード",
|
||||
"Fix Error": "エラーを修正",
|
||||
"Get Started": "始めましょう",
|
||||
"Trial Expired, see options below": "試用期限が切れました。以下のオプションを参照してください",
|
||||
"Learn more about the error": "エラーの詳細を確認する",
|
||||
"Close Dropdown": "ドロップダウンを閉じる",
|
||||
"Open Dropdown": "ドロップダウンを開く",
|
||||
"Thank you for installing Connect!": "Connect をインストールしていただきありがとうございます。",
|
||||
"Sign In to your Unraid.net account to get started": "Unraid.net アカウントにサインインして開始してください",
|
||||
"Go to Connect": "「接続」に移動",
|
||||
"Opens Connect in new tab": "新しいタブで接続を開きます",
|
||||
"Manage Unraid.net Account": "Unraid.net アカウントの管理",
|
||||
"Manage Unraid.net Account in new tab": "新しいタブでUnraid.netアカウントを管理",
|
||||
"Settings": "設定",
|
||||
"Go to Connect plugin settings": "接続プラグイン設定に移動します",
|
||||
"Enhance your Unraid experience with Connect": "Connect で Unraid エクスペリエンスを強化",
|
||||
"Beta": "ベータ",
|
||||
"Loading": "読み込み中",
|
||||
"Restarting unraid-api…": "unraid-API を再起動しています…",
|
||||
"unraid-api is offline": "unraid-API はオフラインです",
|
||||
"Introducing Unraid Connect": "Unraid Connect の紹介",
|
||||
"Enhance your Unraid experience": "Unraid エクスペリエンスを強化する",
|
||||
"Connected": "接続済み",
|
||||
"Dynamic Remote Access": "ダイナミックリモートアクセス",
|
||||
"Toggle on/off server accessibility with dynamic remote access. Automatically turn on UPnP and open a random WAN port on your router at the click of a button and close off access in seconds.": "動的リモート アクセスを使用してサーバー アクセシビリティのオン/オフを切り替えます。 ボタンをクリックするだけで UPnP が自動的にオンになり、ルーター上でランダムな WAN ポートが開き、数秒でアクセスが遮断されます。",
|
||||
"Manage Your Server Within Connect": "Connect 内でサーバーを管理",
|
||||
"Servers equipped with a myunraid.net certificate can be managed directly from within the Connect web UI. Manage multiple servers from your phone, tablet, laptop, or PC in the same browser window.": "myunraid.net 証明書を備えたサーバーは、Connect Web UI 内から直接管理できます。 同じブラウザ ウィンドウで、携帯電話、タブレット、ラップトップ、または PC から複数のサーバーを管理します。",
|
||||
"Deep Linking": "ディープリンク",
|
||||
"The Connect dashboard links to relevant sections of the webgui, allowing quick access to those settings and server sections.": "Connect ダッシュボードは Webgui の関連セクションにリンクしているため、これらの設定やサーバー セクションにすばやくアクセスできます。",
|
||||
"Online Flash Backup": "オンラインフラッシュバックアップ",
|
||||
"Never ever be left without a backup of your config. If you need to change flash drives, generate a backup from Connect and be up and running in minutes.": "設定のバックアップが欠かせないことはありません。 フラッシュ ドライブを変更する必要がある場合は、Connect からバックアップを生成すると、数分で起動して実行できるようになります。",
|
||||
"Real-time Monitoring": "リアルタイム監視",
|
||||
"Get an overview of your server's state, storage space, apps and VMs status, and more.": "サーバーの状態、ストレージ容量、アプリと VM のステータスなどの概要を取得します。",
|
||||
"Customizable Dashboard Tiles": "カスタマイズ可能なダッシュボード タイル",
|
||||
"Set custom server tiles how you like and automatically display your server's banner image on your Connect Dashboard.": "カスタム サーバー タイルを好みに設定し、サーバーのバナー画像を Connect ダッシュボードに自動的に表示します。",
|
||||
"License Management": "ライセンス管理",
|
||||
"Manage your license keys at any time via the My Keys section.": "[マイ キー] セクションでいつでもライセンス キーを管理できます。",
|
||||
"Plus more on the way": "さらに途中でさらに追加",
|
||||
"All you need is an active internet connection, an Unraid.net account, and the Connect plugin. Get started by installing the plugin.": "必要なのは、アクティブなインターネット接続、Unraid.net アカウント、および Connect プラグインだけです。 プラグインをインストールして始めます。",
|
||||
"Get started by installing the plugin.": "プラグインをインストールして始めます。",
|
||||
"Checkout the Connect Documentation": "Connect のドキュメントを確認する",
|
||||
"No thanks": "結構です",
|
||||
"Learn more": "もっと詳しく知る",
|
||||
"Install Connect": "インストール接続",
|
||||
"Close Modal": "モーダルを閉じる",
|
||||
"Close": "近い",
|
||||
"Reload": "リロード",
|
||||
"Unraid logo animating with a wave like effect": "波のような効果でアニメーション化された Unraid ロゴ",
|
||||
"Click to close modal": "クリックしてモーダルを閉じます",
|
||||
"Error": "エラー",
|
||||
"Performing actions": "アクションの実行",
|
||||
"Success!": "成功!",
|
||||
"Something went wrong": "何か問題が発生しました",
|
||||
"Please keep this window open while we perform some actions": "いくつかのアクションを実行する間、このウィンドウを開いたままにしてください",
|
||||
"You're one step closer to enhancing your Unraid experience": "Unraid エクスペリエンスの向上にまた一歩近づいています",
|
||||
"Thank you for purchasing an Unraid %{keyType} Key!": "Unraid %{keyType} キーをご購入いただきありがとうございます。",
|
||||
"Your %{keyType} Key has been replaced!": "%{keyType} キーは置き換えられました。",
|
||||
"Your Trial key has been extended!": "トライアルキーは延長されました!",
|
||||
"Copied": "コピーされました",
|
||||
"Copy Key URL": "キーの URL をコピー",
|
||||
"Copy your Key URL: %{keyUrl}": "キーの URL をコピーします: %{keyUrl}",
|
||||
"Then go to Tools > Registration to manually install it": "次に、[ツール] > [登録] に移動して手動でインストールします。",
|
||||
"Enhance your experience with Unraid Connect": "Unraid Connect でエクスペリエンスを向上",
|
||||
"Sign In to utilize Unraid Connect": "Unraid Connect を利用するにはサインインしてください",
|
||||
"Configure Connect Features": "接続機能の構成",
|
||||
"The primary method of support for Unraid Connect is through our forums and Discord.": "Unraid Connect の主なサポート方法は、フォーラムと Discord を使用することです。",
|
||||
"If you are asked to supply logs, please open a support request on our Contact Page and reply to the email message you receive with your logs attached.": "ログの提供を求められた場合は、お問い合わせページでサポート リクエストを開き、受信した電子メール メッセージにログを添付してご返信ください。",
|
||||
"The logs may contain sensitive information so do not post them publicly.": "ログには機密情報が含まれている可能性があるため、公開しないでください。",
|
||||
"Download unraid-api Logs": "unraid-api ログをダウンロードする",
|
||||
"Unraid Connect Forums": "Unraid Connect フォーラム",
|
||||
"Unraid Discord": "アンレイドディスコード",
|
||||
"Unraid Contact Page": "アンレイド連絡先ページ",
|
||||
"DNS issue, unable to resolve wanip4.unraid.net": "DNS の問題、wanip4.unraid.net を解決できない",
|
||||
"Unable to fetch client WAN IPv4": "クライアントの WAN IPv4 を取得できません",
|
||||
"Checking WAN IPs…": "WAN IPをチェック中…",
|
||||
"Remark: your WAN IPv4 is %{wanIp}": "注: WAN IPv4 は %{wanIp} です",
|
||||
"Remark: Unraid's WAN IPv4 %{phpWanIp} does not match your client's WAN IPv4 %{wanIp}.": "注: Unraid の WAN IPv4 %{phpWanIp} は、クライアントの WAN IPv4 %{wanIp} と一致しません。",
|
||||
"This may indicate a complex network that will not work with this Remote Access solution.": "これは、このリモート アクセス ソリューションでは機能しない複雑なネットワークを示している可能性があります。",
|
||||
"Ignore this message if you are currently connected via Remote Access or VPN.": "現在リモート アクセスまたは VPN 経由で接続している場合は、このメッセージを無視してください。",
|
||||
"Ready to update Connect account configuration": "Connect アカウント構成を更新する準備ができました",
|
||||
"Signing in %{username}…": "%{ユーザー名} にサインインしています…",
|
||||
"Signing out %{username}…": "%{ユーザー名} をサインアウトしています…",
|
||||
"%{username} Signed In Successfully": "%{username} が正常にサインインしました",
|
||||
"%{username} Signed Out Successfully": "%{username} が正常にサインアウトしました",
|
||||
"Sign In Failed": "サインインに失敗しました",
|
||||
"Sign Out Failed": "サインアウトに失敗しました",
|
||||
"Failed to update Connect account configuration": "Connect アカウント構成の更新に失敗しました",
|
||||
"Callback redirect type not present or incorrect": "コールバック リダイレクト タイプが存在しないか、正しくありません",
|
||||
"Failed to install key": "キーのインストールに失敗しました",
|
||||
"Ready to Install Key": "キーをインストールする準備ができました",
|
||||
"Installing Extended Trial": "延長トライアル版のインストール",
|
||||
"Installing Recovered": "回復されたものをインストールしています",
|
||||
"Installing Replaced": "取り付け、交換",
|
||||
"%{txt1} %{keyType} Key…": "%{txt1} %{keyType} キー…",
|
||||
"%{keyType.value} Key %{txt2} Successfully": "%{keyType.value} キー %{txt2} が成功しました",
|
||||
"Failed to %{txt3} %{keyType.value} Key": "%{txt3} %{keyType.value} キーに失敗しました",
|
||||
"Purchase Key": "キーを購入する",
|
||||
"Upgrade Key": "アップグレードキー",
|
||||
"Recover Key": "キーを回復する",
|
||||
"Redeem Activation Code": "アクティベーション コードを引き換える",
|
||||
"Replace Key": "キーを交換する",
|
||||
"Sign In with Unraid.net Account": "Unraid.net アカウントでサインインする",
|
||||
"Sign Out of Unraid.net": "Unraid.net からサインアウトする",
|
||||
"Extend Trial": "トライアルの延長",
|
||||
"Start Free 30 Day Trial": "30 日間の無料トライアルを開始する",
|
||||
"Go to Management Access Now": "今すぐ管理アクセスに移動",
|
||||
"Contact Support": "サポート問い合わせ先",
|
||||
"Learn More": "もっと詳しく知る",
|
||||
"No Keyfile": "キーファイルがありません",
|
||||
"Let's Unleash your Hardware!": "ハードウェアを解き放ちましょう!",
|
||||
"Your server will not be usable until you purchase a Registration key or install a free 30-day Trial key.": "",
|
||||
"A Trial key provides all the functionality of a Pro Registration key.": "",
|
||||
"Registration keys are bound to your USB Flash boot device serial number (GUID).": "",
|
||||
"Please use a high quality name brand device at least 1GB in size.": "",
|
||||
"Note: USB memory card readers are generally not supported because most do not present unique serial numbers.": "",
|
||||
"Important": "重要",
|
||||
"Please make sure your server time is accurate to within 5 minutes": "サーバー時間が 5 分以内に正確であることを確認してください。",
|
||||
"Please make sure there is a DNS server specified": "DNSサーバーが指定されていることを確認してください",
|
||||
"Trial": "トライアル",
|
||||
"Thank you for choosing Unraid OS!": "Unraid OS をお選びいただきありがとうございます。",
|
||||
"Your Trial key includes all the functionality and device support of a Pro key.": "",
|
||||
"After your Trial has reached expiration, your server still functions normally until the next time you Stop the array or reboot your server.": "",
|
||||
"At that point you may either purchase a license key or request a Trial extension.": "",
|
||||
"Trial Expired": "試用期限が切れました",
|
||||
"Your Trial has expired": "トライアル版の有効期限が切れました",
|
||||
"To continue using Unraid OS you may purchase a license key.": "",
|
||||
"Alternately, you may request a Trial extension.": "",
|
||||
"You have used all your Trial extensions.": "",
|
||||
"Basic": "基本",
|
||||
"Register for Connect by signing in to your Unraid.net account": "Unraid.net アカウントにサインインして Connect に登録します",
|
||||
"To support more storage devices as your server grows, click Upgrade Key.": "",
|
||||
"Plus": "プラス",
|
||||
"Pro": "プロ",
|
||||
"Flash GUID Error": "フラッシュGUIDエラー",
|
||||
"Registration key / USB Flash GUID mismatch": "登録キー / USB フラッシュ GUID の不一致",
|
||||
"Your Unraid registration key is ineligible for replacement as it has been replaced within the last 12 months.": "",
|
||||
"The license key file does not correspond to the USB Flash boot device.": "",
|
||||
"Please copy the correct key file to the /config directory on your USB Flash boot device or choose Purchase Key.": "",
|
||||
"Your Unraid registration key is ineligible for replacement as it is blacklisted.": "",
|
||||
"You may also attempt to Purchase or Replace your key.": "",
|
||||
"Multiple License Keys Present": "複数のライセンス キーが存在します",
|
||||
"There are multiple license key files present on your USB flash device and none of them correspond to the USB Flash boot device.": "",
|
||||
"Please remove all key files, except the one you want to replace, from the /config directory on your USB Flash boot device.": "",
|
||||
"Alternately you may purchase a license key for this USB flash device.": "",
|
||||
"If you want to replace one of your license keys with a new key bound to this USB Flash device, please first remove all other key files first.": "",
|
||||
"Missing key file": "キーファイルがありません",
|
||||
"It appears that your license key file is corrupted or missing.": "",
|
||||
"The key file should be located in the /config directory on your USB Flash boot device.": "",
|
||||
"With Unraid Connect (beta) installed you may attempt to recover your key with your Unraid.net account.": "",
|
||||
"If this was an expired Trial installation, you may purchase a license key.": "",
|
||||
"If you do not have a backup copy of your license key file you may install the Unraid Connect (beta) plugin to attempt to recover your key": "ライセンス キー ファイルのバックアップ コピーがない場合は、Unraid Connect (ベータ) プラグインをインストールしてキーの回復を試みることができます。",
|
||||
"Invalid installation": "無効なインストール",
|
||||
"It is not possible to use a Trial key with an existing Unraid OS installation.": "",
|
||||
"You may purchase a license key corresponding to this USB Flash device to continue using this installation.": "",
|
||||
"No USB flash configuration data": "USB フラッシュ構成データがありません",
|
||||
"There is a problem with your USB Flash device": "USB フラッシュ デバイスに問題があります",
|
||||
"No Flash": "フラッシュ禁止",
|
||||
"Cannot access your USB Flash boot device": "USB フラッシュ ブート デバイスにアクセスできません",
|
||||
"There is a physical problem accessing your USB Flash boot device": "USB フラッシュ ブート デバイスへのアクセスに物理的な問題があります",
|
||||
"BLACKLISTED": "ブラックリストに登録されました",
|
||||
"Blacklisted USB Flash GUID": "ブラックリストに登録された USB フラッシュ GUID",
|
||||
"This USB Flash boot device has been blacklisted.": "",
|
||||
"This can occur as a result of transferring your license key to a replacement USB Flash device, and you are currently booted from your old USB Flash device.": "",
|
||||
"A USB Flash device may also be blacklisted if we discover the serial number is not unique – this is common with USB card readers.": "",
|
||||
"USB Flash device error": "USBフラッシュデバイスエラー",
|
||||
"This USB Flash device has an invalid GUID.": "",
|
||||
"Please try a different USB Flash device": "別の USB フラッシュ デバイスを試してください",
|
||||
"USB Flash has no serial number": "USB フラッシュにはシリアル番号がありません",
|
||||
"Trial Requires Internet Connection": "トライアルにはインターネット接続が必要です",
|
||||
"Cannot validate Unraid Trial key": "Unraid Trial キーを検証できません",
|
||||
"Your Trial key requires an internet connection.": "",
|
||||
"Please check Settings > Network": "[設定] > [ネットワーク] を確認してください。",
|
||||
"Stale": "古い",
|
||||
"Stale Server": "古いサーバー",
|
||||
"Please refresh the page to ensure you load your latest configuration": "最新の構成を確実にロードするには、ページを更新してください。",
|
||||
"Invalid API Key": "無効な API キー",
|
||||
"Please sign out then sign back in to refresh your API key.": "",
|
||||
"Invalid API Key Format": "無効な API キー形式",
|
||||
"Too Many Devices": "デバイスが多すぎます",
|
||||
"You have exceeded the number of devices allowed for your license.": "",
|
||||
"Please remove a device before adding another.": "",
|
||||
"Unraid Connect Install Failed": "Unraid Connect のインストールに失敗しました",
|
||||
"Rebooting will likely solve this.": "",
|
||||
"SSL certificates for unraid.net deprecated": "unraid.net の SSL 証明書が非推奨になりました",
|
||||
"On January 1st, 2023 SSL certificates for unraid.net were deprecated.": "",
|
||||
"You MUST provision a new SSL certificate to use our new myunraid.net domain.": "",
|
||||
"You can do this on the Settings > Management Access page.": "",
|
||||
"Unraid Connect Error": "非RAID接続エラー",
|
||||
"Trial Key Creation Failed": "トライアルキーの作成に失敗しました",
|
||||
"Key server did not return a trial key. Please try again later.": "",
|
||||
"Extending your free trial by 15 days": "無料トライアルを 15 日間延長します",
|
||||
"Please keep this window open": "この窓は開いたままにしておいてください",
|
||||
"Starting your free 30 day trial": "30 日間の無料トライアルを開始する",
|
||||
"Trial Key Created": "トライアルキーが作成されました",
|
||||
"Please wait while the page reloads to install your trial key": "試用版キーをインストールするには、ページがリロードされるまでお待ちください。",
|
||||
"A Trial key provides all the functionality of a Pro Registration key": "トライアル キーは、Pro 登録キーのすべての機能を提供します。",
|
||||
"A USB Flash device may also be blacklisted if we discover the serial number is not unique – this is common with USB card readers": ""
|
||||
}
|
||||
@@ -12,40 +12,40 @@ onBeforeMount(() => {
|
||||
<div class="max-w-5xl mx-auto">
|
||||
<client-only>
|
||||
<div class="flex flex-col gap-6 p-6">
|
||||
<h2>Vue Components</h2>
|
||||
<h3>UserProfileCe</h3>
|
||||
<h2 class="text-xl font-semibold font-mono">
|
||||
Vue Components
|
||||
</h2>
|
||||
<h3 class="text-lg font-semibold font-mono">
|
||||
UserProfileCe
|
||||
</h3>
|
||||
<UserProfileCe :server="serverState" />
|
||||
<hr>
|
||||
<h3>DownloadApiLogsCe</h3>
|
||||
<hr class="border-black">
|
||||
<h3 class="text-lg font-semibold font-mono">
|
||||
DownloadApiLogsCe
|
||||
</h3>
|
||||
<DownloadApiLogsCe />
|
||||
<hr>
|
||||
<h3>AuthCe</h3>
|
||||
<hr class="border-black">
|
||||
<h3 class="text-lg font-semibold font-mono">
|
||||
AuthCe
|
||||
</h3>
|
||||
<AuthCe />
|
||||
<hr>
|
||||
<h3>KeyActionsCe</h3>
|
||||
<hr class="border-black">
|
||||
<h3 class="text-lg font-semibold font-mono">
|
||||
KeyActionsCe
|
||||
</h3>
|
||||
<KeyActionsCe />
|
||||
<hr>
|
||||
<h3>WanIpCheckCe</h3>
|
||||
<hr class="border-black">
|
||||
<h3 class="text-lg font-semibold font-mono">
|
||||
WanIpCheckCe
|
||||
</h3>
|
||||
<WanIpCheckCe php-wan-ip="47.184.85.45" />
|
||||
<hr>
|
||||
<h3>ModalsCe</h3>
|
||||
<hr class="border-black">
|
||||
<h3 class="text-lg font-semibold font-mono">
|
||||
ModalsCe
|
||||
</h3>
|
||||
<ModalsCe />
|
||||
</div>
|
||||
</client-only>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style lang="postcss" scoped>
|
||||
h2 {
|
||||
@apply text-xl font-semibold font-mono;
|
||||
}
|
||||
|
||||
h3 {
|
||||
@apply text-lg font-semibold font-mono;
|
||||
}
|
||||
|
||||
hr {
|
||||
@apply border-black;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -12,33 +12,47 @@ onBeforeMount(() => {
|
||||
<div class="text-black bg-white dark:text-white dark:bg-black">
|
||||
<div class="max-w-5xl mx-auto">
|
||||
<div class="flex flex-col gap-6 p-6">
|
||||
<h2>Web Components</h2>
|
||||
<h3>UserProfileCe</h3>
|
||||
<h2 class="text-xl font-semibold font-mono">
|
||||
Web Components
|
||||
</h2>
|
||||
<h3 class="text-lg font-semibold font-mono">
|
||||
UserProfileCe
|
||||
</h3>
|
||||
<unraid-i18n-host>
|
||||
<unraid-user-profile :server="JSON.stringify(serverState)" />
|
||||
</unraid-i18n-host>
|
||||
<hr>
|
||||
<h3>DownloadApiLogsCe</h3>
|
||||
<hr class="border-black">
|
||||
<h3 class="text-lg font-semibold font-mono">
|
||||
DownloadApiLogsCe
|
||||
</h3>
|
||||
<unraid-i18n-host>
|
||||
<unraid-download-api-logs />
|
||||
</unraid-i18n-host>
|
||||
<hr>
|
||||
<h3>AuthCe</h3>
|
||||
<hr class="border-black">
|
||||
<h3 class="text-lg font-semibold font-mono">
|
||||
AuthCe
|
||||
</h3>
|
||||
<unraid-i18n-host>
|
||||
<unraid-auth />
|
||||
</unraid-i18n-host>
|
||||
<hr>
|
||||
<h3>KeyActionsCe</h3>
|
||||
<hr class="border-black">
|
||||
<h3 class="text-lg font-semibold font-mono">
|
||||
KeyActionsCe
|
||||
</h3>
|
||||
<unraid-i18n-host>
|
||||
<unraid-key-actions />
|
||||
</unraid-i18n-host>
|
||||
<hr>
|
||||
<h3>WanIpCheckCe</h3>
|
||||
<hr class="border-black">
|
||||
<h3 class="text-lg font-semibold font-mono">
|
||||
WanIpCheckCe
|
||||
</h3>
|
||||
<unraid-i18n-host>
|
||||
<unraid-wan-ip-check php-wan-ip="47.184.85.45" />
|
||||
</unraid-i18n-host>
|
||||
<hr>
|
||||
<h3>ModalsCe</h3>
|
||||
<hr class="border-black">
|
||||
<h3 class="text-lg font-semibold font-mono">
|
||||
ModalsCe
|
||||
</h3>
|
||||
<unraid-i18n-host>
|
||||
<unraid-modals />
|
||||
</unraid-i18n-host>
|
||||
@@ -47,17 +61,3 @@ onBeforeMount(() => {
|
||||
</div>
|
||||
</client-only>
|
||||
</template>
|
||||
|
||||
<style lang="postcss" scoped>
|
||||
h2 {
|
||||
@apply text-xl font-semibold font-mono;
|
||||
}
|
||||
|
||||
h3 {
|
||||
@apply text-lg font-semibold font-mono;
|
||||
}
|
||||
|
||||
hr {
|
||||
@apply border-black;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -370,7 +370,15 @@ export const useServerStore = defineStore('server', () => {
|
||||
: '',
|
||||
};
|
||||
case 'EGUID':
|
||||
if (guidReplaceable.value) { messageEGUID = '<p>Your Unraid registration key is ineligible for replacement as it has been replaced within the last 12 months.</p>'; } else if (guidReplaceable.value === false && guidBlacklisted.value) { messageEGUID = '<p>The license key file does not correspond to the USB Flash boot device. Please copy the correct key file to the /config directory on your USB Flash boot device or choose Purchase Key.</p><p>Your Unraid registration key is ineligible for replacement as it is blacklisted.</p>'; } else if (guidReplaceable.value === false && !guidBlacklisted.value) { messageEGUID = '<p>The license key file does not correspond to the USB Flash boot device. Please copy the correct key file to the /config directory on your USB Flash boot device or choose Purchase Key.</p><p>Your Unraid registration key is ineligible for replacement as it has been replaced within the last 12 months.</p>'; } else { messageEGUID = '<p>The license key file does not correspond to the USB Flash boot device. Please copy the correct key file to the /config directory on your USB Flash boot device.</p><p>You may also attempt to Purchase or Replace your key.</p>'; } // basically guidReplaceable.value === null
|
||||
if (guidReplaceable.value) {
|
||||
messageEGUID = '<p>Your Unraid registration key is ineligible for replacement as it has been replaced within the last 12 months.</p>';
|
||||
} else if (guidReplaceable.value === false && guidBlacklisted.value) {
|
||||
messageEGUID = '<p>The license key file does not correspond to the USB Flash boot device. Please copy the correct key file to the /config directory on your USB Flash boot device or choose Purchase Key.</p><p>Your Unraid registration key is ineligible for replacement as it is blacklisted.</p>';
|
||||
} else if (guidReplaceable.value === false && !guidBlacklisted.value) {
|
||||
messageEGUID = '<p>The license key file does not correspond to the USB Flash boot device. Please copy the correct key file to the /config directory on your USB Flash boot device or choose Purchase Key.</p><p>Your Unraid registration key is ineligible for replacement as it has been replaced within the last 12 months.</p>';
|
||||
} else { // basically guidReplaceable.value === null
|
||||
messageEGUID = '<p>The license key file does not correspond to the USB Flash boot device. Please copy the correct key file to the /config directory on your USB Flash boot device.</p><p>You may also attempt to Purchase or Replace your key.</p>';
|
||||
}
|
||||
return {
|
||||
actions: [
|
||||
...(!registered.value && connectPluginInstalled.value ? [signInAction] : []),
|
||||
|
||||
Reference in New Issue
Block a user