We could have the API: (foreign-error:message ferr [language [country]]) -> string or #f That makes all the following work easily: (foreign-error:message ferr) ; any locale (foreign-error:message ferr 'en) ; any English (foreign-error:message ferr 'en 'gb) ; British English The message procedure given to `make-foreign-error` would then take two arguments which may be #f: (lambda (language country) ...)