RORK LABJP
PLAY — Google Play's target API level 36 requirement took effect yesterday, August 31. From today, new apps and updates must target Android 16VISIBILITY — Apps still on API 35 stay listed but disappear for users on newer Android versions. No error is raised; new installs simply fade, which makes the change easy to missEXTENSION — If you missed the deadline, an extension through November 1, 2026 can be requested in Play Console — best filed alongside a concrete migration planAPPLE — On the Apple side, the event lands September 9 and iOS 27 is reported to ship September 14. Testing generated apps on iOS 27 hardware before release week is time well spentEXPO — Expo released expo-paste-input on August 28, a native module that brings image, GIF, and sticker paste to React Native TextInputEAS — EAS Observe reached general availability on August 20, putting crash and performance monitoring on the same EAS platform as builds and updatesPLAY — Google Play's target API level 36 requirement took effect yesterday, August 31. From today, new apps and updates must target Android 16VISIBILITY — Apps still on API 35 stay listed but disappear for users on newer Android versions. No error is raised; new installs simply fade, which makes the change easy to missEXTENSION — If you missed the deadline, an extension through November 1, 2026 can be requested in Play Console — best filed alongside a concrete migration planAPPLE — On the Apple side, the event lands September 9 and iOS 27 is reported to ship September 14. Testing generated apps on iOS 27 hardware before release week is time well spentEXPO — Expo released expo-paste-input on August 28, a native module that brings image, GIF, and sticker paste to React Native TextInputEAS — EAS Observe reached general availability on August 20, putting crash and performance monitoring on the same EAS platform as builds and updates
Articles/Dev Tools
Dev Tools/2026-03-29Intermediate

Multilingual Rork App Guide — Going Global with i18n Setup and Google Translate API

Complete guide to implementing multilingual support (i18n) for Rork apps. Learn React Native/Expo language setup, Google Translate API integration, and App Store/Google Play metadata localization.

multilinguali18n2Google Translate APIglobal expansion3React Native234

With Gemini's live translation capabilities expanding globally, the demand for multilingual support in mobile applications has never been higher. If you're planning to expand your Rork app to international markets, implementing proper i18n (internationalization) is no longer optional—it's essential.

This guide walks you through the complete multilingual implementation workflow for Rork apps built on React Native and Expo. From basic locale configuration to integrating Google Translate API and localizing App Store/Google Play metadata, you'll find practical implementation patterns throughout.

Basic i18n Setup in Rork Apps

The foundation of multilingual support begins with establishing a robust language management system within your app. For React Native/Expo projects, react-i18next has become the de facto standard.

Installing and Configuring react-i18next

npm install i18next react-i18next expo-localization

On app startup, the system automatically detects the device's language settings and loads the corresponding language file.

import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import * as Localization from 'expo-localization';
import ja from './locales/ja.json';
import en from './locales/en.json';
 
const getLanguage = () => {
  const locale = Localization.getLocales()[0];
  const lang = locale?.languageCode || 'en';
  return lang === 'ja' ? 'ja' : 'en';
};
 
i18n
  .use(initReactI18next)
  .init({
    resources: { ja: { translation: ja }, en: { translation: en } },
    lng: getLanguage(),
    fallbackLng: 'en',
    interpolation: { escapeValue: false },
  });
 
export default i18n;

Language File Structure (ja.json / en.json)

Japanese (ja.json):

{
  "welcome": "ようこそ",
  "appTitle": "Rork アプリ",
  "features": {
    "search": "検索機能",
    "filter": "フィルタリング"
  },
  "button": {
    "submit": "送信",
    "cancel": "キャンセル"
  }
}

English (en.json):

{
  "welcome": "Welcome",
  "appTitle": "Rork App",
  "features": {
    "search": "Search Feature",
    "filter": "Filtering"
  },
  "button": {
    "submit": "Submit",
    "cancel": "Cancel"
  }
}

Using translation keys in components:

import { useTranslation } from 'react-i18next';
 
export const HomeScreen = () => {
  const { t, i18n } = useTranslation();
 
  return (
    <View>
      <Text>{t('welcome')}</Text>
      <Button
        title={t('button.submit')}
        onPress={() => console.log(i18n.language)}
      />
    </View>
  );
};

Automatic Locale Detection and Fallback Strategy

Expo's expo-localization automatically retrieves locale information from system settings. If an unsupported language is detected, the fallback mechanism ensures the app remains stable and usable.

const supportedLanguages = ['ja', 'en'];
const deviceLanguage = Localization.getLocales()[0]?.languageCode || 'en';
const appLanguage = supportedLanguages.includes(deviceLanguage)
  ? deviceLanguage
  : 'en';
 
i18n.changeLanguage(appLanguage);

Google Cloud Translation API v3 Integration

