Hi Stephan,
Now, being the pain in the neck that I am, I wonder whether solving
the above via a hypothetic
newStr = oldStr.searchAndReplace("$object$", whatever);
would generally be useful. In general, some searchAndReplace would
not work at least in the following two scenarios:
[...]
So, *is* there need for rtl::OUString searchAndReplace?
IMO, no. Especially as I think we wanted to make the OUString const
anyway? AFAIK, the only method that modifies an OUString is operator+.
We should think about removing that and exploit the fact that
OUStrings can never change.
The hypothetical
newStr = oldStr.searchAndReplace("$object$", whatever);
would leave oldStr unchanged (I did not mention that explicitly).
Sorry, stupid me. Although you didin't mention it, it is quite obvious.
I was mislead by the word "replace".
BTW, replacing strings in resources usually means using the tools
String rather than OUString, anyway. So, this would be another
argument for an external helper function that may be offered for both
string types (calling a single implementation).
Although I would vote for an easy-to-use interface. The typical case
is replacing one substring. For this I would like to write a single
(suitably short ;-) ) line of code.
...which is probably hampered by the fact that there is not a single
(well-engineered, see above) convention for such placeholders in
resource strings, but various different ones.
Well, maybe we should decide about a common convention for this. I don't
know if it is wise to open the discussion on this topic again, and at
this place, but I think it would make sense to have a common style
especially for translators.
My last information about recommendations for placeholders is to use
%PLACEHOLDER which I consider worse than the $(PLACEHOLDER) I used
before, because the boundaries of the variable name are clearer. (the
expression "$(FOO)bar" would be %FOObar in the other style, which is
ambiguous. Well, also not very common, though.)
But, OTOH do we really need the function to take care of the format of
variables? We don't want a grammar parser, just replacing strings. And I
don't consider the case of quoted strings that look like variables a use
case. Are there examples for this?
(Usually I have something like "%OBJECT is selected" where "is selected"
is translated. And I don't think this phrase will be translated into
"%OBJECT" in any language on the world).
Imagine this piece of code:
// replace number
OUString aResString( String( ::chart::ResId( STR_MYRESSTR )));
const OUString aReplacementStr( RTL_CONSTASCII_USTRINGPARAM("%NUM"));
with this code replacing the variable:
// current solution
sal_Int32 nIndex = aResString.indexOf( aReplacementStr );
if( nIndex != -1 )
aResult = String( aResString.replaceAt(
nIndex, aReplacementStr.getLength(),
String::CreateFromInt32( nMyNumber )));
It would be nice to have this, at least as a first step:
// better solution
aResult = ::some_namespace::replaceString(
aResString, aReplacementStr, String::CreateFromInt32( nMyNumber ));
I don't think we need to have this as a method at the OUString (the
interface is already quite big).
Or maybe
bool bDidWork = ::some_namespace::replaceString(
aResString, aReplacementStr, String::CreateFromInt32( nMyNumber ));
which gets aResString as an in/out parameter and returns if the
replacement was successful. But I don't know what you would usually want
to do in case this does not work. Well, mabye an assertion violation
message.
* Would it help to allow passing just "NUM" in the example and the
helper adds the "%" or "$(" / ")" ? I don't think so.
* Would it be necessary to replace more than one variable at once? I
also don't think so.
* Is it a requirement to avoid replacing a quoted phrase that is no
variable but only look like one?
So, keep it simple.
(In contrast to this mail, sorry ;-) )
-Bjoern
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]