diff --git a/bin/svgs.js b/bin/svgs.js index 7c5ef9f5a..d193bdd4f 100644 --- a/bin/svgs.js +++ b/bin/svgs.js @@ -60,5 +60,6 @@ export default [ { id: 'fa-crosshairs', src: 'src/thirdparty/font-awesome-svg-png/white/svg/crosshairs.svg' }, { id: 'fa-magic', src: 'src/thirdparty/font-awesome-svg-png/white/svg/magic.svg' }, { id: 'fa-hashtag', src: 'src/thirdparty/font-awesome-svg-png/white/svg/hashtag.svg' }, - { id: 'fa-bookmark', src: 'src/thirdparty/font-awesome-svg-png/white/svg/bookmark.svg' } + { id: 'fa-bookmark', src: 'src/thirdparty/font-awesome-svg-png/white/svg/bookmark.svg' }, + { id: 'fa-language', src: 'src/thirdparty/font-awesome-svg-png/white/svg/language.svg' } ] diff --git a/src/intl/en-US.js b/src/intl/en-US.js index e952f4eea..5960bb3dc 100644 --- a/src/intl/en-US.js +++ b/src/intl/en-US.js @@ -330,7 +330,7 @@ export default { aboutAppDescription: `
Semaphore is
- free and open-source software
+ free and open-source software
maintained by Nick Colley
and distributed under the
Languages
+ languages: 'Languages',
+ addLanguage: 'Add language',
+ add: 'Add',
+ languageCode: 'Language code',
+ enterLanguageCode: 'Enter language code',
+ getLanguageCode: 'Language should be code from ISO-639 base. To check the right code for the language visti IANA language sub-tag registry.',
+ ianaLanguageRegistry: 'IANA registry',
+ setLanguageLabel: 'Set language (current {label})',
+ setLanguage: 'Set language'
}
diff --git a/src/routes/_actions/addLanguage.js b/src/routes/_actions/addLanguage.js
new file mode 100644
index 000000000..fa4042e1f
--- /dev/null
+++ b/src/routes/_actions/addLanguage.js
@@ -0,0 +1,16 @@
+import { store } from '../_store/store.js'
+import { goto } from '../../../__sapper__/client.js'
+
+export function addLanguage () {
+ const { languages, newLanguage } = store.get()
+ languages.push(newLanguage.toLowerCase().trim())
+ store.set({ languages })
+ store.save()
+ goto('/settings/languages')
+}
+
+export function resetNewLanguage() {
+ const newLanguage = ''
+ store.set({ newLanguage })
+ store.save()
+}
diff --git a/src/routes/_actions/compose.js b/src/routes/_actions/compose.js
index d24515558..d559f9f8e 100644
--- a/src/routes/_actions/compose.js
+++ b/src/routes/_actions/compose.js
@@ -27,7 +27,7 @@ export async function insertHandleForReply (statusId) {
export async function postStatus (realm, text, inReplyToId, mediaIds,
sensitive, spoilerText, visibility,
- mediaDescriptions, inReplyToUuid, poll, mediaFocalPoints) {
+ mediaDescriptions, inReplyToUuid, poll, mediaFocalPoints, language) {
const { currentInstance, accessToken, online } = store.get()
if (!online) {
@@ -56,7 +56,7 @@ export async function postStatus (realm, text, inReplyToId, mediaIds,
}
}))
const status = await postStatusToServer(currentInstance, accessToken, text,
- inReplyToId, mediaIds, sensitive, spoilerText, visibility, poll, mediaFocalPoints)
+ inReplyToId, mediaIds, sensitive, spoilerText, visibility, poll, language, mediaFocalPoints)
addStatusOrNotification(currentInstance, 'home', status)
store.clearComposeData(realm)
emit('postedStatus', realm, inReplyToUuid)
diff --git a/src/routes/_actions/language.js b/src/routes/_actions/language.js
new file mode 100644
index 000000000..f8d42fa68
--- /dev/null
+++ b/src/routes/_actions/language.js
@@ -0,0 +1,5 @@
+import { store } from '../_store/store.js'
+
+export function setLanguage (realm, language) {
+ store.setComposeData(realm, { language })
+}
diff --git a/src/routes/_api/statuses.js b/src/routes/_api/statuses.js
index 2ab1a5db3..c4941ebe7 100644
--- a/src/routes/_api/statuses.js
+++ b/src/routes/_api/statuses.js
@@ -3,13 +3,14 @@ import { DEFAULT_TIMEOUT, get, post, put, WRITE_TIMEOUT } from '../_utils/ajax.j
// post is create, put is edit
async function postOrPutStatus (url, accessToken, method, text, inReplyToId, mediaIds,
- sensitive, spoilerText, visibility, poll) {
+ sensitive, spoilerText, visibility, poll, language) {
const body = {
status: text,
media_ids: mediaIds,
sensitive,
spoiler_text: spoilerText,
poll,
+ language,
...(method === 'post' && {
// you can't change these properties when editing
in_reply_to_id: inReplyToId,
@@ -31,17 +32,17 @@ async function postOrPutStatus (url, accessToken, method, text, inReplyToId, med
}
export async function postStatus (instanceName, accessToken, text, inReplyToId, mediaIds,
- sensitive, spoilerText, visibility, poll) {
+ sensitive, spoilerText, visibility, poll, language) {
const url = `${basename(instanceName)}/api/v1/statuses`
return postOrPutStatus(url, accessToken, 'post', text, inReplyToId, mediaIds,
- sensitive, spoilerText, visibility, poll)
+ sensitive, spoilerText, visibility, poll, language)
}
export async function putStatus (instanceName, accessToken, id, text, inReplyToId, mediaIds,
- sensitive, spoilerText, visibility, poll) {
+ sensitive, spoilerText, visibility, poll, language) {
const url = `${basename(instanceName)}/api/v1/statuses/${id}`
return postOrPutStatus(url, accessToken, 'put', text, inReplyToId, mediaIds,
- sensitive, spoilerText, visibility, poll)
+ sensitive, spoilerText, visibility, poll, language)
}
export async function getStatusContext (instanceName, accessToken, statusId) {
diff --git a/src/routes/_components/compose/ComposeBox.html b/src/routes/_components/compose/ComposeBox.html
index 4f416c693..805e04927 100644
--- a/src/routes/_components/compose/ComposeBox.html
+++ b/src/routes/_components/compose/ComposeBox.html
@@ -19,7 +19,7 @@ {intl.composeStatus}
{intl.composeStatus}
poll: ({ composeData }) => composeData.poll,
inReplyToId: ({ composeData }) => composeData.inReplyToId,
postPrivacy: ({ postPrivacyKey }) => POST_PRIVACY_OPTIONS.find(_ => _.key === postPrivacyKey),
+ language: ({ composeData, $languages }) => {
+ return composeData.language ? composeData.language : ($languages.length ? $languages[0] : 'en')
+ },
defaultPostPrivacyKey: ({ $currentVerifyCredentials }) => (
($currentVerifyCredentials && $currentVerifyCredentials.source.privacy) || 'public'
),
@@ -219,7 +222,8 @@ {intl.composeStatus}
inReplyToUuid, // typical replies, using Semaphore-specific uuid
inReplyToId, // delete-and-redraft replies, using standard id
poll,
- sensitive
+ sensitive,
+ language
} = this.get()
const mediaIds = media.map(_ => _.data.id)
const mediaDescriptions = media.map(_ => _.description)
@@ -248,7 +252,7 @@ {intl.composeStatus}
/* no await */ postStatus(realm, text, inReplyTo, mediaIds,
sensitive, contentWarning, postPrivacyKey,
mediaDescriptions, inReplyToUuid, pollToPost,
- mediaFocalPoints)
+ mediaFocalPoints, language)
}
}
}
diff --git a/src/routes/_components/compose/ComposeToolbar.html b/src/routes/_components/compose/ComposeToolbar.html
index 88605303b..89ebdde79 100644
--- a/src/routes/_components/compose/ComposeToolbar.html
+++ b/src/routes/_components/compose/ComposeToolbar.html
@@ -38,6 +38,12 @@
pressable={true}
pressed={contentWarningShown}
/>
+ {intl.languages}
+
+