We give a unified framework to treat the following problem. Let (L_1, ..., L_n) → f(L_1, ..., L_n) be an operation on languages. Given monoids recognizing the languages L_1, ..., L_n, give an explicit construction of a monoid recognizing f(L_1, ..., L_n). Our method gives in particular a simple way to prove that an operation preserves rational languages. The scope of our method is quite broad and goes from classical operations such as union, intersection, concatenation, quotient, shuffle, inverse and direct morphisms, etc., to less classical ones such as infiltration, Dyck reduction, longest common prefix, Straubing's counting, etc. It includes also questions that are not expressed directly as operations on languages, as, for example, Reutenauer's theorem on TOL-systems. The key idea of our construction is to consider an operation as the inverse of a transduction.