<html><body>
<p><font size="2" face="sans-serif">Hi, all</font><br>
<br>
<font size="2" face="sans-serif">When fault happens, the REST API response messages will contain a string as an explanation. Currently, the string of explanation is translated based on server side locale. I got a new requirement: to translate REST API response messages based on the requested language from client side.</font><br>
<br>
<font size="2" face="sans-serif">For example, if the client is in China and sends a request with a parameter "Accept-Language: zh-CN</font><font size="2" face="sans-serif">" in HTTP header, the explanation in the REST API response should be translated into Chinese. If the client is in France and sends a request with a parameter "Accept-Language: fr-FR</font><font size="2" face="sans-serif">" in header, the explanation in the REST API response should be translated into French. </font><font size="2" face="sans-serif">Regardless of the response messages translation, the log in server side will be translated based on server side locale setting.</font><br>
<br>
<font size="2" face="sans-serif">In order to fulfil this request, I think, the most difficult thing is to separate the logic of LOG and API response. Because currently, the API response will be written to the LOG exactly as it is. (Refer to ResourceExceptionHandler.__exit__(self, ex_type, ex_value, ex_traceback) in </font><font size="2" color="#000080" face="sans-serif">Nova/nova/api/openstack/wsgi.py</font><font size="2" face="sans-serif">) But I need the response message in the language specified by client, and the LOG in the language specified by server locale.</font><br>
<br>
<font size="2" face="sans-serif">I have two solutions for this requirement.</font><br>
<br>
<font size="2" face="sans-serif">One is to maintain a map between server locale translation and client requested translation in gettextutils.py. When raising a webob.exc.HTTPException, still use the server locale translation as the explanation, which will be written to log. When composing the response JSON message (Refer to Fault.__call__(self, req) in </font><font size="2" color="#000080" face="sans-serif">Nova/nova/api/openstack/wsgi.py</font><font size="2" face="sans-serif">), get the client requested translation from the map and put it in the response JSON object.</font><br>
<br>
<font size="2" face="sans-serif">The other is to remove log writing from API response logic, which means, removing the log statements in ResourceExceptionHandler.__exit__(self, ex_type, ex_value, ex_traceback) in </font><font size="2" color="#000080" face="sans-serif">Nova/nova/api/openstack/wsgi.py</font><font size="2" face="sans-serif">. </font><font size="2" face="sans-serif">Add explicit LOG statement before raising a webob.exc.HTTPException. For example:</font><br>
<br>
<font size="2" face="sans-serif">msg = _('Invalid is_public filter [%s]') % req.params['is_public']  </font><br>
<font size="2" face="sans-serif">raise webob.exc.HTTPBadRequest(explanation=msg)                     </font><br>
<br>
<font size="2" face="sans-serif">will be changed to:</font><br>
<br>
<font size="2" face="sans-serif">msg = _gettext('Invalid is_public filter [%s]')</font><br>
<font size="2" face="sans-serif">LOG.error(_(msg) % req.params['is_public'])</font><br>
<font size="2" face="sans-serif">raise webob.exc.HTTPBadRequest(explanation=_(msg,req.get_accept_language()) % req.params['is_public']) </font><br>
<br>
<font size="2" face="sans-serif">Method _gettext(string) will do nothing to the string, just for string extraction. Method _(msg) will be changed to accept the second parameter _(msg, locale).</font><br>
<br>
<font size="2" face="sans-serif">Please let me know your opinion to these two solutions. Which one do you prefer? Or do you have better solutions?</font><br>
<br>
<font size="2" face="sans-serif">Regards<br>
Ying Chun Guo (Daisy)<br>
China Standards and Open Source Team<br>
Emerging Technology Institute (ETI)<br>
IBM China Development Lab<br>
Tel:(86-10)82453491<br>
Email: guoyingc@cn.ibm.com<br>
Address: 1F Tower B, Diamond Building 19 Zhongguancun Software Park, <br>
8 Dongbeiwang West Road, Haidian District, Beijing, P.R.C.100193</font></body></html>