11import { deepCopy } from '@intlify/shared'
2- import { cachedFunction , useStorage } from 'nitropack/runtime'
32import { localeLoaders } from '#internal/i18n/options.mjs'
43import { getLocaleMessagesMerged } from '../../shared/messages'
4+ import { cachedFunctionI18n , isLocaleCacheable , isLocaleWithFallbacksCacheable } from './cache'
55
66import type { LocaleMessages } from '@intlify/core'
77import type { DefineLocaleMessage } from '@intlify/h3'
@@ -16,8 +16,8 @@ const _getMessages = async (locale: string) => {
1616/**
1717 * Load messages for the specified locale (cached)
1818 */
19- const _getMessagesCached = cachedFunction ( _getMessages , {
20- name : 'i18n:loadMessages ' ,
19+ const _getMessagesCached = cachedFunctionI18n ( _getMessages , {
20+ name : 'messages ' ,
2121 maxAge : ! __I18N_CACHE__ ? - 1 : 60 * 60 * 24 ,
2222 getKey : locale => locale ,
2323 shouldBypassCache : locale => ! isLocaleCacheable ( locale )
@@ -30,77 +30,57 @@ const _getMessagesCached = cachedFunction(_getMessages, {
3030 */
3131const getMessages = import . meta. dev ? _getMessages : _getMessagesCached
3232
33- const storage = useStorage ( 'i18n' )
34- type MessagesCached = { ttl : number ; value : LocaleMessages < DefineLocaleMessage > }
35- /**
36- * Load messages for the specified locale and merge with fallback locales in the shape of `{ [locale]: { ... } }`
37- * @param locale - The locale to load messages for
38- * @param fallbackLocales - The fallback locales to merge with
39- */
40- export const getMergedMessages = async ( locale : string , fallbackLocales : string [ ] ) => {
41- const cacheKey = `merged:${ locale } -[${ fallbackLocales . join ( '-' ) } ]`
42- const isCacheable = isLocaleWithFallbacksCacheable ( locale , fallbackLocales )
33+ const _getMergedMessages = async ( locale : string , fallbackLocales : string [ ] ) => {
34+ const merged = { } as LocaleMessages < DefineLocaleMessage >
4335
44- const cache = isCacheable && ( await storage . getItemRaw < MessagesCached > ( cacheKey ) )
45- if ( ! cache || cache . ttl < Date . now ( ) ) {
46- const merged = { } as LocaleMessages < DefineLocaleMessage >
47-
48- try {
49- if ( fallbackLocales . length > 0 ) {
50- const messages = await Promise . all ( fallbackLocales . map ( getMessages ) )
51- for ( const message of messages ) {
52- deepCopy ( message , merged )
53- }
36+ try {
37+ if ( fallbackLocales . length > 0 ) {
38+ const messages = await Promise . all ( fallbackLocales . map ( getMessages ) )
39+ for ( const message of messages ) {
40+ deepCopy ( message , merged )
5441 }
42+ }
5543
56- const message = await getMessages ( locale )
57- deepCopy ( message , merged )
44+ const message = await getMessages ( locale )
45+ deepCopy ( message , merged )
5846
59- if ( isCacheable ) {
60- await storage . setItemRaw ( cacheKey , { ttl : Date . now ( ) + 1000 * 5 , value : merged } )
61- }
62- return merged
63- } catch ( e ) {
64- throw new Error ( 'Failed to merge messages: ' + ( e as Error ) . message )
65- }
47+ return merged
48+ } catch ( e ) {
49+ throw new Error ( 'Failed to merge messages: ' + ( e as Error ) . message )
6650 }
67-
68- return cache . value
6951}
7052
71- export const getAllMergedMessages = async ( locales : string [ ] ) => {
72- const cacheKey = `merged-full:${ locales . join ( '-' ) } `
73- const isCacheable = locales . every ( locale => isLocaleCacheable ( locale ) )
53+ /**
54+ * Load messages for the specified locale and merge with fallback locales in the shape of `{ [locale]: { ... } }`
55+ * @param locale - The locale to load messages for
56+ * @param fallbackLocales - The fallback locales to merge with
57+ */
58+ export const getMergedMessages = cachedFunctionI18n ( _getMergedMessages , {
59+ name : 'merged-single' ,
60+ maxAge : ! __I18N_CACHE__ ? - 1 : 60 * 60 * 24 ,
61+ getKey : ( locale , fallbackLocales ) => `${ locale } -[${ [ ...new Set ( fallbackLocales ) ] . sort ( ) . join ( '-' ) } ]` ,
62+ shouldBypassCache : ( locale , fallbackLocales ) => ! isLocaleWithFallbacksCacheable ( locale , fallbackLocales )
63+ } )
7464
75- const cache = isCacheable && ( await storage . getItemRaw < MessagesCached > ( cacheKey ) )
76- if ( ! cache || cache . ttl < Date . now ( ) ) {
77- const merged = { } as LocaleMessages < DefineLocaleMessage >
65+ const _getAllMergedMessages = async ( locales : string [ ] ) => {
66+ const merged = { } as LocaleMessages < DefineLocaleMessage >
7867
79- try {
80- const messages = await Promise . all ( locales . map ( getMessages ) )
81- for ( const message of messages ) {
82- deepCopy ( message , merged )
83- }
68+ try {
69+ const messages = await Promise . all ( locales . map ( getMessages ) )
8470
85- if ( isCacheable ) {
86- await storage . setItemRaw ( cacheKey , { ttl : Date . now ( ) + 1000 * 5 , value : merged } )
87- }
88- return merged
89- } catch ( e ) {
90- throw new Error ( 'Failed to merge messages: ' + ( e as Error ) . message )
71+ for ( const message of messages ) {
72+ deepCopy ( message , merged )
9173 }
92- }
9374
94- return cache . value
95- }
96-
97- /**
98- * Check if the loaders for the specified locale are all cacheable
99- */
100- export function isLocaleCacheable ( locale : string ) {
101- return localeLoaders [ locale ] != null && localeLoaders [ locale ] . every ( loader => loader . cache !== false )
75+ return merged
76+ } catch ( e ) {
77+ throw new Error ( 'Failed to merge messages: ' + ( e as Error ) . message )
78+ }
10279}
10380
104- export function isLocaleWithFallbacksCacheable ( locale : string , fallbackLocales : string [ ] ) {
105- return isLocaleCacheable ( locale ) && fallbackLocales . every ( fallbackLocale => isLocaleCacheable ( fallbackLocale ) )
106- }
81+ export const getAllMergedMessages = cachedFunctionI18n ( _getAllMergedMessages , {
82+ name : 'merged-all' ,
83+ maxAge : ! __I18N_CACHE__ ? - 1 : 60 * 60 * 24 ,
84+ getKey : locales => locales . join ( '-' ) ,
85+ shouldBypassCache : locales => ! locales . every ( locale => isLocaleCacheable ( locale ) )
86+ } )
0 commit comments