mirror of
https://github.com/d0zingcat/NotionNext.git
synced 2026-05-20 15:09:40 +00:00
Merge branch 'main' into pr/emengweb/1007
This commit is contained in:
53
lib/lang.js
53
lib/lang.js
@@ -4,47 +4,58 @@ import zhHK from './lang/zh-HK'
|
||||
import zhTW from './lang/zh-TW'
|
||||
import frFR from './lang/fr-FR'
|
||||
import trTR from './lang/tr-TR'
|
||||
import jaJP from './lang/ja-JP'
|
||||
import cookie from 'react-cookies'
|
||||
import { getQueryVariable, isBrowser, mergeDeep } from './utils'
|
||||
|
||||
/**
|
||||
* 在这里配置所有支持的语言
|
||||
* 国家-地区
|
||||
*/
|
||||
const lang = {
|
||||
'en-US': enUS,
|
||||
'zh-CN': zhCN,
|
||||
'zh-HK': zhHK,
|
||||
'zh-TW': zhTW,
|
||||
'fr-FR': frFR,
|
||||
'tr-TR': trTR
|
||||
'tr-TR': trTR,
|
||||
'ja-JP': jaJP
|
||||
}
|
||||
|
||||
export default lang
|
||||
|
||||
/**
|
||||
* 获取当前语言字典
|
||||
* 如果匹配到完整的“国家-地区”语言,则显示国家的语言
|
||||
* @returns 不同语言对应字典
|
||||
*/
|
||||
export function generateLocaleDict(langString) {
|
||||
let userLocale = lang['en-US']
|
||||
const supportedLocales = Object.keys(lang)
|
||||
let userLocale
|
||||
|
||||
switch (langString.toLowerCase()) {
|
||||
case 'zh-cn':
|
||||
case 'zh-sg':
|
||||
userLocale = lang['zh-CN']
|
||||
break
|
||||
case 'zh-hk':
|
||||
userLocale = lang['zh-HK']
|
||||
break
|
||||
case 'zh-tw':
|
||||
userLocale = lang['zh-TW']
|
||||
break
|
||||
case 'fr-fr':
|
||||
userLocale = lang['fr-FR']
|
||||
break
|
||||
case 'tr-tr':
|
||||
userLocale = lang['tr-TR']
|
||||
break
|
||||
default:
|
||||
userLocale = lang['en-US']
|
||||
// 将语言字符串拆分为语言和地区代码,例如将 "zh-CN" 拆分为 "zh" 和 "CN"
|
||||
const [language, region] = langString.split(/[-_]/)
|
||||
|
||||
// 优先匹配语言和地区都匹配的情况
|
||||
const specificLocale = `${language}-${region}`
|
||||
if (supportedLocales.includes(specificLocale)) {
|
||||
userLocale = lang[specificLocale]
|
||||
}
|
||||
|
||||
// 然后尝试匹配只有语言匹配的情况
|
||||
if (!userLocale) {
|
||||
const languageOnlyLocales = supportedLocales.filter(locale => locale.startsWith(language))
|
||||
if (languageOnlyLocales.length > 0) {
|
||||
userLocale = lang[languageOnlyLocales[0]]
|
||||
}
|
||||
}
|
||||
|
||||
// 如果还没匹配到,则返回最接近的语言包
|
||||
if (!userLocale) {
|
||||
const fallbackLocale = supportedLocales.find(locale => locale.startsWith('en'))
|
||||
userLocale = lang[fallbackLocale]
|
||||
}
|
||||
|
||||
return mergeDeep({}, lang['en-US'], userLocale)
|
||||
}
|
||||
|
||||
|
||||
@@ -39,7 +39,8 @@ export default {
|
||||
DEBUG_OPEN: 'Debug',
|
||||
DEBUG_CLOSE: 'Close',
|
||||
THEME_SWITCH: 'Theme Switch',
|
||||
ANNOUNCEMENT: 'Announcement'
|
||||
ANNOUNCEMENT: 'Announcement',
|
||||
START_READING: 'Start Reading'
|
||||
},
|
||||
PAGINATION: {
|
||||
PREV: 'Prev',
|
||||
|
||||
59
lib/lang/ja-JP.js
Normal file
59
lib/lang/ja-JP.js
Normal file
@@ -0,0 +1,59 @@
|
||||
export default {
|
||||
LOCALE: 'ja-JP',
|
||||
NAV: {
|
||||
INDEX: 'ホーム',
|
||||
RSS: '購読',
|
||||
SEARCH: '検索',
|
||||
ABOUT: 'このサイトについて',
|
||||
NAVIGATOR: 'ナビゲーション',
|
||||
MAIL: 'メール',
|
||||
ARCHIVE: 'アーカイブ'
|
||||
},
|
||||
COMMON: {
|
||||
MORE: 'さらに',
|
||||
NO_MORE: 'それ以上ありません',
|
||||
LATEST_POSTS: '最新の記事',
|
||||
TAGS: 'タグ',
|
||||
NO_TAG: 'タグなし',
|
||||
CATEGORY: 'カテゴリ',
|
||||
SHARE: 'シェア',
|
||||
SCAN_QR_CODE: 'WeChatで共有',
|
||||
URL_COPIED: 'リンクがコピーされました!',
|
||||
TABLE_OF_CONTENTS: '目次',
|
||||
RELATE_POSTS: '関連する記事',
|
||||
COPYRIGHT: '免責事項',
|
||||
AUTHOR: '作成者',
|
||||
URL: 'リンク',
|
||||
ANALYTICS: '統計',
|
||||
POSTS: '記事',
|
||||
ARTICLE: '記事',
|
||||
VISITORS: '人の訪問者',
|
||||
VIEWS: '回の閲覧',
|
||||
COPYRIGHT_NOTICE: 'この記事はCC BY-NC-SA 4.0 ライセンスの下でライセンスされています。転載する場合には出典を明らかにしてください。',
|
||||
RESULT_OF_SEARCH: '個の検索結果',
|
||||
ARTICLE_DETAIL: '記事の詳細',
|
||||
PASSWORD_ERROR: 'パスワードが違います!',
|
||||
ARTICLE_LOCK_TIPS: 'この記事はロックされています。アクセスパスワードを入力してください。',
|
||||
SUBMIT: '送信',
|
||||
POST_TIME: '公開日',
|
||||
LAST_EDITED_TIME: '最終更新日',
|
||||
RECENT_COMMENTS: '最近のコメント',
|
||||
DEBUG_OPEN: 'デバッグをオンにする',
|
||||
DEBUG_CLOSE: 'デバッグをオフにする',
|
||||
THEME_SWITCH: 'テーマの切り替え',
|
||||
ANNOUNCEMENT: 'お知らせ',
|
||||
START_READING: '読み始める'
|
||||
},
|
||||
PAGINATION: {
|
||||
PREV: '前のページ',
|
||||
NEXT: '次のページ'
|
||||
},
|
||||
SEARCH: {
|
||||
ARTICLES: '記事を検索',
|
||||
TAGS: 'タグを検索'
|
||||
},
|
||||
POST: {
|
||||
BACK: '前のページに戻る',
|
||||
TOP: '上に戻る'
|
||||
}
|
||||
}
|
||||
@@ -17,7 +17,7 @@ export default {
|
||||
NO_TAG: 'NoTag',
|
||||
CATEGORY: '分类',
|
||||
SHARE: '分享',
|
||||
SCAN_QR_CODE: '扫一扫二维码',
|
||||
SCAN_QR_CODE: '微信扫码分享',
|
||||
URL_COPIED: '链接已复制!',
|
||||
TABLE_OF_CONTENTS: '目录',
|
||||
RELATE_POSTS: '相关文章',
|
||||
@@ -41,7 +41,8 @@ export default {
|
||||
DEBUG_OPEN: '开启调试',
|
||||
DEBUG_CLOSE: '关闭调试',
|
||||
THEME_SWITCH: '切换主题',
|
||||
ANNOUNCEMENT: '公告'
|
||||
ANNOUNCEMENT: '公告',
|
||||
START_READING: '开始阅读'
|
||||
},
|
||||
PAGINATION: {
|
||||
PREV: '上一页',
|
||||
|
||||
@@ -65,10 +65,10 @@ export async function getNotionPageData({ pageId, from }) {
|
||||
const cacheKey = 'page_block_' + pageId
|
||||
const data = await getDataFromCache(cacheKey)
|
||||
if (data && data.pageIds?.length > 0) {
|
||||
console.log('[命中缓存]:', `from:${from}`, `root-page-id:${pageId}`)
|
||||
console.log('[缓存]:', `from:${from}`, `root-page-id:${pageId}`)
|
||||
return data
|
||||
}
|
||||
const pageRecordMap = await getPageRecordMapByNotionAPI({ pageId, from })
|
||||
const pageRecordMap = await getDataBaseInfoByNotionAPI({ pageId, from })
|
||||
// 存入缓存
|
||||
if (pageRecordMap) {
|
||||
await setDataToCache(cacheKey, pageRecordMap)
|
||||
@@ -177,24 +177,44 @@ async function getNotice(post) {
|
||||
* 调用NotionAPI获取Page数据
|
||||
* @returns {Promise<JSX.Element|null|*>}
|
||||
*/
|
||||
async function getPageRecordMapByNotionAPI({ pageId, from }) {
|
||||
async function getDataBaseInfoByNotionAPI({ pageId, from }) {
|
||||
const pageRecordMap = await getPostBlocks(pageId, from)
|
||||
if (!pageRecordMap) {
|
||||
return []
|
||||
console.error('can`t get Notion Data ; Which id is: ', pageId)
|
||||
return {}
|
||||
}
|
||||
pageId = idToUuid(pageId)
|
||||
const block = pageRecordMap.block
|
||||
const block = pageRecordMap.block || {}
|
||||
const rawMetadata = block[pageId]?.value
|
||||
// Check Type Page-Database和Inline-Database
|
||||
if (
|
||||
rawMetadata?.type !== 'collection_view_page' &&
|
||||
rawMetadata?.type !== 'collection_view'
|
||||
rawMetadata?.type !== 'collection_view_page' && rawMetadata?.type !== 'collection_view'
|
||||
) {
|
||||
console.warn(`pageId "${pageId}" is not a database`)
|
||||
return null
|
||||
console.error(`pageId "${pageId}" is not a database`)
|
||||
return {
|
||||
notice: null,
|
||||
siteInfo: getBlogInfo({}),
|
||||
allPages: [{ id: 1, title: `无法获取Notion数据,请检查Notion_ID: \n 当前 ${pageId}`, summary: '访问文档获取帮助→ https://tangly1024.com/article/vercel-deploy-notion-next', status: 'Published', type: 'Post', slug: '13a171332816461db29d50e9f575b00d', date: { start_date: '2023-04-24', lastEditedTime: '2023-04-24', tagItems: [] } }],
|
||||
collection: [],
|
||||
collectionQuery: {},
|
||||
collectionId: null,
|
||||
collectionView: {},
|
||||
viewIds: [],
|
||||
block: {},
|
||||
schema: {},
|
||||
tagOptions: [],
|
||||
categoryOptions: [],
|
||||
rawMetadata: {},
|
||||
customNav: [],
|
||||
customMenu: [],
|
||||
postCount: 1,
|
||||
pageIds: [],
|
||||
latestPosts: []
|
||||
}
|
||||
}
|
||||
|
||||
const collection = Object.values(pageRecordMap.collection)[0]?.value
|
||||
const collection = Object.values(pageRecordMap.collection)[0]?.value || {}
|
||||
const siteInfo = getBlogInfo({ collection, block })
|
||||
const collectionId = rawMetadata?.collection_id
|
||||
const collectionQuery = pageRecordMap.collection_query
|
||||
const collectionView = pageRecordMap.collection_view
|
||||
@@ -222,7 +242,7 @@ async function getPageRecordMapByNotionAPI({ pageId, from }) {
|
||||
let postCount = 0
|
||||
// 查找所有的Post和Page
|
||||
const allPages = collectionData.filter(post => {
|
||||
if (post.type === BLOG.NOTION_PROPERTY_NAME.type_post && post.status === BLOG.NOTION_PROPERTY_NAME.status_publish) {
|
||||
if (post.type === 'Post' && post.status === 'Published') {
|
||||
postCount++
|
||||
}
|
||||
return post && post?.slug &&
|
||||
@@ -242,7 +262,6 @@ async function getPageRecordMapByNotionAPI({ pageId, from }) {
|
||||
const notice = await getNotice(collectionData.filter(post => { return post && post?.type && post?.type === 'Notice' && post.status === 'Published' })?.[0])
|
||||
const categoryOptions = getAllCategories({ allPages, categoryOptions: getCategoryOptions(schema) })
|
||||
const tagOptions = getAllTags({ allPages, tagOptions: getTagOptions(schema) })
|
||||
const siteInfo = getBlogInfo({ collection, block })
|
||||
const customNav = getCustomNav({ allPages: collectionData.filter(post => post.type === 'Page' && post.status === 'Published') })
|
||||
// 新的菜单
|
||||
const customMenu = await getCustomMenu({ collectionData })
|
||||
|
||||
@@ -14,7 +14,7 @@ export async function getPostBlocks(id, from, slice) {
|
||||
const cacheKey = 'page_block_' + id
|
||||
let pageBlock = await getDataFromCache(cacheKey)
|
||||
if (pageBlock) {
|
||||
console.log('[命中缓存]:', `from:${from}`, cacheKey)
|
||||
console.log('[缓存]:', `from:${from}`, cacheKey)
|
||||
return filterPostBlocks(id, pageBlock, slice)
|
||||
}
|
||||
|
||||
@@ -40,7 +40,7 @@ export async function getPageWithRetry(id, from, retryAttempts = 3) {
|
||||
console.log('[请求API]', `from:${from}`, `id:${id}`, retryAttempts < 3 ? `剩余重试次数:${retryAttempts}` : '')
|
||||
try {
|
||||
const authToken = BLOG.NOTION_ACCESS_TOKEN || null
|
||||
const api = new NotionAPI({ authToken, userTimeZone: 'Asia/ShangHai' })
|
||||
const api = new NotionAPI({ authToken, userTimeZone: Intl.DateTimeFormat().resolvedOptions().timeZone })
|
||||
const pageData = await api.getPage(id)
|
||||
console.info('[响应成功]:', `from:${from}`)
|
||||
return pageData
|
||||
|
||||
Reference in New Issue
Block a user