O Crystal Reports é uma poderosa ferramenta de desenvolvimento de relatórios que vem juntamente com o visual studio desde a versão X, juntamente com  algumas biblioteca que contém objetos para manipularmos:  ordenação, fontes de dados, e etc nos relatórios e também para provermos a visualização desses relatório através do programa para usuário, um desse objetos é o  controle CrystalReportViewer utilizado para apresentação  dos relatórios, nele já temos um navegador e alguma opções de exportação e é utilizado pela maioria dos desenvolvedores que utilizam relatório crystal em aplicações .net, mas os texto em inglês do visualizador pode ser um problema para alguma pessoas, pois não é aceitavel em algumas organizações(como a que eu trabalho por exemplo), e não encontrei até hoje pelo menos, uma forma muito ortodoxa de se fazer a tradução desses textos, então nesse artigo vou dar um exemplo do que poderia ser feito. As implementações estão em c#.

No Visual Studio escolha File->New->Project e escolha o template para Windows Forms.

Vá para o designer do form Criado e expanda a Tool Box se você está com vs 2008 ou 2010 professional(no caso do 2010 o crystal tem que ser baixado separadamente) haverá uma seção rotulada como “Reporting” , escolha o controle CrystalReportViewer e arraste para o form.

Feito isso compile o projeto uma vez e veja que todos ToolTip dos Itens na parte superior estarão em inglês, assim como a nomeclatura da aba principal que estará escrito “Main Report”, o drop down “Zoom” terá também alguns itens em inglês.

Certo, agora vamos criar o método para fazer a tradução, ficará assim:

private void TraduzirCRV(CrystalReportViewer Cntl)

        {

            foreach (Control Ctl in Cntl.Controls)

            {

                #region Dicionario

                //Aqui está o dicionário para fazer a trudução, para quem quiser o texto em portugues que vai permanecer é só alterar aqui.

                Dictionary<string, string> Traducoes = new Dictionary<string, string>();

                Traducoes.Add("Export Report", "Exportar");

                Traducoes.Add("Print Report", "Imprimir");

                Traducoes.Add("Refresh", "Atualizar");

                Traducoes.Add("Toggle Parameter Panel", "Invisible");

                Traducoes.Add("Toggle Group Tree", "Invisible");

                Traducoes.Add("Go to First Page", "Primeira página");

                Traducoes.Add("Go to Previous Page", "Página anterior");

                Traducoes.Add("Go to Next Page", "Próxima página");

                Traducoes.Add("Go to Last Page", "Última página");

                Traducoes.Add("Go to Page", "Ir para página");

                Traducoes.Add("Find Text", "Procurar");

                Traducoes.Add("Zoom", "Zoom");

                Traducoes.Add("Close Current View", "Fechar");

                Traducoes.Add("Page Width", "Largura da página");

                Traducoes.Add("Whole Page", "Página Inteira");

                Traducoes.Add("Customize...", "Customizar...");

                Traducoes.Add("Current Page No.", "Nr. página atual");

                Traducoes.Add("Total Page No.", "Nr. Total páginas");

                Traducoes.Add("Zoom Factor", "Nível de zoom");

                #endregion Dicionario

 

                #region TraduzindoItens

                //Alterando o texto da tabpage principal(Onde está escrito Main Report).

                if (Ctl.GetType() == typeof(PageView))

                    try

                    {

                        ((TabControl)Ctl.Controls[0]).TabPages[0].Text = "Relatório";

                    }

                    catch {

                    }

 

                //Alterando o texto dos componente que ficam na barra superior.

                else if (Ctl.GetType() == typeof(System.Windows.Forms.ToolStrip))

                {

 

 

                    foreach (ToolStripItem Ti in ((ToolStrip)Ctl).Items)

                    {

                        if (Ti.ToolTipText != null)

                        {

                            Ti.ToolTipText = Traducoes[Ti.ToolTipText];

 

                            //Aqui eu escondo dois itens da barra superior que no meu contexto são irrelevantes    o que mostra uma barra com os parametros

                            // e o que mostra uma treeview com os grupos do relatório.

                            if (Ti.ToolTipText == "Invisible")

                            {

                                Ti.Visible = false;

                            }

                            //Aqui traduzindo os itens dentro do dropdown Zoom.

                            else if (Ti.ToolTipText == "Zoom" && Ti.GetType() ==typeof(ToolStripDropDownButton))

                            {

                                string[,] ItensDD = new string[30, 4];

                                foreach (ToolStripItem TiF in ((ToolStripDropDownButton)Ti).DropDownItems)

                                {

                                    try

                                    {

                                        TiF.Text = Traducoes[TiF.Text];

                                    }

                                    catch

                                    {

 

                                    }

                                }

                            }

                        }

                    }

 

                }

                //Alterando os textos da status bar

                else if (Ctl.GetType() == typeof(StatusBar))

                {

                    foreach (StatusBarPanel StBrPnl in ((StatusBar)Ctl).Panels)

                    {

                        string Texto = StBrPnl.Text.Substring(0, StBrPnl.Text.IndexOf(":"));

                        StBrPnl.Text = StBrPnl.Text.Replace(Texto, Traducoes[Texto]);

                    }

                }

                #endregion TraduzindoItens

 

            }

        }

Agora crie o evento load do form(pode ser criado clicando duas vezes no formulário) chamando esse método recém criado.

private void Form1_Load(object sender, EventArgs e)

        {

            TraduzirCRV(crystalReportViewer1);

        }

Pronto agora é só compilar novamente e conferir o resultado, espero ter ajudado, abraços!