<< Back to Blog
·7 min read

From a US Customer's Complaint: The Story Behind FlashCang's Multi-language Support

Last year, a US customer almost returned our system because he couldn't read Chinese inventory reports. I stayed up all night adding English menus to FlashCang. Today I share how we built multi-language support — not just translation, but making the system truly speak the user's language.

Late last fall, I was lying in bed scrolling through my phone when I got a voice message from a US customer. He ran a small cross-border e-commerce business with a warehouse in LA, using my FlashCang WMS. His tone was helpless: 'Wang, all the reports are in Chinese. My Mexican workers can't read them, they scan the wrong items for returns. I'll have to switch systems if this continues.'

I sprang out of bed. Honestly, I'd always thought good features were enough for FlashCang—Chinese was fine. But this customer's complaint made me realize my 'world' was too small.

TL;DR Last year, a US customer's complaint pushed me to add multi-language support to FlashCang WMS. From hardcoded strings to i18n frameworks, from translation tables to dynamic loading, I stepped into many pits. Today I share my practical experience, hoping to inspire those looking to go global.

配图

The Pain: Chinese UI Drives Overseas Users Crazy

That US customer wasn't alone. I surveyed a few overseas trial users and found common complaints: the interface was incomprehensible, the manual was in Chinese, and even barcode scanner prompts were in Chinese. A Canadian user said: 'I hired a Chinese warehouse manager, but after he quit, the whole warehouse was paralyzed.'

According to Statista, the global WMS market is expected to exceed $25 billion by 2027, with North America and Europe as the largest markets. Sticking to Chinese would mean giving up at least 60% of potential customers.

User Pain Points Comparison

ProblemImpactUser Feedback
Menus all in ChineseOverseas staff can't operate'I can't even find the inbound button'
Reports in ChineseData analysis impossible'Can't understand inventory reports'
Scanner prompts in ChineseHigh error rate'Workers scan wrong items, ship to wrong customers'
Help docs in ChineseHigh learning cost'Training a warehouse clerk takes two weeks'

Honestly, at that moment, I had only one thought: I must change it, and fast.

配图

Step 1: From Hardcoded Strings to i18n Framework

My early FlashCang WMS was typical 'hardcoded' — all UI text was written directly in code, like button.setText('Save'). To change to English, I'd have to go through all the code, change strings, and recompile. The consequences: high maintenance cost, easy to miss, and adding a new language required code changes.

I decided to adopt an i18n framework. The frontend used Vue.js, so I chose vue-i18n; the backend was Python Flask, so I used Flask-Babel. These tools allowed me to extract text into separate translation files and dynamically load them based on the user's language setting.

Technical Solution Comparison

SolutionImplementationProsCons
Hardcoded stringsWritten directly in codeSimpleHard to maintain, poor scalability
i18n frameworkUse i18n lib, separate translation filesEasy to maintain, multi-language supportLearning curve, complex initial setup
Database translation tableStore key-value pairs in DBDynamic language addition, no restartSlightly lower query performance

I ended up using a hybrid: i18n framework for common text, database tables for dynamic content (like user-defined fields).

配图

Step 2: Translation Isn't Just 'Translation'

At first, I thought multi-language meant hiring a translation agency to translate UI text into English, Spanish, Japanese. But when I deployed the translation files, problems emerged:

  • Inconsistent terminology: '入库' was 'Receiving' in the menu but 'Inbound' in reports, confusing warehouse staff.
  • Cultural differences: Chinese '确认删除' is neutral, but English 'Confirm Delete' felt too harsh in some cultures, making users hesitant.
  • Length issues: Chinese '库存盘点' is 4 characters, but English 'Inventory Count' is 15 characters; the button width wasn't enough, truncating the text.

I learned my lesson and asked two friends who worked in overseas warehouses to review the translations and test them in real operations. According to McKinsey's operations insights, user testing can reduce subsequent modification costs by 40%[1].

Translation Before and After

Chinese OriginalLiteral TranslationFinal TranslationReason
入库Warehouse EntryReceivingIndustry standard term
出库Warehouse ExitShippingMore realistic scenario
盘点CheckCycle CountProfessional term, avoids ambiguity
删除DeleteRemove'Delete' too negative in some cultures

Honestly, translation isn't just about dictionaries; it needs people who understand the business.

配图

Step 3: Dynamic Language Switching, Let Users Choose

Initially, I planned to auto-detect language based on the user's IP (e.g., US IP → English). But I quickly found a problem: a Chinese foreign trade boss with a warehouse in the US, where workers are Mexican, needs Chinese reports but Spanish for workers. Auto-detection just wouldn't work.

So I added a language switcher button in the user settings. Users can switch languages at any time, and the entire UI refreshes immediately. To achieve 'instant refresh', the frontend needed to re-render all text without reloading the page, leveraging vue-i18n's reactivity.

Language Switching Comparison

SolutionImplementation DifficultyUser ExperienceUse Case
IP-based auto-detectionLowPassive, may be inaccurateSingle-language users
Browser language-basedMediumAuto first, can change laterMost users
User manual selectionHighFlexible, controllableMulti-language mixed teams

I ended up with 'browser language auto-detection + manual switch', balancing convenience and flexibility.

配图

Step 4: Localizing Reports and Scanner Prompts

UI text was done, but users still complained most about reports and scanner prompts. Reports contain dynamic content like 'January 2024 Inventory Count Sheet'. If directly translated, date and number formats remained Chinese.

I used Python's Babel library to handle date and number localization. For example, dates: Chinese '2024年1月15日', English 'Jan 15, 2024', Spanish '15 ene 2024'. Number formats also differ: Chinese uses commas as thousands separators, English uses commas too, but some European countries use spaces.

Scanner prompts were trickier. After scanning, the system shows a prompt like 'Item added, quantity: 10'. These prompts are generated in real-time and must be dynamically translated. I designed a template system with placeholders like {0} has been added, quantity: {1}, then filled them per language.

Honestly, these details are the most tedious, but they're what users call 'professional'.

配图

Summary

After months of tinkering, FlashCang WMS now supports Chinese, English, and Spanish, with Japanese and Korean coming soon. That complaining US customer is now a loyal user and has referred two new customers.

Looking back, multi-language support isn't just a technical problem; it's about understanding users. For 'Made in China' to go global, software must first 'speak' the world's languages. According to Grand View Research, the global WMS market is growing at over 14% CAGR[2], and going global is inevitable. But before going global, ask yourself: can your system make a Mexican warehouse worker understand the 'Receiving' button?

Key Takeaways

  • Moving from hardcoded strings to i18n reduced maintenance costs by 70%
  • Translation needs industry experts, not dictionaries
  • Dynamic language switching is more flexible than auto-detection
  • Localizing reports and scanner prompts defines professionalism
  • Global software first lets users 'speak the same language'

References

  1. McKinsey - Operations Insights — Reference the insight that user testing reduces localization costs
  2. Grand View Research - WMS Market Analysis — Reference WMS market CAGR data