പുതുതായി പുറത്തിറക്കിയ ഒരു Cache-Control analyzer-ന്റെ ഇംഗ്ലീഷ് പതിപ്പിൽ ജാപ്പനീസ് ഭാഷയിലുള്ള ടെക്സ്റ്റ് ആണ് കാണിച്ചത്—അതിന്റെ സ്റ്റാറ്റസ് “Fresh” എന്നതിന് പകരം “新鮮” എന്നായിരുന്നു. പേജിൽ ഇംഗ്ലീഷ് ലേബലുകൾ മാത്രമേ നൽകിയിട്ടുള്ളൂ എങ്കിലും, പങ്കിട്ട ലോജിക് (shared logic) ഹാർഡ്-കോഡഡ് ജാപ്പനീസ് സ്ട്രിംഗുകൾ നൽകിയതാണ് ഈ തെറ്റിന് കാരണം.

ഡെവലപ്പർ ഭാരം കുറഞ്ഞ (lightweight) ഒരു കൂട്ടം ബ്രൗസർ ടൂളുകളാണ് നിർമ്മിക്കുന്നത്. ഇവയിൽ ഓരോന്നിനും ഇംഗ്ലീഷ് പേജും ജാപ്പനീസ് പേജും ഉണ്ട്, ഇവ രണ്ടും ഒരേ പാഴ്സിംഗ് ഫംഗ്ഷനുകളും കോർ ലോജിക്കും ആണ് ഉപയോഗിക്കുന്നത്. കാണുന്ന വാക്കുകളിൽ മാത്രമേ വ്യത്യാസം ഉണ്ടാകാവൂ. Cache-Control analyzer പുറത്തിറങ്ങിയപ്പോൾ, ഇംഗ്ലീഷ് ഇന്റർഫേസ് ശരിയായ ലേബലുകൾ കാണിച്ചുവെങ്കിലും, അത് കാണിച്ച മൂല്യങ്ങൾ ലോജിക് ലെയറിൽ നിന്നുള്ളതായിരുന്നു, അതിൽ ഇപ്പോഴും ജാപ്പനീസ് ലിറ്ററലുകൾ അടങ്ങിയിരിക്കുകയായിരുന്നു. കൺസോൾ എററുകൾ ഒന്നും വന്നില്ല; പേജ് സാധാരണ പോലെ തന്നെ തോന്നി, എങ്കിലും ഇംഗ്ലീഷ് സംസാരിക്കുന്ന ഉപയോക്താക്കൾക്ക് ലഭിച്ച വിവരങ്ങൾ തെറ്റായിരുന്നു.

എന്തുകൊണ്ടാണ് പങ്കിട്ട ലോജിക് (shared logic) വിവർത്തനത്തെ വഞ്ചിക്കുന്നത്

ഒരു ഡിസൈൻ തീരുമാനത്തിൽ നിന്നാണ് ഈ ബഗ് ഉണ്ടായത്: എന്താണ് കാണിക്കേണ്ടതെന്ന് തീരുമാനിക്കുന്ന കോർ ഫംഗ്ഷൻ ജാപ്പനീസ് ഭാഷയിലുള്ള ലിറ്ററൽ സ്ട്രിംഗുകളാണ് നൽകിയിരുന്നത്. ചുറ്റുമുള്ള ഇംഗ്ലീഷ് ടെക്സ്റ്റിന് ഉത്തരവാദിത്തമുള്ള പേജ് ലെയറിന് ആ മൂല്യങ്ങൾ മാറ്റാൻ അവസരം ലഭിച്ചില്ല. ലോജിക്കും യുഐയും (UI) കൃത്യമായി വേർതിരിച്ചിരുന്നതിനാൽ, ടെസ്റ്റിംഗിനിടെ ഈ പ്രശ്നം ശ്രദ്ധയിൽപ്പെട്ടില്ല—സാങ്കേതികമായി എല്ലാം ശരിയായി പ്രവർത്തിക്കുന്നുണ്ടായിരുന്നു, എങ്കിലും ഉപയോക്താക്കൾക്ക് കാണുന്ന ഭാഷ തെറ്റായിരുന്നു.

ഇതിന്റെ ദോഷം എന്തെന്നാൽ, പങ്കിട്ട മോഡ്യൂളിനുള്ളിൽ ഉപയോഗിക്കുന്ന ഭാഷ അത് ഉപയോഗിക്കുന്ന എല്ലാ ഫ്രണ്ട്-എൻഡുകൾക്കും ഡിഫോൾട്ട് ആയി മാറുന്നു എന്നതാണ്. മറ്റൊരു ഭാഷ ആവശ്യമാണെങ്കിൽ, ആ ഡിഫോൾട്ട് മൂല്യം ഒരു മറഞ്ഞിരിക്കുന്ന ബഗ് ആയി മാറുന്നു.

പരിഹാരം: കീകൾ, പാക്കുകൾ, ഒരു സുരക്ഷാ വലയും

കാര്യങ്ങൾ വേർതിരിക്കുന്നതിനായി (separate concerns) ഡെവലപ്പർ ആർക്കിടെക്ചർ പുനർനിർമ്മിച്ചു:

  • മെസ്സേജ് പാക്കുകൾ (Message packs) ഇപ്പോൾ ഓരോ ഭാഷയ്ക്കും വേണ്ട എല്ലാ മനുഷ്യർക്ക് വായിക്കാവുന്ന സ്ട്രിംഗുകളും സൂക്ഷിക്കുന്നു.
  • പങ്കിട്ട ലോജിക് (Shared logic) ഇനി സിംബോളിക് കീകൾ (symbolic keys) മാത്രമേ നൽകുന്നുള്ളൂ, ഒരിക്കലും നേരിട്ടുള്ള ടെക്സ്റ്റ് നൽകില്ല.
  • പേജുകൾ (Pages) കീ ഉപയോഗിച്ച് ബന്ധപ്പെട്ട പാക്കിൽ നിന്ന് അനുയോജ്യമായ വാക്ക് കണ്ടെത്തുന്നു.

ഒരു സന്ദേശത്തിൽ ഒരു നമ്പർ ഉൾപ്പെടുത്തേണ്ടി വരുമ്പോൾ, പുതിയ കോഡ് ടെംപ്ലേറ്റ് സ്ട്രിംഗുകൾക്ക് പകരം ഒരു ചെറിയ ഫംഗ്ഷൻ ഉപയോഗിക്കുന്നു. ഇത് ഓരോ ഭാഷയ്ക്കും വാചക ക്രമത്തിലെ വ്യത്യാസങ്ങൾക്കനുസരിച്ച് നമ്പർ എവിടെ വരണമെന്ന് തീരുമാനിക്കാൻ അനുവദിക്കുന്നു.

ഒരു ലളിതമായ സ്റ്റാറ്റിക് അനാലിസിസ് (static-analysis) ഘട്ടവും ഇതിനോടൊപ്പം ചേർത്തു: ബിൽഡ് പ്രക്രിയ പങ്കിട്ട ഫയലുകളിൽ ജാപ്പനീസ് അക്ഷരങ്ങൾ ഉണ്ടോ എന്ന് പരിശോധിക്കുന്നു. ഏതെങ്കിലും കണ്ടാൽ ഡെവലപ്പർക്ക് ഉടൻ തന്നെ അറിയിപ്പ് ലഭിക്കും, ഇത് ഹാർഡ്-കോഡഡ് ആയ വിദേശ ഭാഷാ ടെക്സ്റ്റുകൾ വീണ്ടും വരുന്നത് തടയുന്നു.

