The \ifthenelse test does a token-based comparison. Thus when you do
\documentclass{article}
\usepackage{ifthen}
\newcommand{\foo}[1]{%
\ifthenelse{\equal{#1}{\string german}}
{TRUE}
{FALSE}%
}
\begin{document}
\foo{german}
\end{document}
what happens is that \string is applied to the first token it sees, in this case a g. Comparing the two results, they are not the same: one has one non-letter then five letters, the second has six letters. Typesetting those two cases is different: g with category code 12 ('other') typesets the same glyph as g with category code 11 ('letter'), so the two look the same.
There are various approaches to doing true 'string' comparisons in TeX. With a modern TeX engine, by far the easiest is to use \pdfstrcmp or equivalent:
\documentclass{article}
\usepackage{pdftexcmds}
\makeatletter
\newcommand\foo[1]{%
\ifnum\pdf@strcmp{\unexpanded{#1}}{german}=0 %
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{TRUE}
{FALSE}%
}
\makeatother
\begin{document}
\foo{german}
\end{document}
This does do a string comparison, ignoring category codes. If you want to stick with \ifthenelse but can assume e-TeX then
\documentclass{article}
\usepackage{ifthen}
\newcommand{\foo}[1]{%
\ifthenelse{\equal{\detokenize{#1}}{\detokenize{german}}}
{TRUE}
{FALSE}%
}
\begin{document}
\foo{german}
\end{document}
will work as \detokenize makes its entire argument into a string.
Another approach without needing anything other than classical TeX primitives is to use something like
\documentclass{article}
\usepackage{pdftexcmds}
\makeatletter
\newcommand\foo[1]{%
\begingroup
\def\@tempa{#1}%
\@onelevel@sanitize\@tempa
\def\@tempb{german}%
\@onelevel@sanitize\@tempb
\ifx\@tempa\@tempb
\aftergroup\@firstoftwo
\else
\aftergroup\@secondoftwo
\fi
\endgroup
{TRUE}
{FALSE}%
}
\makeatother
\begin{document}
\foo{german}
\end{document}
using the fact that \@onelevel@sanitize also converts things to strings.
Of course, if you know that the input will be something sensible, there's no real need to use any detokenization at all
\documentclass{article}
\usepackage{ifthen}
\newcommand{\foo}[1]{%
\ifthenelse{\equal{#1}{german}}
{TRUE}
{FALSE}%
}
\begin{document}
\foo{german}
\end{document}
\stringhere? That gives a catcode-12 ('other')gand then catocde-11 ('letter')erman. I have a feeling you are imagining that the two arguments are the same just because the letters look identical when you typeset them. – Joseph Wright Aug 08 '14 at 15:56xstringpackage for example – Aug 08 '14 at 16:41\equalas#1. – egreg Aug 08 '14 at 17:21