EFG AfroMarket — B2B Marketplace Platform
A worldwide B2B marketplace connecting African suppliers with buyers, spanning supplier, buyer, local-administrator and platform-operator surfaces. My scope was the supplier mobile app and the platform's six-language localization layer.

Case study
How this was built, in the order I'd walk someone through it.
- 01
Problem
AfroMarket connects suppliers across Africa with buyers worldwide, and the platform side of that already existed as web dashboards. The gap was the supplier: someone who is often mobile-first, frequently not an English speaker, and who needs to register, list, respond to buyer inquiries and watch their orders from a phone. An English-only web dashboard was not going to reach them.
- 02
Users
Suppliers (the app I built)Buyers (web)Local administrators (web)Platform super admin (web) - 03
Architecture
A Flutter client for iOS and Android talking to the platform's REST API — the same backend behind the web buyer, supplier and super-admin dashboards. Localization is Flutter's own `AppLocalizations` codegen over structured ARB files, one per locale.
- 04
My responsibility
The supplier-side mobile app and the localization layer across the whole app. Delivered as a production-ready handover — the client publishes it.
- 05
One important feature
Six languages, including right-to-left Arabic
English, French, Spanish, Arabic, Swahili and Hausa. Arabic is the one that matters technically: it isn't a string swap but a full directional flip — navigation drawer slides from the right, chevrons reverse, icon and label order mirrors, and every layout has to hold up under both directions.
- 06
How it works internally
Copy lives in structured ARB files keyed by meaning rather than by screen, so a shared label is translated once and reused, and no string is left hard-coded in a widget. Flutter's codegen turns those into a typed `AppLocalizations` accessor, which means a missing key is a build error rather than a blank space discovered in production. Directionality is derived from the active locale rather than set per widget, so RTL propagates through the tree instead of needing per-screen handling. Language selection sits in the drawer and applies immediately across the app.
- 07
Challenge
RTL is where localization stops being translation and becomes layout engineering. Anything positioned with a hard-coded left or right — padding, alignment, a trailing chevron, an avatar beside a name — is correct in five languages and visibly broken in the sixth. And it degrades quietly: nothing crashes, it just looks wrong to exactly the users you can't easily get feedback from.
- 08
How I solved it
I worked in direction-relative terms throughout — start/end rather than left/right — so mirroring falls out of the framework instead of being hand-maintained per screen, and reviewed every screen in Arabic as a first-class pass rather than a final check. Keying ARB entries by meaning kept the translation surface small enough that six locales stayed maintainable as screens changed.
- 09
Trade-off
Six locales is a real ongoing tax: every new string is six edits and a re-translation before the feature can ship, which slows feature work down measurably. For a marketplace whose entire value is cross-border reach, shipping a feature late in six languages beats shipping it early in one — but it is a genuine cost, and on a product with a narrower audience I would not pay it.
- 10
What I learned
Design the localization architecture before writing the second screen, not after the tenth. Retro-fitting direction-awareness is a per-widget audit across the whole app; building on start/end primitives from the start makes RTL close to free. I also came away treating language as part of the product surface rather than a setting — for these users it decides whether the app is usable at all.
Screens
Platform super admin (web)
The wider platform the supplier app plugs into — countries, administrators, suppliers, farmers, buyers and orders across the marketplace.
Buyer dashboard (web)
The other side of the trade: RFQs, orders, shipments and trade documents.
Supplier dashboard (web)
The desktop counterpart to the app I built — same supplier, same data, different surface.

