mirror of
https://github.com/Chocobozzz/PeerTube.git
synced 2025-10-05 19:42:24 +02:00
Prepare i18n files
This commit is contained in:
parent
1dd59831f8
commit
989e526abf
28 changed files with 853 additions and 166 deletions
|
@ -3,17 +3,24 @@ import * as express from 'express'
|
|||
import { join } from 'path'
|
||||
import * as validator from 'validator'
|
||||
import { escapeHTML, readFileBufferPromise, root } from '../helpers/core-utils'
|
||||
import { CONFIG, EMBED_SIZE, OPENGRAPH_AND_OEMBED_COMMENT, STATIC_MAX_AGE, STATIC_PATHS } from '../initializers'
|
||||
import {
|
||||
ACCEPT_HEADERS,
|
||||
CONFIG,
|
||||
EMBED_SIZE,
|
||||
OPENGRAPH_AND_OEMBED_COMMENT,
|
||||
STATIC_MAX_AGE,
|
||||
STATIC_PATHS
|
||||
} from '../initializers'
|
||||
import { asyncMiddleware } from '../middlewares'
|
||||
import { VideoModel } from '../models/video/video'
|
||||
import { VideoPrivacy } from '../../shared/models/videos'
|
||||
import { I18N_LOCALES, is18nLocale, getDefaultLocale } from '../../shared/models'
|
||||
|
||||
const clientsRouter = express.Router()
|
||||
|
||||
const distPath = join(root(), 'client', 'dist')
|
||||
const assetsImagesPath = join(root(), 'client', 'dist', 'assets', 'images')
|
||||
const embedPath = join(distPath, 'standalone', 'videos', 'embed.html')
|
||||
const indexPath = join(distPath, 'index.html')
|
||||
|
||||
// Special route that add OpenGraph and oEmbed tags
|
||||
// Do not use a template engine for a so little thing
|
||||
|
@ -45,6 +52,16 @@ clientsRouter.use('/client/*', (req: express.Request, res: express.Response, nex
|
|||
res.sendStatus(404)
|
||||
})
|
||||
|
||||
// Always serve index client page (the client is a single page application, let it handle routing)
|
||||
// Try to provide the right language index.html
|
||||
clientsRouter.use('/(:language)?', function (req, res) {
|
||||
if (req.accepts(ACCEPT_HEADERS) === 'html') {
|
||||
return res.sendFile(getIndexPath(req, req.params.language))
|
||||
}
|
||||
|
||||
return res.status(404).end()
|
||||
})
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export {
|
||||
|
@ -53,6 +70,19 @@ export {
|
|||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
function getIndexPath (req: express.Request, paramLang?: string) {
|
||||
let lang: string
|
||||
|
||||
// Check param lang validity
|
||||
if (paramLang && is18nLocale(paramLang)) {
|
||||
lang = paramLang
|
||||
} else {
|
||||
lang = req.acceptsLanguages(Object.keys(I18N_LOCALES)) || getDefaultLocale()
|
||||
}
|
||||
|
||||
return join(__dirname, '../../../client/dist/' + lang + '/index.html')
|
||||
}
|
||||
|
||||
function addOpenGraphAndOEmbedTags (htmlStringPage: string, video: VideoModel) {
|
||||
const previewUrl = CONFIG.WEBSERVER.URL + STATIC_PATHS.PREVIEWS + video.getPreviewName()
|
||||
const videoUrl = CONFIG.WEBSERVER.URL + '/videos/watch/' + video.uuid
|
||||
|
@ -142,18 +172,18 @@ async function generateWatchHtmlPage (req: express.Request, res: express.Respons
|
|||
} else if (validator.isInt(videoId)) {
|
||||
videoPromise = VideoModel.loadAndPopulateAccountAndServerAndTags(+videoId)
|
||||
} else {
|
||||
return res.sendFile(indexPath)
|
||||
return res.sendFile(getIndexPath(req))
|
||||
}
|
||||
|
||||
let [ file, video ] = await Promise.all([
|
||||
readFileBufferPromise(indexPath),
|
||||
readFileBufferPromise(getIndexPath(req)),
|
||||
videoPromise
|
||||
])
|
||||
|
||||
const html = file.toString()
|
||||
|
||||
// Let Angular application handle errors
|
||||
if (!video || video.privacy === VideoPrivacy.PRIVATE) return res.sendFile(indexPath)
|
||||
if (!video || video.privacy === VideoPrivacy.PRIVATE) return res.sendFile(getIndexPath(req))
|
||||
|
||||
const htmlStringPageWithTags = addOpenGraphAndOEmbedTags(html, video)
|
||||
res.set('Content-Type', 'text/html; charset=UTF-8').send(htmlStringPageWithTags)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue