enable contextual on-device translation in post menu
This commit is contained in:
@@ -19,7 +19,6 @@ import {useNavigation} from '@react-navigation/native'
|
|||||||
|
|
||||||
import {DISCOVER_DEBUG_DIDS} from '#/lib/constants'
|
import {DISCOVER_DEBUG_DIDS} from '#/lib/constants'
|
||||||
import {useOpenLink} from '#/lib/hooks/useOpenLink'
|
import {useOpenLink} from '#/lib/hooks/useOpenLink'
|
||||||
import {useTranslate} from '#/lib/hooks/useTranslate'
|
|
||||||
import {getCurrentRoute} from '#/lib/routes/helpers'
|
import {getCurrentRoute} from '#/lib/routes/helpers'
|
||||||
import {makeProfileLink} from '#/lib/routes/links'
|
import {makeProfileLink} from '#/lib/routes/links'
|
||||||
import {
|
import {
|
||||||
@@ -95,6 +94,7 @@ import {
|
|||||||
import * as Prompt from '#/components/Prompt'
|
import * as Prompt from '#/components/Prompt'
|
||||||
import {useAnalytics} from '#/analytics'
|
import {useAnalytics} from '#/analytics'
|
||||||
import {IS_INTERNAL} from '#/env'
|
import {IS_INTERNAL} from '#/env'
|
||||||
|
import {useMaybeTranslateOnDevice} from '#/translation'
|
||||||
import * as bsky from '#/types/bsky'
|
import * as bsky from '#/types/bsky'
|
||||||
|
|
||||||
let PostMenuItems = ({
|
let PostMenuItems = ({
|
||||||
@@ -133,7 +133,7 @@ let PostMenuItems = ({
|
|||||||
const {hidePost} = useHiddenPostsApi()
|
const {hidePost} = useHiddenPostsApi()
|
||||||
const feedFeedback = useFeedFeedbackContext()
|
const feedFeedback = useFeedFeedbackContext()
|
||||||
const openLink = useOpenLink()
|
const openLink = useOpenLink()
|
||||||
const translate = useTranslate()
|
const translate = useMaybeTranslateOnDevice()
|
||||||
const navigation = useNavigation<NavigationProp>()
|
const navigation = useNavigation<NavigationProp>()
|
||||||
const {mutedWordsDialogControl} = useGlobalDialogsControlContext()
|
const {mutedWordsDialogControl} = useGlobalDialogsControlContext()
|
||||||
const blockPromptControl = useDialogControl()
|
const blockPromptControl = useDialogControl()
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import {getLocales} from 'expo-localization'
|
|||||||
import {type TranslationTaskResult} from '@bsky.app/expo-translate-text/build/ExpoTranslateText.types'
|
import {type TranslationTaskResult} from '@bsky.app/expo-translate-text/build/ExpoTranslateText.types'
|
||||||
|
|
||||||
import {useOpenLink} from '#/lib/hooks/useOpenLink'
|
import {useOpenLink} from '#/lib/hooks/useOpenLink'
|
||||||
|
import {useTranslate} from '#/lib/hooks/useTranslate'
|
||||||
import {getTranslatorLink} from '#/locale/helpers'
|
import {getTranslatorLink} from '#/locale/helpers'
|
||||||
import {logger} from '#/logger'
|
import {logger} from '#/logger'
|
||||||
import {useLanguagePrefs} from '#/state/preferences'
|
import {useLanguagePrefs} from '#/state/preferences'
|
||||||
@@ -95,11 +96,7 @@ const Context = createContext<{
|
|||||||
sourceLangCode?: string,
|
sourceLangCode?: string,
|
||||||
) => Promise<void>
|
) => Promise<void>
|
||||||
clearTranslation: () => void
|
clearTranslation: () => void
|
||||||
}>({
|
} | null>(null)
|
||||||
translationState: IDLE,
|
|
||||||
translate: async () => {},
|
|
||||||
clearTranslation: () => {},
|
|
||||||
})
|
|
||||||
Context.displayName = 'TranslationContext'
|
Context.displayName = 'TranslationContext'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -120,6 +117,29 @@ export function useTranslateOnDevice() {
|
|||||||
return context
|
return context
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Triggers the on-device translation, if within the TranslateOnDeviceProvider.
|
||||||
|
* Otherwise, falls back to linking out to Google Translate.
|
||||||
|
*/
|
||||||
|
export function useMaybeTranslateOnDevice() {
|
||||||
|
const onDeviceTranslation = useContext(Context)
|
||||||
|
const fallbackTranslation = useTranslate()
|
||||||
|
|
||||||
|
return useCallback(
|
||||||
|
(text: string, targetLangCode: string, sourceLangCode?: string) => {
|
||||||
|
if (onDeviceTranslation) {
|
||||||
|
return onDeviceTranslation.translate(
|
||||||
|
text,
|
||||||
|
targetLangCode,
|
||||||
|
sourceLangCode,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return fallbackTranslation(text, targetLangCode, sourceLangCode)
|
||||||
|
},
|
||||||
|
[onDeviceTranslation, fallbackTranslation],
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
export function Provider({children}: React.PropsWithChildren<unknown>) {
|
export function Provider({children}: React.PropsWithChildren<unknown>) {
|
||||||
const [translationState, setTranslationState] =
|
const [translationState, setTranslationState] =
|
||||||
useState<TranslationState>(IDLE)
|
useState<TranslationState>(IDLE)
|
||||||
|
|||||||
Reference in New Issue
Block a user