I was just trying these examples with a fresh TexLive 2014; I had been using the \let\l@ENGLISH\l@english fix for a while in TexLive 2011 with success, but now with 2014 the same document gave me the dreaded warning:
Package babel Warning: You haven't loaded the language ENGLISH yet
(babel) I'll proceed, but expect unexpected results.
(babel) Reported on input line 38.
This is the example I used, which now compiles in TexLive 2014 without the warning:
\documentclass[english]{IEEEtran}
\usepackage{trace}
% \traceon
\usepackage{babel}
\makeatletter
% \adddialect\l@ENGLISH\l@english
% \global\let\l@ENGLISH\l@english
\let\l@ENGLISH\relax
\show\l@english
\show\l@ENGLISH
\typeout{BABEL TEST:}
\ifx \csname l@english\endcsname\relax
\typeout{l@english here}
\fi
\ifx \csname l@ENGLISH\endcsname\relax
\typeout{l@ENGLISH here}
\fi
\makeatother
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[strict,autostyle]{csquotes}
\usepackage[style=ieee,backend=biber]{biblatex}
\addbibresource{biblatex-examples.bib}
\usepackage{lipsum}
\nocite{*}
\begin{document}
\lipsum[1]
\printbibliography
\end{document}
The weird thing is - in TexLive 2014 versions, the \let\l@ENGLISH\l@english actually triggers the warning to appear. I used trace to scan a bit, and here is an overview:
Eventually, when Latex needs to print a section title it will call \foreignlanguage, e.g.:
\foreignlanguage #1#2->\begingroup \foreign@language {#1}#2\endgroup
#1<-ENGLISH
#2<-\protect \bbl@restore@actives \protect \MakeUppercase {REFERENCES}
{\begingroup}
{entering semi simple group (level 12) at line 29}
In the course of its execution, we eventually come to this conditional, which takes the false branch when \let\l@ENGLISH\l@english is in effect:
\@ifundefined #1->\expandafter \ifx \csname #1\endcsname \relax \expandafter \@
firstoftwo \else \expandafter \@secondoftwo \fi
#1<-\bbl@tempe ENGLISH
{\expandafter}
{\csname}
\bbl@tempe ->l@
{\ifx}
{false}
{\expandafter}
{\fi}
Let's look at \@ifundefined more closely:
\expandafter %
\ifx \csname #1\endcsname \relax %
\expandafter \@firstoftwo %
\else %
\expandafter \@secondoftwo %
\fi
So in this case, the \ifx basically checks if the expanded (see comments below) versions of \l@ENGLISH and \relax are the same; and since \relax is unexpandable (a Tex primitive?), obviously the \ifx will be false for any value of \l@ENGLISH different from \relax, such as \l@english (with contents being just \char"0).
So the solution for TexLive 2014 is either to \let\l@ENGLISH\relax - or, not address it at all (which is a bit strange to me, because in that case, \l@ENGLISH is \shown as undefined [not as the command/macro/token, though], and \ifx doesn't see \relax and \undefined as the same:
? i
insert>\ifx\relax\undefined\typeout{A}\else\typeout{B}\fi
B
)
Well, hope this was it with this problem, then - probably it's time to write another TexLive version conditional (Getting Texlive version in pdflatex?)...
\usepackage[english]{babel}help? – yo' Jan 01 '13 at 20:38