When you need to translate user-generated content (reviews, chat messages, etc.) in real-time, Google Cloud Translation API v3 provides a robust solution.

API Setup Process

  1. Create a new project in Google Cloud Console
  2. Enable the Translation API
  3. Download the service account key as JSON
  4. Securely store the private key in your backend infrastructure

Implementation Example for Rork Apps

Keep the API key on your backend—never expose it in client code. Your Rork app communicates with a backend API that handles all translation requests.

Backend (Node.js + Express):

const translate = require('@google-cloud/translate').v3;
const projectId = 'YOUR_PROJECT_ID';
const translationClient = new translate.TranslationServiceClient();
 
app.post('/api/translate', async (req, res) => {
  const { text, targetLanguage } = req.body;
 
  try {
    const request = {
      parent: translationClient.locationPath(projectId, 'global'),
      contents: [text],
      targetLanguageCode: targetLanguage,
      sourceLanguageCode: 'ja',
    };
 
    const [response] = await translationClient.translateText(request);
    const translatedText = response.translations[0].translatedText;
    res.json({ result: translatedText });
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
});

React Native Client:

const translateText = async (text, targetLang) => {
  try {
    const response = await fetch('https://your-backend.com/api/translate', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({
        text: text,
        targetLanguage: targetLang,
      }),
    });
 
    const data = await response.json();
    return data.result;
  } catch (error) {
    console.error('Translation failed:', error);
    return null;
  }
};

Caching Strategy with AsyncStorage

Making API calls for frequently translated text wastes bandwidth and increases latency. AsyncStorage provides an effective caching mechanism.

import AsyncStorage from '@react-native-async-storage/async-storage';
 
const getCachedTranslation = async (key, targetLang) => {
  const cacheKey = `translation_${key}_${targetLang}`;
  return await AsyncStorage.getItem(cacheKey);
};
 
const cacheTranslation = async (key, targetLang, translation) => {
  const cacheKey = `translation_${key}_${targetLang}`;
  await AsyncStorage.setItem(cacheKey, translation);
};
 
const translateWithCache = async (text, targetLang) => {
  const cached = await getCachedTranslation(text, targetLang);
  if (cached) return cached;
 
  const translated = await translateText(text, targetLang);
  if (translated) {
    await cacheTranslation(text, targetLang, translated);
  }
  return translated;
};

Advanced Localization with Gemini API

Google Gemini API goes beyond simple translation. It can provide context-aware rephrasing and cultural adaptation, enabling features like dialect-specific content generation or region-sensitive messaging within your Rork app.

const generateLocalizationWithGemini = async (text, targetCulture) => {
  const prompt = `Adapt the following text for ${targetCulture} cultural context:\nText: "${text}"`;
 
  // Call Gemini API via backend
  // (Details omitted for brevity)
};

Localizing App Store and Google Play Metadata

Once your app supports multiple languages internally, you must also configure metadata (app name, description, keywords) for each language on both platforms.

  • App Store Connect: Set localized "App Name," "Subtitle," "Keywords," and "Support URL" for each language
  • Google Play Console: Enter "Short Description," "Full Description," "Title," and "Keywords" in each supported language

SEO strategies differ by region, so consider having native speakers review translations rather than relying on machine translation alone.

Wrapping up

Taking your Rork app to international markets requires more than translation. You must implement a proper i18n framework, integrate Google Translate API, establish caching strategies, and localize App Store/Google Play metadata. These elements work together to create a seamless experience for users worldwide.

Start with two languages, gather user feedback, and incrementally expand to new markets. With thoughtful attention to these details, your Rork app can reach audiences far beyond your home market. Refer to professional localization guides and language resources as you scale your multilingual initiative.

Share

Thank You for Reading

Rork Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $15 for lifetime access
View Membership →

If you found this article helpful, a small tip ($1.50) would mean a lot to us. Your support helps keep this site ad-free and covers server and hosting costs.

Related Articles

Dev Tools2026-09-01
Adding image paste with expo-paste-input, and moving the disappearing file:// URIs out of cache
How to let users paste images and GIFs into a chat input with expo-paste-input. The URIs that onPaste hands you are temporary files that can vanish before the user hits send. Here is the relocation code and the order I verify it on real devices.
Dev Tools2026-08-31
Three Minutes After the Screen Locked, My expo-audio Ambient Sound Went Silent
Why expo-audio stops playing when the screen locks, diagnosed as three separate layers: build config, audio session, and lock screen integration. The three-minute stop on Android is documented behavior.
Dev Tools2026-08-24
I Moved My Dark Mode Checks Into DevTools, and Only Four Places Still Need a Real Device
Expo SDK 57 added light and dark emulation to React Native DevTools, which ended my trips to the Settings app. What it swaps is the value JavaScript reports, so a few places still need a real toggle. Here is how to find that boundary in your own project.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →