mtcute/packages/i18n/src/utils.ts

73 lines
2.2 KiB
TypeScript
Raw Normal View History

import type * as clientNs from '@mtcute/client'
2022-07-19 02:47:59 +03:00
import { I18nStrings, I18nValue } from './types'
let client: typeof clientNs
try {
client = require('@mtcute/client') as typeof clientNs
} catch (e) {}
2022-09-12 15:01:43 +03:00
/**
* Create an index of i18n strings delimited by "."
*
* @param strings Strings object
*/
2023-09-24 01:32:22 +03:00
export function createI18nStringsIndex(strings: I18nStrings): Record<string, I18nValue> {
2022-07-19 02:47:59 +03:00
const ret: Record<string, I18nValue> = {}
function add(obj: I18nStrings, prefix: string) {
2022-07-19 02:47:59 +03:00
for (const key in obj) {
const val = obj[key]
if (typeof val === 'object' && !('value' in val)) {
2022-07-19 02:47:59 +03:00
add(val, prefix + key + '.')
} else {
ret[prefix + key] = val as string
2022-07-19 02:47:59 +03:00
}
}
}
add(strings, '')
return ret
}
2022-09-12 15:01:43 +03:00
/**
* Extract language from `@mtcute/client` update. Can be used for customized
* adapters or external i18n libraries.
*
* @param update Update to extract language from
*/
2023-09-24 01:32:22 +03:00
export function extractLanguageFromUpdate(update: clientNs.ParsedUpdate['data']): string | null | undefined {
if (!client) {
2023-09-24 01:32:22 +03:00
throw new Error('@mtcute/client is not installed, you must provide your own adapter')
}
switch (update.constructor) {
case client.Message:
2022-07-19 02:47:59 +03:00
// if sender is Chat it will just be undefined
2023-09-24 01:32:22 +03:00
return ((update as clientNs.Message).sender as clientNs.User).language
case client.PollVoteUpdate:
// if peer is Chat it will just be undefined
2023-09-24 01:32:22 +03:00
return ((update as clientNs.PollVoteUpdate).peer as clientNs.User).language
case client.ChatMemberUpdate:
case client.InlineQuery:
case client.ChosenInlineResult:
case client.CallbackQuery:
case client.BotStoppedUpdate:
case client.BotChatJoinRequestUpdate:
return (
update as
| clientNs.ChatMemberUpdate
| clientNs.InlineQuery
| clientNs.ChosenInlineResult
| clientNs.CallbackQuery
| clientNs.BotStoppedUpdate
| clientNs.BotChatJoinRequestUpdate
).user.language
2022-07-19 02:47:59 +03:00
}
return null
}