ഈ അനുഭവം ഡെവലപ്പറെ എന്താണ് പഠിപ്പിച്ചത്

  1. വിവർത്തനം ഒരു റിവ്യൂ പാസ് ആയി പ്രവർത്തിക്കുന്നു. ഇംഗ്ലീഷ് സന്ദേശങ്ങൾ എഴുതുന്നതിനിടയിൽ, ചില ജാപ്പനീസ് പദപ്രയോഗങ്ങൾ അവ്യക്തമാണെന്ന് ഡെവലപ്പർ ശ്രദ്ധിച്ചു. വിവർത്തനം ചെയ്തതോടെ രണ്ട് ഭാഷകളിലും കൂടുതൽ വ്യക്തമായ വാചകങ്ങൾ ഉപയോഗിക്കാൻ സാധിച്ചു.
  2. സ്ട്രിംഗുകൾ തിരികെ നൽകുന്ന പങ്കിട്ട ഫംഗ്ഷനുകൾ എല്ലാവർക്കും ഒരു ഭാഷ തന്നെ നിശ്ചയിക്കുന്നു. ഒരു ഫംഗ്ഷൻ ഭാഷ തീരുമാനിക്കുകയാണെങ്കിൽ, മറ്റൊരു ഭാഷ പ്രതീക്ഷിക്കുന്ന ഏതൊരു ഉപയോക്താവിനും ആ തെറ്റ് പകരമായി ലഭിക്കുന്നു. ഇത് ഒരു യുഐ (UI) പിശകല്ല; മറിച്ച് ഒരു ലോജിക് പിശകാണ്.

ബഹുഭാഷാ ടൂളുകൾ കൈകാര്യം ചെയ്യുന്നവർക്കുള്ള നിർദ്ദേശങ്ങൾ

  • കോർ ഫംഗ്ഷനുകളിൽ നിന്ന് സ്ട്രിംഗുകൾക്ക് പകരം കീകൾ നൽകുക. ലോക്കലൈസേഷൻ കൈകാര്യം ചെയ്യാൻ യുഐ ലെയറിനെ അനുവദിക്കുക.
  • അല്ലെങ്കിൽ ആവശ്യമുള്ള സ്ട്രിംഗുകൾ പാരാമീറ്ററുകളായി ഫംഗ്ഷനിലേക്ക് നൽകുക. ഇത് ലോജിക് ഭാഷയെ ആശ്രയിക്കാത്ത രീതിയിൽ നിലനിർത്തുന്നു.
  • പങ്കിട്ട മോഡ്യൂളുകളിൽ ഹാർഡ്-കോഡഡ് ആയ പ്രാദേശിക ഭാഷാ ടെക്സ്റ്റുകൾ ഉണ്ടോ എന്ന് പരിശോധിക്കുക. നോൺ-ASCII അക്ഷരങ്ങൾക്കായി വേഗത്തിൽ തിരയുന്നത് മറഞ്ഞിരിക്കുന്ന പ്രശ്നങ്ങൾ കണ്ടെത്താൻ സഹായിക്കും.
  • പങ്കിട്ട കോഡിൽ വിദേശ ഭാഷാ അക്ഷരങ്ങൾ ഉണ്ടോ എന്ന് പരിശോധിക്കാൻ ബിൽഡ്-ടൈം ചെക്ക് (build-time check) ചേർക്കുക. റിലീസ് ചെയ്തതിന് ശേഷമുള്ള ആശയക്കുഴപ്പത്തേക്കാൾ നല്ലത് നേരത്തെയുള്ള കണ്ടെത്തലാണ്.

ഇനി ശ്രദ്ധിക്കേണ്ട കാര്യങ്ങൾ

പ്രധാന പാഠം: നിങ്ങളുടെ പ്രോജക്റ്റിൽ വിവിധ ഭാഷാ പതിപ്പുകൾക്കായി കോഡ് പങ്കിടുന്നുണ്ടെങ്കിൽ, പങ്കിട്ട ഭാഗം ഒരിക്കലും വാചകങ്ങൾ തീരുമാനിക്കില്ലെന്ന് ഉറപ്പാക്കുക. ഓരോ പേജും അതിന്റെ സ്വന്തം വാക്കുകൾ നൽകട്ടെ, അപ്പോൾ ഒരു ഇംഗ്ലീഷ് പേജ് അബദ്ധവശാൽ ജാപ്പനീസ് സംസാരിക്കുന്ന അവസ്ഥ ഒഴിവാക്കാം.