Hello Juan
Yes, you description is correct. In the process of pinging 192.168.23.1 from R3, both the source and the destination IP addresses are NAT’ed. However, remember that it is always the destination address that is involved in the routing process. The translation of the source address does not affect the routing process.
So since NAT translation takes place first, the destination becomes 192.168.12.1 so the ping reaches R1. R1 responds to the echo request with an echo reply destined for 192.168.12.3. At R2, routing takes place first and because the destination network hangs off of Gi0/1, it never gets NAT translated. So your statement is correct.
The add-route
parameter on the NAT command essentially adds a static route for the outside local address, thus resolving the issue.
I hope this has been helpful!
Laz