Overview
Doom provides React hooks for accessing translations, language settings, site overrides, and utility functions. All hooks follow React’s rules of hooks and must be called from React components or custom hooks.
Import
import {
useLang,
useTranslation,
useSiteOverrides,
useIsPrint,
useInterval,
useMemoizedFn
} from 'doom'
Internationalization Hooks
useLang
Returns the current language code.
export const useLang = () => Language
Current language: 'en', 'zh', or 'ru'
Example:
import { useLang } from 'doom'
function MyComponent() {
const lang = useLang()
return <div>Current language: {lang}</div>
}
useTranslation
Returns a function to get translated strings for UI elements.
export const useTranslation = () => (key: keyof Translation) => string
Function that accepts a translation key and returns the translated string
Example:
import { useTranslation } from 'doom'
function CollapseButton() {
const t = useTranslation()
const [collapsed, setCollapsed] = useState(false)
return (
<button onClick={() => setCollapsed(!collapsed)}>
{collapsed ? t('expand_all') : t('collapse_all')}
</button>
)
}
Available Translation Keys:
collapse_all - “Collapse All”
expand_all - “Expand All”
download_pdf - “Download PDF”
toc - “TOC” (Table of Contents)
ai_assistant - “AI Assistant”
login / logout - Authentication labels
thinking - AI thinking indicator
show_more / show_less - Expansion controls
view / create / update / delete - CRUD operations
See the Runtime API for the complete list.
useSiteOverrides
Returns site-specific overrides for the current language.
export interface SiteOverridesItem {
title?: string
logoText?: string
terms?: SiteOverridesTerms
}
export const useSiteOverrides = () => SiteOverridesItem
Site overrides object containing title, logoText, and terms for current language
Example:
import { useSiteOverrides } from 'doom'
function SiteTitle() {
const { title, logoText } = useSiteOverrides()
return (
<header>
<span className="logo">{logoText}</span>
<h1>{title}</h1>
</header>
)
}
Site Overrides Configuration:
Create an overrides.yaml file in your documentation root:
title:
en: My Product Documentation
zh: 我的产品文档
ru: Документация моего продукта
logoText:
en: MyProduct
zh: 我的产品
ru: МойПродукт
terms:
company:
en: Acme Corp
zh: Acme 公司
product:
en: Acme Platform
zh: Acme 平台
Utility Hooks
useIsPrint
Detects if the page is being viewed in print mode or has print query parameter.
export function useIsPrint() => boolean
true if printing or ?print=true query parameter is present
Example:
import { useIsPrint } from 'doom'
function Navigation() {
const isPrint = useIsPrint()
if (isPrint) {
return null // Hide navigation when printing
}
return <nav>{/* navigation items */}</nav>
}
Print Query Detection:
The hook detects:
- CSS print media query:
@media print
- URL query parameter:
?print=true, ?print=1, ?print=yes
Falsy values: ?print=false, ?print=0, ?print=no
useIsPrintQuery
Detects only the print query parameter (not CSS media query).
export function useIsPrintQuery() => boolean
true if ?print=true query parameter is present
Detects only the CSS print media query (not query parameter).
export function useIsPrintMedia() => boolean
true if CSS print media query matches
useInterval
Runs a callback function at regular intervals.
export function useInterval(
callback: () => void,
delay?: number | null
) => void
Function to call at each interval
Interval delay in milliseconds. Pass null to pause the interval
Example:
import { useInterval } from 'doom'
import { useState } from 'react'
function Timer() {
const [seconds, setSeconds] = useState(0)
const [isRunning, setIsRunning] = useState(true)
useInterval(
() => setSeconds(s => s + 1),
isRunning ? 1000 : null
)
return (
<div>
<div>Elapsed: {seconds}s</div>
<button onClick={() => setIsRunning(!isRunning)}>
{isRunning ? 'Pause' : 'Resume'}
</button>
</div>
)
}
Features:
- Automatically cleans up on unmount
- Updates callback without restarting interval
- Pause/resume by passing
null as delay
useMemoizedFn
Creates a memoized function that always uses the latest function reference.
export const useMemoizedFn = <T extends (...args: any[]) => any>(
fn: T
) => T
Memoized version of the function with stable reference
Example:
import { useMemoizedFn } from 'doom'
import { useState, useEffect } from 'react'
function SearchComponent() {
const [query, setQuery] = useState('')
const [results, setResults] = useState([])
// Function reference remains stable across re-renders
const search = useMemoizedFn(async (q: string) => {
const data = await fetch(`/api/search?q=${q}`)
const results = await data.json()
setResults(results)
})
useEffect(() => {
if (query) {
search(query)
}
}, [query]) // 'search' doesn't cause re-runs
return (
<div>
<input value={query} onChange={e => setQuery(e.target.value)} />
<Results items={results} />
</div>
)
}
Use Cases:
- Callbacks passed to child components
- Functions used in
useEffect dependencies
- Event handlers that reference state
- Performance optimization
Advanced Usage
Combining Hooks
import { useLang, useTranslation, useSiteOverrides } from 'doom'
function LocalizedHeader() {
const lang = useLang()
const t = useTranslation()
const { title, terms } = useSiteOverrides()
return (
<header>
<h1>{title || terms?.product}</h1>
<span className="lang">Language: {lang}</span>
<button>{t('download_pdf')}</button>
</header>
)
}
Custom Hooks
Build custom hooks using Doom’s hooks:
import { useLang, useSiteOverrides } from 'doom'
function useLocalizedTerm(termName: string) {
const lang = useLang()
const { terms } = useSiteOverrides()
return terms?.[termName] || termName
}
// Usage
function MyComponent() {
const productName = useLocalizedTerm('product')
return <div>Welcome to {productName}</div>
}
See Also