This patch allows to enter utf8-encoded labelstrings in layout files. This makes sense IMO, since labelstrings are no keywords, but only used for GUI display.
OK to go in? BTW, why is layout->labelstring() sometimes used untranslated?
Index: src/support/lstrings.C =================================================================== --- src/support/lstrings.C (Revision 15835) +++ src/support/lstrings.C (Arbeitskopie) @@ -279,6 +279,16 @@ int hexToInt(docstring const & str) } +bool isAscii(docstring const & str) +{ + int const len = str.length(); + for (int i = 0; i < len; ++i) + if (str[i] >= 0x80) + return false; + return true; +} + + char lowercase(char c) { return char(tolower(c)); Index: src/support/lstrings.h =================================================================== --- src/support/lstrings.h (Revision 15835) +++ src/support/lstrings.h (Arbeitskopie) @@ -72,6 +72,9 @@ bool isHex(lyx::docstring const & str); int hexToInt(lyx::docstring const & str); +/// is \p str pure ascii? +bool isAscii(docstring const & str); + /// char lowercase(char c); Index: src/lyxlayout.C =================================================================== --- src/lyxlayout.C (Revision 15835) +++ src/lyxlayout.C (Arbeitskopie) @@ -451,17 +451,17 @@ bool LyXLayout::read(LyXLex & lexrc, LyX case LT_LABELSTRING: // label string definition if (lexrc.next()) - labelstring_ = lyx::from_ascii(trim(lexrc.getString())); + labelstring_ = trim(lexrc.getDocString()); break; case LT_ENDLABELSTRING: // endlabel string definition if (lexrc.next()) - endlabelstring_ = lyx::from_ascii(trim(lexrc.getString())); + endlabelstring_ = trim(lexrc.getDocString()); break; case LT_LABELSTRING_APPENDIX: // label string appendix definition if (lexrc.next()) - labelstring_appendix_ = lyx::from_ascii(trim(lexrc.getString())); + labelstring_appendix_ = trim(lexrc.getDocString()); break; case LT_LABELCOUNTER: // name of counter to use Index: src/buffer_funcs.C =================================================================== --- src/buffer_funcs.C (Revision 15835) +++ src/buffer_funcs.C (Arbeitskopie) @@ -43,8 +43,6 @@ #include "support/fs_extras.h" #include "support/lyxlib.h" -#include <iostream> - #include <boost/bind.hpp> #include <boost/filesystem/operations.hpp> @@ -348,6 +346,18 @@ bool needEnumCounterReset(ParIterator co } +docstring const translateLabel(Buffer const & buf, docstring const & label) +{ + if (support::isAscii(label)) + // Probably standard layout, try to translate + return buf.B_(to_ascii(label)); + else + // This must be a user defined layout. We can not translate + // this, since gettext accepts only ascii keys. + return label; +} + + // set the label of a paragraph. This includes the counters. void setLabel(Buffer const & buf, ParIterator & it) { @@ -468,8 +478,7 @@ void setLabel(Buffer const & buf, ParIte int number = counters.value(from_ascii("bibitem")); if (par.bibitem()) par.bibitem()->setCounter(number); - // FIXME UNICODE - par.params().labelString(buf.B_(to_ascii(layout->labelstring()))); + par.params().labelString(translateLabel(buf, layout->labelstring())); // In biblio should't be following counters but... } else if (layout->labeltype == LABEL_SENSITIVE) { // Search for the first float or wrap inset in the iterator @@ -495,16 +504,14 @@ void setLabel(Buffer const & buf, ParIte s = bformat(_("%1$s #:"), buf.B_(fl.name())); } else { // par->SetLayout(0); - // FIXME UNICODE - s = buf.B_(to_ascii(layout->labelstring())); + s = translateLabel(buf, layout->labelstring()); } par.params().labelString(s); } else if (layout->labeltype == LABEL_NO_LABEL) par.params().labelString(docstring()); else - // FIXME UNICODE - par.params().labelString(buf.B_(to_ascii(layout->labelstring()))); + par.params().labelString(translateLabel(buf, layout->labelstring())); } } // anon namespace @@ -596,9 +603,9 @@ docstring expandLabel(Buffer const & buf { LyXTextClass const & tclass = buf.params().getLyXTextClass(); - // FIXME UNICODE - docstring fmt = buf.B_(to_ascii(appendix ? layout->labelstring_appendix() - : layout->labelstring())); + docstring fmt = translateLabel(buf, appendix ? + layout->labelstring_appendix() : + layout->labelstring()); // handle 'inherited level parts' in 'fmt', // i.e. the stuff between '@' in '@[EMAIL PROTECTED]'