The scenario
You just switched to Fedora and opened your favorite terminal or text editor. You type a few characters, switch to the Chinese Pinyin layout, and nothing happens. The candidate window never appears. Or maybe you installed the Japanese Mozc engine, but the system keeps falling back to plain ASCII. You check the keyboard settings, see the layout listed, and the desktop environment shows it correctly. The underlying input method daemon has not been told to activate it. This happens more often than you think. The package is installed, the layout is registered, but the bridge between your keystrokes and the application is missing.
How input methods actually work on Fedora
Fedora does not ship with every language engine preinstalled. The base system includes a minimal keyboard layout set to keep the initial footprint small. When you add a complex script like CJK, you are not just adding a keyboard mapping. You are installing an input method editor. An IME sits between your keystrokes and the application. It buffers your input, runs it through a dictionary or prediction model, and outputs the final characters.
Think of it like a translator at a conference. The audience speaks English. The speaker speaks Japanese. The translator listens to the raw syllables, matches them against a mental dictionary, and whispers the correct Japanese phrases to the speaker. If the translator is missing, or if the conference organizer never hired them, the speaker just hears noise. On Fedora, the organizer is the input method framework. The translator is the language engine. You need both, and you need to tell the framework which translator to use.
The framework communicates with applications through environment variables and a system bus. GTK applications look for GTK_IM_MODULE. Qt applications look for QT_IM_MODULE. Terminal emulators and older X11 apps look for XMODIFIERS. If these variables point to the wrong framework, or if they are empty, the application ignores the IME entirely. The framework also registers itself on the D-Bus session bus. This allows the desktop environment to show the tray icon, handle layout switching, and persist your preferences across reboots.
Check the environment variables before you reinstall packages. Run echo $GTK_IM_MODULE $QT_IM_MODULE $XMODIFIERS in your terminal. If they are empty, your session never loaded the framework configuration. Log out and back in. Do not guess.
Install and activate the framework
Fedora defaults to IBus for most desktop sessions. IBus is modular. The core daemon handles the communication with applications. The language engines are separate packages. You must install the core, the specific engine, and then register IBus as the active framework.
Here is how to install the core framework and the three most common CJK engines in one transaction.
sudo dnf install ibus ibus-libpinyin ibus-mozc ibus-hangul
# ibus provides the daemon and GTK Qt integration libraries
# ibus-libpinyin handles Chinese Pinyin with modern prediction
# ibus-mozc provides Google Japanese engine with cloud fallback
# ibus-hangul covers Korean Hangul and Hanja conversion
The package manager will pull in dependencies like ibus-gtk3, ibus-gtk4, and ibus-qt5. These are the bridges that let graphical applications talk to the daemon. If you skip them, terminal emulators work fine, but desktop apps like LibreOffice or Firefox will ignore your IME. Fedora updates these bindings frequently. Run dnf upgrade --refresh weekly to keep the bridges aligned with the desktop environment.
Once the packages are installed, you must tell the session managers to use IBus. The im-config tool writes the necessary environment variables to your user profile.
im-config -n ibus
# -n sets the active input method framework name
# this writes /etc/X11/xinit/xinputrc for system wide defaults
# it updates ~/.xprofile and ~/.xinputrc for your user session
# it ensures GTK_IM_MODULE and QT_IM_MODULE point to ibus
After running that command, restart the IBus daemon so it picks up the new engines.
ibus restart
# kills the existing daemon and spawns a fresh instance
# the new process scans /usr/lib/ibus/ for available engines
# it registers them with the D-Bus session bus
# it loads the default configuration from ~/.config/ibus/
Log out and log back in. The environment variables only apply to new sessions. Running ibus restart alone updates the daemon, but your shell and desktop environment still need the fresh variables. Trust the session boundary. Manual exports in .bashrc drift and break when you switch desktop environments.
Register the layout and configure hotkeys
The framework is active. Now you need to register the specific layout. You can do this through the GUI or the command line. The GUI is faster for most users. Open Settings, navigate to Region and Language, and click the plus button under Input Sources. Search for Chinese, Japanese, or Korean. Select the variant that matches your installed engine. For Chinese, pick Pinyin. For Japanese, pick Mozc. For Korean, pick Hangul.
If you prefer the terminal, localectl handles input source registration directly. It reads the same configuration files the GUI uses, so both methods are identical under the hood.
localectl set-x11-input-model pc105
localectl set-x11-input-layout us,cm
localectl set-x11-input-variant ,pinyin
# first command sets the base keyboard model for hardware
# second command adds Chinese cm alongside US English
# third command specifies the Pinyin variant for the Chinese layout
# commas separate multiple layouts and their variants
The localectl approach requires you to know the exact layout codes. The GUI pulls these from the same XML database, but it hides the codes behind friendly names. Pick whichever matches your workflow.
Toggle between layouts using Super + Space. The system tray icon will show the current layout abbreviation. If you need to change the hotkey, open ibus-setup from your terminal. The configuration window lets you remap the trigger, adjust the candidate window position, and enable or disable specific engines. Save your changes and restart the daemon.
Run ibus-setup before you edit config files by hand. The GUI writes the correct XML structure and validates the hotkey against system defaults. Manual edits often break the D-Bus registration.
Verify the setup
Open a plain text editor or a terminal. Press Super + Space until the indicator shows your target language. Type a few syllables. You should see a candidate window appear below the cursor. Press Enter to commit the character. Press Space to cycle through alternatives. Press Escape to discard the buffer.
If you are on Wayland, verify the environment variables are set correctly in your current session.
echo $GTK_IM_MODULE $QT_IM_MODULE $XMODIFIERS
# expected output: ibus ibus @im=ibus
# if any variable is empty, log out and back in
# missing variables cause applications to ignore the IME
# Wayland compositors respect these variables for client apps
Run this check before blaming the engine. Half the time the problem is a stale session, not a broken package. Verify the daemon is running with systemctl --user status ibus-daemon.service. Look for Active: active (running). If it says failed, check the journal with journalctl --user -u ibus-daemon.service -n 20. Read the actual error before guessing.
Common pitfalls and error patterns
The candidate window never appears. This usually means the application is not talking to IBus. Check the environment variables first. If they are correct, verify the daemon is running. Some applications, especially Electron-based apps or flatpaks, sandbox their environment variables. Flatpaks need the ibus portal or explicit permission overrides. Run flatpak override --user --env=GTK_IM_MODULE=ibus com.your.app if the IME is missing inside a sandboxed application.
Another common issue is the fallback font. You can type the characters, but they render as empty squares. The system has the input method, but it lacks the glyphs. Install a comprehensive CJK font package.
sudo dnf install google-noto-sans-cjk-fonts
# provides Noto Sans CJK SC TC HK JP and KR
# covers Simplified Chinese Traditional Chinese Japanese and Korean
# installs to /usr/share/fonts/ and updates the font cache
# ensures your terminal and browser can render the output
Run fc-cache -fv if the squares persist. The font cache sometimes lags behind package installations. Restart your text editor afterward. Do not edit files in /usr/lib/ibus/. Those files belong to the packages. If you need to override a dictionary or change a hotkey, copy the configuration to ~/.config/ibus/ or ~/.local/share/ibus/. User directories take precedence. Package updates will overwrite /usr/lib/ changes without warning.
If you see [FAILED] Failed to start ibus-daemon.service during login, your D-Bus session is likely blocked by a conflicting framework. Check if fcitx or xim is still active. Run im-config -n ibus again and reboot. Conflicting frameworks fight for the same environment variables and crash each other.
Choose your input framework
Fedora ships with IBus by default. Some users prefer Fcitx or Fcitx5. The choice depends on your desktop environment and your tolerance for manual configuration.
Use IBus when you want a framework that integrates automatically with GNOME and KDE. Use Fcitx5 when you run a tiling window manager or a lightweight desktop like XFCE. Use the system default when you only need basic CJK support and want zero maintenance. Stick with IBus if you are switching from Ubuntu or Debian. Switch to Fcitx5 if you need advanced cloud prediction or custom skin support.