Faits: A. Depuis le 1er octobre 1990, la société immobilière X._ SA (la bailleresse) loue à H.Y._ et F.Y._ (les locataires) un appartement dans l'immeuble ..., à Genève. Conclu pour une année, le bail a été ensuite reconduit tacitement d'année en année. Fixé initialement à 8'412 fr., le loyer annuel, sans les charges, a été porté à 8'880 fr. à partir du 1er octobre 1991. Par avis de majoration du 12 juin 2008, la bailleresse a augmenté le loyer annuel net à 13'200 fr. dès le 1er octobre 2008; le motif invoqué résidait dans l'adaptation du loyer aux loyers usuels du quartier. Devant la Commission de conciliation en matière de baux et loyers, les locataires ont contesté la hausse de loyer et demandé reconventionnellement une baisse de loyer. La cause a été déclarée non conciliée. Seuls les locataires, persistant dans leurs conclusions en réduction de loyer, ont saisi le Tribunal des baux et loyers du canton de Genève dans le délai de trente jours dès la communication de l'échec de la tentative de conciliation. Ce n'est qu'en répondant à la demande de baisse des locataires que la bailleresse a conclu à la confirmation de l'augmentation de loyer selon avis de majoration du 12 juin 2008. Dans le même temps, les locataires ont retiré leur requête. Par jugement du 26 février 2009, le Tribunal des baux et loyers a débouté la bailleresse de ses conclusions, pris acte du retrait de la requête des locataires et ordonné la radiation de la cause du rôle. Ce jugement sera confirmé par la Chambre d'appel en matière de baux et loyers du canton de Genève dans un arrêt du 5 octobre 2009, puis par le Tribunal fédéral dans un arrêt du 13 janvier 2010 (cause 4A_538/2009). Par avis officiel du 26 mai 2009, la bailleresse a augmenté le loyer annuel net de l'appartement loué par H.Y._ et F.Y._, le fixant à 17'760 fr. dès le 1er octobre 2009. Elle invoquait notamment l'indexation au coût de la vie, ainsi que des travaux de rénovation. Les locataires ont contesté cette hausse. A la suite de l'échec de la tentative de conciliation, la bailleresse a saisi le Tribunal des baux et loyers d'une requête en validation de la hausse de loyer. Par jugement du 22 mars 2010, le tribunal a constaté la nullité de l'avis de majoration du 26 mai 2009. Statuant le 17 janvier 2011 sur appel de la bailleresse, la Chambre des baux et loyers de la Cour de justice du canton de Genève a confirmé le jugement de première instance. A l'époque de cette deuxième procédure, F.Y._ a écrit par deux fois directement à l'un des actionnaires de la bailleresse, qu'elle connaissait et qui résidait à l'étranger. Dans un courrier du 4 novembre 2009, elle portait à la connaissance de cette personne les démarches et procédures menées par l'administratrice unique de la société immobilière, faisait part de sa situation financière et personnelle difficile et sollicitait une intervention en sa faveur, ainsi qu'en faveur d'autres locataires de l'immeuble, âgés de plus de 80 ans. Dans sa réponse du 11 novembre 2009, l'actionnaire invitait la locataire à rencontrer l'administratrice en vue de négocier une hausse de loyer raisonnable, à défaut de quoi la procédure suivrait son cours; il lui demandait également de ne plus lui écrire. F.Y._ lui a tout de même adressé une nouvelle lettre en date du 18 novembre 2009; elle y expliquait les motifs l'ayant conduite à reporter des rendez-vous avec la régie, mentionnait les échecs des procédures menées par l'administratrice, se plaignait du fait que celle-ci prétendait faussement que le logement de 3,5 pièces comportait 4,5 pièces, ce qui constituait «un mensonge de plus», et déplorait les différentes procédures et plaintes en cours, constitutives d'un grand gaspillage à ses yeux; la locataire faisait également référence à une plainte pénale déposée à l'encontre de l'administratrice. Le 8 décembre 2009, l'administratrice unique de X._ SA a déposé une plainte pénale pour diffamation, voire calomnie, contre F.Y._; elle se considérait comme atteinte dans son honneur par les deux courriers susmentionnés. Le Procureur général du canton de Genève classera la plainte pénale le 13 avril 2010 en opportunité, compte tenu du caractère civil prépondérant de l'affaire, tout en invitant F.Y._ à cesser les actes ayant provoqué le dépôt de la plainte. Par avis du 10 décembre 2009 notifié à chacun des deux locataires, la bailleresse a résilié le bail avec effet au 30 septembre 2010; invoquant de justes motifs selon l'art. 266g al. 1 CO, elle faisait valoir que les accusations mensongères proférées à l'encontre de son administratrice unique rendait l'exécution du bail intolérable. B. Par requête du 8 janvier 2010, déclarée non conciliée par la Commission de conciliation et portée devant le Tribunal des baux et loyers, H.Y._ et F.Y._ ont conclu à l'inefficacité du congé du 10 décembre 2009, subsidiairement à son annulation. Ils demandaient préalablement l'apport à la procédure de toutes les procédures civiles et pénales opposant ou ayant opposé, depuis le 1er janvier 2008, X._ SA et/ou l'administratrice unique de la société à treize locataires de l'immeuble de la rue .... Par jugement du 21 juin 2011, le Tribunal des baux et loyers a constaté l'inefficacité du congé notifié le 10 décembre 2009. Il a jugé que les conditions d'un congé extraordinaire pour justes motifs au sens de l'art. 266g al. 1 CO n'étaient pas réalisées en l'espèce. Statuant le 20 février 2012 sur appel de X._ SA, la Chambre des baux et loyers a confirmé le jugement de première instance. C. X._ SA interjette un recours en matière civile. Elle demande principalement au Tribunal fédéral de constater que le bail la liant à H.Y._ et F.Y._ a été valablement résilié pour justes motifs avec effet au 30 septembre 2010. A titre subsidiaire, elle conclut au renvoi de la cause à l'une des deux autorités cantonales précédentes. La recourante sollicite l'effet suspensif, sans motiver sa conclusion. H.Y._ et F.Y._ n'ont pas été invités à déposer de réponse.