Usage / Keybinds / BLOC Format / FAQ / How It Works
Common questions and answers about PicoShot Localization system.
PicoShot Localization is a lightweight, high-performance localization system for Unity games. It uses a custom binary format (BLOC) for fast loading and supports 100+ languages with automatic RTL (Right-to-Left) text handling.
Yes! The package is open-source and licensed under MIT License. You can use it in both personal and commercial projects.
Unity 2022.3 (LTS) and higher.
Add via Unity Package Manager:
https://github.com/PicoShot/Localization-Unity.git?path=/Package
Language files (.bloc) are stored in the Locales folder at your project root (next to Assets folder). The system creates this automatically.
Yes, TextMeshPro is required for the UI components. It's included with Unity by default.
- Open Language Editor (
Tools > Localization > Language Editor) - Go to the "Languages" tab
- Check the checkbox next to your desired language
- Click Save
Option 1: Manual Translation
- Open Language Editor
- Create keys in the "Keys" tab
- Add translations for each language
Option 2: DeepL Translation
- Get a DeepL API key
- Enter it in Settings tab
- Select a key and press
Ctrl + T
Yes! Use {0}, {1}, etc. in your translation text:
// Translation: "Hello, {0}! You have {1} coins."
LocalizationManager.GetText("welcome", "Player", "100");
// Result: "Hello, Player! You have 100 coins."string systemLang = LocalizationManager.DetectSystemLanguage();
LocalizationManager.SetLanguage(systemLang);- Arabic (
ar) - Hebrew (
he) - Persian/Farsi (
fa) - Pashto (
ps) - Urdu (
ur) - Yiddish (
yi) - Dari (
prs) - Kurdish (Sorani) (
ckb)
Yes! When you switch to an RTL language, text is automatically processed for proper display. The RtlTextHandler.Fix() method handles character shaping and bidirectional text.
The text is handled automatically, but you may want to adjust UI layout (anchors, pivots) for a better RTL experience. See the RTL Layout Adjustment example in the Usage Guide.
Yes! BLOC format offers:
- 50-70% smaller file sizes
- O(1) lookups - direct access, no parsing
- String deduplication - reduces memory usage
- Optional compression - even smaller files
The system uses:
- One language loaded at a time in memory
- Fallback language cached for missing keys
- Array cache for repeated
GetArray()calls - Minimal overhead for the component bindings
Yes, languages are loaded on-demand when you call SetLanguage(). Only the current language and fallback are kept in memory.
- Make sure you've saved your languages in the Language Editor
- Check that
.blocfiles exist in theLocalesfolder - Verify the folder is at project root (same level as Assets)
- Check that the key exists (case-sensitive)
- Verify the language file has the translation
- Check
LocalizationManager.IsInitialized - Look for errors in the console
- Verify your API key in Settings tab
- Check your DeepL account has available credits
- Ensure you have internet connection
- Look for error messages in console
- Make sure you're using a font that supports Arabic/Hebrew characters
- Check that TextMeshPro font asset includes the glyphs
- Verify the language code is correct
Yes! Enable protection in the config:
- Set Protection Mode to "Anti-Tamper" or "Both"
- Build your project
- Hash verification will check file integrity at runtime
The system supports any ISO language code. Add custom languages by:
- Using the language code in your translation files
- Adding display names to
LanguageDefinitions(optional)
The system loads from files at startup. To update:
- Replace the
.blocfile - Call
LocalizationManager.Initialize()to reload
The current version loads from local files. For Addressables support, you would need to:
- Download the
.blocfile to theLocalesfolder - Call
LocalizationManager.RefreshAvailableLanguages() - Then switch language
- Check the Usage Guide for detailed API documentation
- Review the BLOC Format specification
- See Keybinds for editor shortcuts
- Open an issue on GitHub for bugs or feature requests