Guest User

Untitled

a guest
Jan 23rd, 2019
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.29 KB | None | 0 0
  1. {
  2. "hosting": {
  3. "public": "dist",
  4. "ignore": [
  5. "firebase.json",
  6. "**/.*",
  7. "**/node_modules/**"
  8. ],
  9. "rewrites": [
  10. {
  11. "source": "/en-us/**",
  12. "destination": "/en-us/index.html"
  13. },
  14. {
  15. "source": "/es-co/**",
  16. "destination": "/es-co/index.html"
  17. },
  18. {
  19. "source": "/zh-hans/**",
  20. "destination": "/zh-hans/index.html"
  21. },
  22. {
  23. "source": "**",
  24. "destination": "/en-us/index.html"
  25. }
  26. ]
  27. }
  28. }
  29.  
  30. {
  31. "functions": {
  32. "predeploy": [
  33. "npm --prefix "$RESOURCE_DIR" run lint"
  34. ]
  35. },
  36. "hosting": {
  37. "public": "dist",
  38. "ignore": [
  39. "firebase.json",
  40. "**/.*",
  41. "**/node_modules/**"
  42. ],
  43. "rewrites": [
  44. {
  45. "source": "**",
  46. "function": "multilang"
  47. }
  48. ]
  49. }
  50. }
  51.  
  52. const express = require('express')
  53. const expressLocale = require('express-locale')
  54. const cookieParser = require('cookie-parser')
  55. const functions = require('firebase-functions')
  56. const path = require('path')
  57. const fs = require('fs')
  58. const _ = require('lodash')
  59.  
  60. const app = express()
  61.  
  62. const localeMap = {
  63. en: 'en_US',
  64. es: 'es_CO',
  65. zh: 'zh_TW',
  66. 'en-US': 'en_US',
  67. 'es-CO': 'es_CO',
  68. 'zh-TW': 'zh_TW',
  69. 'zh-Hans': 'zh_TW',
  70. en_US: 'en_US',
  71. es_CO: 'es_CO',
  72. zh_TW: 'zh_TW',
  73. zh_Hans: 'zh_TW'
  74. }
  75.  
  76. const defaultLocale = 'en_US'
  77.  
  78. const baseMap = {
  79. en_US: 'en-us',
  80. es_CO: 'es-co',
  81. zh_TW: 'zh-hans'
  82. }
  83.  
  84. app
  85. .use(cookieParser())
  86. .use(expressLocale({
  87. priority: ['cookie', 'accept-language', 'map', 'default'],
  88. default: defaultLocale,
  89. map: localeMap
  90. }))
  91. .use('**', (req, res, next) => {
  92. const locale = localeMap[req.locale.language]
  93. const sanitized = req.originalUrl.replace(/.{2,}/g, '').replace(//{2,}/g, '/')
  94. const url = sanitized.split('/')
  95. const idx = url.length === 1 ? 0 : 1
  96.  
  97. url[0] = _.values(baseMap).includes(url[idx]) ?
  98. url[idx] : (baseMap[locale] || baseMap[defaultLocale])
  99.  
  100. if (url.length > 1 && url[0] === url[1]) {
  101. url.shift()
  102. }
  103.  
  104. let file = path.resolve(`dist/${url.join('/')}`)
  105.  
  106. if (!url[url.length - 1].match(/^[w,s-]+.[a-z0-9]{2,4}$/) || !fs.existsSync(file)) {
  107. file = path.resolve(`dist/${url[0]}/index.html`)
  108. }
  109.  
  110. res.sendFile(file)
  111. })
  112.  
  113. exports.multilang = functions.https.onRequest(app)
Add Comment
Please, Sign In to add comment