From 7e7d28a0cad1f383e814b9384024e3049fa47c1c Mon Sep 17 00:00:00 2001 From: Georg Baum Date: Sat, 11 Nov 2006 12:00:34 +0000 Subject: [PATCH] Make it possible to uses non-ascii labelstring, endlabelstring and labelstring_appendix in layout files * src/text2.C (LyXText::setLayout): Translate labelwidthstring for paragraph (LyXText::getStringToIndex): labelwidthstring is now a docstring * src/buffer.[Ch] (Buffer::translateLabel): New method for translating a label if it is not already translated by the user in the layout file * src/lyxtext.h (setParagraph): labelwidthstring is now a docstring * src/support/lstrings.[Ch] (bool isAscii): New utility function: Determine whether a docstring contains only pure ascii * src/text3.C (LyXText::dispatch): setParagraph() now takes a docstring * src/lyxlayout.C (LyXLayout::read): Don't use from_ascii when reading labelstring_, endlabelstring_ and labelstring_appendix_ * src/buffer_funcs.C (setLabel): labelwidthstring is now a docstring (setLabel): Use Buffer::translateLabel instead of Buffer::B_ to translate labels (expandLabel): ditto git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@15855 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/buffer.C | 12 ++++++++++++ src/buffer.h | 2 ++ src/buffer_funcs.C | 19 +++++++------------ src/lyxlayout.C | 6 +++--- src/lyxtext.h | 2 +- src/support/lstrings.C | 10 ++++++++++ src/support/lstrings.h | 3 +++ src/text2.C | 7 +++---- src/text3.C | 5 ++--- 9 files changed, 43 insertions(+), 23 deletions(-) diff --git a/src/buffer.C b/src/buffer.C index 5e359daab3..ffd9fa74c0 100644 --- a/src/buffer.C +++ b/src/buffer.C @@ -1445,6 +1445,18 @@ docstring const Buffer::B_(string const & l10n) const } +docstring const Buffer::translateLabel(docstring const & label) const +{ + if (support::isAscii(label)) + // Probably standard layout, try to translate + return 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; +} + + bool Buffer::isClean() const { return pimpl_->lyx_clean; diff --git a/src/buffer.h b/src/buffer.h index f30c83d8ab..280fc05c8d 100644 --- a/src/buffer.h +++ b/src/buffer.h @@ -170,6 +170,8 @@ public: Language const * getLanguage() const; /// get l10n translated to the buffers language docstring const B_(std::string const & l10n) const; + /// translate \p label to the buffer language if possible + docstring const translateLabel(docstring const & label) const; /// int runChktex(); diff --git a/src/buffer_funcs.C b/src/buffer_funcs.C index a203b62fee..94a018aa22 100644 --- a/src/buffer_funcs.C +++ b/src/buffer_funcs.C @@ -43,8 +43,6 @@ #include "support/fs_extras.h" #include "support/lyxlib.h" -#include - #include #include @@ -376,7 +374,7 @@ void setLabel(Buffer const & buf, ParIterator & it) if (layout->margintype == MARGIN_MANUAL) { if (par.params().labelWidthString().empty()) - par.setLabelWidthString(layout->labelstring()); + par.setLabelWidthString(buf.translateLabel(layout->labelstring())); } else { par.setLabelWidthString(docstring()); } @@ -468,8 +466,7 @@ void setLabel(Buffer const & buf, ParIterator & it) 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(buf.translateLabel(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 +492,14 @@ void setLabel(Buffer const & buf, ParIterator & it) s = bformat(_("%1$s #:"), buf.B_(fl.name())); } else { // par->SetLayout(0); - // FIXME UNICODE - s = buf.B_(to_ascii(layout->labelstring())); + s = buf.translateLabel(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(buf.translateLabel(layout->labelstring())); } } // anon namespace @@ -596,9 +591,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 = buf.translateLabel(appendix ? + layout->labelstring_appendix() : + layout->labelstring()); // handle 'inherited level parts' in 'fmt', // i.e. the stuff between '@' in '@Section@.\arabic{subsection}' diff --git a/src/lyxlayout.C b/src/lyxlayout.C index f54d8145e9..b81ea99425 100644 --- a/src/lyxlayout.C +++ b/src/lyxlayout.C @@ -451,17 +451,17 @@ bool LyXLayout::read(LyXLex & lexrc, LyXTextClass const & tclass) 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 diff --git a/src/lyxtext.h b/src/lyxtext.h index 6094893653..4f07d21dac 100644 --- a/src/lyxtext.h +++ b/src/lyxtext.h @@ -260,7 +260,7 @@ public: void setParagraph(LCursor & cur, Spacing const & spacing, LyXAlignment align, - std::string const & labelwidthstring, + docstring const & labelwidthstring, bool noindent); /* these things are for search and replace */ diff --git a/src/support/lstrings.C b/src/support/lstrings.C index 3f97e9202e..939d48531b 100644 --- a/src/support/lstrings.C +++ b/src/support/lstrings.C @@ -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)); diff --git a/src/support/lstrings.h b/src/support/lstrings.h index b0016bf846..16288e6f44 100644 --- a/src/support/lstrings.h +++ b/src/support/lstrings.h @@ -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); diff --git a/src/text2.C b/src/text2.C index 7dcc542d63..28c7cf93de 100644 --- a/src/text2.C +++ b/src/text2.C @@ -352,7 +352,7 @@ void LyXText::setLayout(Buffer const & buffer, pit_type start, pit_type end, for (pit_type pit = start; pit != end; ++pit) { pars_[pit].applyLayout(lyxlayout); if (lyxlayout->margintype == MARGIN_MANUAL) - pars_[pit].setLabelWidthString(lyxlayout->labelstring()); + pars_[pit].setLabelWidthString(buffer.translateLabel(lyxlayout->labelstring())); } } @@ -604,7 +604,7 @@ docstring LyXText::getStringToIndex(LCursor const & cur) void LyXText::setParagraph(LCursor & cur, Spacing const & spacing, LyXAlignment align, - string const & labelwidthstring, bool noindent) + docstring const & labelwidthstring, bool noindent) { BOOST_ASSERT(cur.text()); // make sure that the depth behind the selection are restored, too @@ -628,8 +628,7 @@ void LyXText::setParagraph(LCursor & cur, else params.align(align); } - // FIXME UNICODE - par.setLabelWidthString(from_ascii(labelwidthstring)); + par.setLabelWidthString(labelwidthstring); params.noindent(noindent); } } diff --git a/src/text3.C b/src/text3.C index 649f9067ae..20c7e7fdd5 100644 --- a/src/text3.C +++ b/src/text3.C @@ -1411,7 +1411,7 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd) } setLayout(cur, tclass.defaultLayoutName()); - setParagraph(cur, Spacing(), LYX_ALIGN_LAYOUT, string(), 0); + setParagraph(cur, Spacing(), LYX_ALIGN_LAYOUT, docstring(), 0); insertInset(cur, new InsetFloatList(to_utf8(cmd.argument()))); cur.posRight(); } else { @@ -1455,11 +1455,10 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd) lex.setStream(is); ParagraphParameters params; params.read(lex); - // FIXME UNICODE setParagraph(cur, params.spacing(), params.align(), - to_ascii(params.labelWidthString()), + params.labelWidthString(), params.noindent()); cur.message(_("Paragraph layout set")); break;